中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
编写丰富多彩的CEdit控件
作者:未知 时间:2003-06-10 12:12 出处:Blog 责编:chinaitpower
              摘要:编写丰富多彩的CEdit控件

     VC++提供的标准控件和类库已经非常丰富,但是有时候它们还是无法很好的满足我们的需求,这里举CEdit为例.
   
我们需要过滤部分输入字符(比如仅限数字输入),很多网友推荐采用派生的方法:重载CEditOnChar()函数.这个方法比其他的确简洁明了,又做到了细化和可维护性原则.但是,我们还会碰到一种情况:采用派生也无法达到需求.比如:彩色的Caret和相应颜色的字符选中背景,限定字符输入,自动格式化字符串,任意制定EditBox的大小,任意制定字体,垂直方向居中等需求.无计可施之时,干脆写一个自己的CEdit.
   
下面介绍CEdit类的开发方法(别怕,微软标准的CEdit不是那么可怕,开发并不困难).
    1.
可以采用MFC的类向导,选中CWnd作为基类;现在编写其Create()函数:
            if(m_strClassName.IsEmpty())

            {

                        m_strClassName = AfxRegisterWndClass( CS_PARENTDC | CS_HREDRAW | CS_VREDRAW,

                                                                                                            ::LoadCursor( NULL, m_csName ),

                                                                                                            ( HBRUSH )::GetStockObject( GRAY_BRUSH ) );

            }

            lpszClassName = LPCTSTR(m_strClassName);

 

            dwStyle |= WS_CHILD;

 

            return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);

 

   2.编辑自己的Caret:

            大概你很少看到彩色的字符输入符号吧,因为系统采用的是单色的Caret.Caret能否由自己创建呢?答案是肯定的。可以使用CreateCaretCBitmap)来创建图像作为字符输入符号.最难的是如何控制Caret显示的位置.我们需要考虑不同字体的字符所需要的像素数(宽度和高度),而且相同的字体不同的字符的宽度也是不一样的。但是不要紧,CpaintDC提供了标准的处理方法:

            LOGFONT logfont = wnffont.getfont(m_nFnLogIdx);

            CFont font;

            font.CreateFontIndirect(&logfont);//draw font

            dc.SelectObject(&font);

           

            Csize szText = dc.GetOutputTextExtent( m_szData );

 

其中,m_nfnLoIdx为用户指定的字体,m_szData为用户已经输入的字符串;GetOutputTextExtent()函数为我们取得了详细的字符串的在像素坐标系中的x坐标信息,换句话说:我们由此可以获得当前Caret应该显示在什么位置。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有