关于MFC Control 控件编程

来源:互联网 发布:淘宝店运营模式 编辑:程序博客网 时间:2024/05/20 23:04

刚开始的时候难免会遇到缺乏资料,不过还好,只要有耐心MSDN还是不会让我们太失望的~~

对于所有Control的最新介绍可以从下面的连接中找到:http://msdn.microsoft.com/en-us/library/47xcww9x.aspx。例如,CTreeCtrl/CToolBarCtrl等等

另外对于控件的消息和我们常见的WM_*不一样,控件采用的是NM_*,Notify通告消息,至于采用通告消息的原因和实现的方式可以参看:http://msdn.microsoft.com/en-us/library/749htf6k.aspx。对于控件的消息映射有详细说明。

简单提一下,对于控件消息处理的方法,或许以后对我们会有什么启发。

在Windows 3.x里面如果控件发生单击、内容改变、控件背景重绘等事件,就会通过向父窗口发送消息来通知父窗口采取相应动作。一些简单的通知是按照特殊的WM_COMMAND消息来发送的,并且消息参数wParam里面含有控件ID,lParam含有控件处理函数的地址。需要注意的是,因为wParam/lParam已经被使用了,所以就没有办法把其他一些数据(比如鼠标单击是的位置)也传送给父窗口了。

为了把其他的一些信息也能够传递给父窗口,mfc那些维护者就添加了很多专门的针对各种控件的消息,比如:WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM等等。

在Win32里面,随着MFC不断的发展,有更复杂而又精致的控件被添加进来,这也就意味着有更多的数据需要传递。此时,是应该好好想想应该怎样来对待这些控件了?难道还是继续添加专门的WM_*?如果这样做的话会不会让MFC变得越来越让人讨厌,毕竟没有人刻意喜欢复杂的东西~所以,那些mfc维护者就重新提出了一个解决方案:所有的控件消息用一个WM_消息来代表,就像WM_COMMAND一样,这样的话MFC会看起来更精美,结构也会变得很清晰,所以这个消息就是WM_NOTIFY。并且他们采用NMHDR这个结构来存储控件消息。

typedef struct tagNMHDR {    HWND hwndFrom;    UINT idFrom;    UINT code;} NMHDR;

这样每一个控件消息在定义的时候都会包含NMHDR成员,比如,列表视图控件的LVN_KEYDOWN控件通告消息的定义如下:

typedef struct tagLV_KEYDOWN {    NMHDR hdr;      //第一个成员是NMHDR类型    WORD wVKey;      UINT flags;  } LV_KEYDOWN;然后通过下面这两句代码来实现完整的一个控件消息的映射
ON_NOTIFY( wNotifyCode, id, memberFxn )
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
原创粉丝点击