MFC DLEdit 设计属于自己的编辑框

2012-02-04 13:00 by 捣乱小子, 3543 阅读, 5 评论, 收藏编辑

起因

  无意间看到了大牛们写的自定义编辑框控件,于是找了个时间自己写了一个,加深了对MFC消息机制和一些功能的了解。

分析

  先来看一张QQ2011的登录窗口,发现当鼠标悬停在编辑框上的时候,会有悬停边框高亮,这样给用户一种很绚丽的视觉享受,但我相信大家每天都上q,从而都忽略了这些美丽,细心分析一下,QQ的每一个器官甚至一根毛都是经过精心设计的。当编辑框失去输入焦点,而编辑框内文本为空的时候,会有灰色提示文本,提示用户输入。

  还可以有好多的自定编辑框功能,美化我们的编辑框。

具体实现和细节

  在之前《MFC自动隐藏》这篇文章中的技术细节有与DLEdit相似的地方,那就是鼠标悬停的判断。 当鼠标悬停的时候,DLEdit要绘上编辑框“悬停框条”,因此什么时候“鼠标是悬停状态”的判断很重要,为了不造成文章的累赘,点这里《MFC 鼠标去留》。在程序当中要有一BOOL变量m_bHover来标志鼠标是否悬停在控件上面。这样一来只要m_bHover为true,就可以在WM_ERASEBKGND的处理函数当中来绘绚丽的“悬停框条”。

  没错,几乎所有的绘图都在WM_ERASEBKGND的处理函数当中进行,CEdit没有SS_OWNERDRAW风格,因此也没有DrawItem来对自身进行绘制,所以要用WM_ERASEBKGND的处理函数中绘制编辑框的背景,自定义美化的工作很大一部分落在其上。

  其实DLEdit作为控件,很多的消息是不能够接受并处理的,相反的,它们要发送给主窗口(parentWnd),从而交给主窗口来处理。就比如WM_DRAWITEM消息,控件窗口(假设它具有*S_OWNERDRAW风格)根本就不会接受到它,更不会去调用DrawItem函数来自绘;它是被发送到主窗口,调用主窗口的afx_msg void OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDrawItemStruct )函数,其内部实现会根据nIDCtl控件ID来绘控件;当然可以在OnDrawItem中实现所有控件的绘制,但是对于控件很多的窗口来说,OnDrawItem会倍感压力,所以控件本身的DrawItem有了施展身手的机会。在win32 sdk纯C的编程中,所有的控件的自绘都在“case WM_DRAWITEM:”后面得到实现,但是MFC为了更好结合面向对象思想,所以控件窗口有自己的DrawItem,并由OnDrawItem来调用。同样,WM_CTLCOLOR消息也是一样的。

  细心的人都会发现,如果在控件类(或者说是子类)中添加WM_CTLCOLOR或者通知码处理消息,在消息映射表中,我们都会发现:

ON_CONTROL_REFLECT(EN_CHANGE,&CDLEdit::OnEnChange)
ON_WM_CTLCOLOR_REFLECT()

在宏的最后都有REFLECT字眼,就是映射的意思。以ON_CONTROL_REFLECT为例,MFC中定义如下:

#define ON_WM_CTLCOLOR_REFLECT() \
    { WM_CTLCOLOR+WM_REFLECT_BASE, 0, 0, 0, AfxSig_hDw, \
        (AFX_PMSG)(AFX_PMSGW) \
        (static_cast< HBRUSH (AFX_MSG_CALL CWnd::*)(CDC*, UINT) > ( &ThisClass :: CtlColor)) },

有这种映射,就把WM_CTLCOLOR和CtlColor函数在控件类里对应起来了。在主窗口中添加WM_CTLCOLOR消息响应函数,里面有我们很熟悉的一句话:

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

这一句就是根据子窗口(或者子控件,nCtlColor来指定)是否有CtlColor,来决定是否执行子窗口的CtlColor,不信你可以一步一步调试下去。另外在CSDN里唠叨一篇好文章,思路很清晰,《WM_DRAWITEM与DrawItem()的讨论》。

来看看自定义的编辑框:

说明:

  • 悬停边框:鼠标悬停才绘制的边框;
  • 默认边框:编辑框外围的一个实线框,与悬停边框紧贴;
  • 编辑框框条:紧贴编辑框的框条,一般选择淡色为好。

  在编辑框的CtlColor函数中,pDC->SetBkColor(clr),的clr是指文本颜色的背景色,而CtlColor函数的返回值是编辑框的画刷句柄(return hbr),所以,如果你不能保证clr和返回画刷的颜色一致,那么编辑框就会出现两种颜色,上面是文本的背景色,而下面是编辑框的背景色,两者是不同的。

功能图示

看看与普通的编辑框有什么不同:

 
边框框条就不同,接着有灰色字体提示输入。


具备输入焦点后,底色改变。

具备输入焦点后,字体变粗。

具备输入焦点后,有阴影。总之上面四个编辑框比起下面的两个会更个性化。

关于编辑框圆角功能

  还有很多的功能可以自定义,比如自定义背景图案等等,抛砖引玉,抛砖引玉。如果大家有好建议,欢迎拍砖讨论。看了网上大牛们的代码,有“圆角编辑框”的功能,这只要将代码中的pDC->Rectangle(rct)变pDC->RoundRect(..)就可以了。

收获与疑问

  看着自己也能写出这样的东西,还是有点欣慰的。有着大牛们的引导,相信很多的东西都可以轻车熟路。我认为,学习最忌讳的就是走弯路,在看似时髦但又百无聊赖的技术上浪费大量的时间,基础课程很重要,这才是一成不变的东西,学有余力可以接触具体的技术。有一个疑问,不知道花时间在诸如这些鸡毛蒜皮的技术上,到以后会不会产生价值,我会不会在浪费时间?

附件下载:DLEdit 工程

捣乱小子  2012年2月4日星期六

出处:http://www.cnblogs.com/daoluanxiaozi/archive/2012/02/04/2337016.html

【MFC】MFC DLEdit 设计属于自己的编辑框_鼠标悬停的更多相关文章

  1. MFC中窗口启动后,CEdit编辑框默认光标位置设置,顺序的调节方法

    MFC中窗口启动后,CEdit编辑框默认光标位设置,顺序的调节方法 在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.数值1就是默认停留 ...

  2. 通过编写串口助手工具学习MFC过程——(六)添加Edit编辑框控件

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  3. MFC 中的设计模式分析

    MFC 中的设计模式分析 最近在学习设计模式,突然想到MFC里面其实也包含有设计模式的原理,于是分析了一下,做一个笔记,网上也找了一些资料,在此一并感谢. 创建型模式 单例模式(Singleton P ...

  4. MFC编辑框字体大小调节(转)

    在学习MFC中需要调整编辑框中的字体大小,以下是我结合网上与自己实际操作总结的,希望对其它同学有所帮助.       首先,了解以下函数原型:BOOL CreateFont( int nHeight, ...

  5. MFC编程入门之二十一(常用控件:编辑框Edit Control)

    上一节讲了静态文本框,本节讲的是编辑框(Edit Control)同样是一种很常用的控件,我们可以在编辑框中输入并编辑文本.在前面加法计算器的例子中已经演示了编辑框的基本应用.下面具体讲解编辑框的使用 ...

  6. MFC设置静态文本框,编辑框等控件背景和字体颜色

    在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:afx_msg HBRUSH OnC ...

  7. MFC中关于子对话框中编辑框不能编辑的问题

    最近在用MFC写程序.发现子对话框中的编辑框不能编辑.具体问题是这样的: 我有一个对话框YhglDlg,创建了这个对话框的子对话框ZjyhxxDlg,子对话框的Style属性为Child,Border ...

  8. MFC编辑框换行实现

    MFC中换行实现 在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即“\r\n”,用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性: ...

  9. [MFC] 编辑框 EditControl 输入数字范围限制

    在MFC中,项目需要对编辑框EditControl的数字输入范围进行限制,主要有以下实现方式,各有优缺点,个人推荐第三种. 第一种:添加变量 为编辑框添加int.float变量的时候,可以填写最大值与 ...

随机推荐

  1. win vista系统的ReadyBoost性能测试

    如果想提高电脑的性能,大家通常会选择升级处理器.内存或是相关硬件,而新一代Windows Vista操作系统中增加的ReadyBoost功能,号称只需一个USB接口的闪存盘(俗称U盘),就能达到加快系 ...

  2. 《棋牌游戏服务器》斗地主AI设计

    设计目标 要取得良好效果,首先要搞清楚一个问题:我们想得到一个什么样的斗地主AI?我们的AI是用在手游产品当中,在真实玩家不足时为用户提供陪玩服务,这个目标决定了这个AI要具备以下两个核心特点:1.执 ...

  3. COS-3OS的用户接口

    操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...

  4. yum安装mysql后root用户的临时密码

    1.查看root用户临时随机密码 yum 安装mysql后,无法通过空密码登录数据库,如下: [root@ mysql]# mysql -u root -p Enter password: ERROR ...

  5. 使用net.sf.json包提供的JSONObject.toBean方法时,日期转化错误解决办法

    解决办法: 需要在toBean之前添加配置 String[] dateFormats = new String[] {"yyyy-MM-dd HH:mm:ss"}; JSONUti ...

  6. jvm-知识点总结

    参考: https://blog.csdn.net/wuqinghai2012/article/details/51485414 http://pengjiaheng.iteye.com/blog/5 ...

  7. Hibernate -- 映射多对多双向关联关系

    1. 示例代码: Student.java package cn.itcast.many2many; import java.util.HashSet; import java.util.Set; @ ...

  8. js关闭浏览器窗口及检查浏览器关闭事件

    js关闭浏览器窗口,不弹出提示框.支持ie6+,火狐,谷歌等浏览器,下面以一个示例为大家详细介绍下具体的实现方法,感兴趣的朋友可以参考下   js关闭浏览器窗口 js关闭浏览器窗口,不弹出提示框.支持 ...

  9. netty同时支持socket和http

    项目需要使用netty做中转服务器,同时支持两种不同协议的客户端,经过几天查询资料终于找到合适的方案了,同时感谢Netty权威指南及论坛问答,开始贴代码 客户端1==>socket public ...

  10. Kinect 2.0 默认姿势的中文意思

    RaiseRightHand/RaiseLeftHand 抬起左右手高于肩膀一秒Psi 举起双手高于肩膀一秒Tpose T姿势Stop 右手放下,左手缓慢贴住身侧(腰以下)或者左右调换Wave 挥手 ...