common control 发送notification 到父窗口,当事件发生时。这是通用控件的设计方法!
common control也是窗口,也就有window class,也能使用一般的窗口函数处理他们。
一些发送WM_COMMAND消息给父窗口,一些但是使用WM_NOTIFY来通知父窗口
代码如:
//子控件发送WM_COMMAND,而在父窗口处理函数中处理他们,为什么他们不给自己的窗口处理函数呢?
case WM_COMMAND:
do.....
break;
使用common control,要包含commctrl.h和使用comctl32.lib,在你调用任何在comctl32.dll中的函数,使用
InitCommonControls(Ex)来确保dll被加载。
InitCommonControls 做的事情,我猜测,在DllMain中注册这个dll中的window class
创建common control使用CreateWindow(Ex)或是使用对话框模版(也可以将对话框设为style:Child/Border:No来避免使用CreateWindow(Ex)动态创建)
common control的类别
c在commctrl.h中定义,MFC在AFXCMN.H中定义.
ANIMATE_CLASS
HOTKEY_CLASS
PROGRESS_CLASS
STATUSCLASSNAME
TOOLBARCLASSNAME
TOOLTIPS_CLASS
TRACKBAR_CLASS
UPDOWN_CLASS
WC_HEADER
WC_LISTVIEW
WC_TABCONTROL
WC_TREEVIEW
common control的style
CCS_ADJUSTABLE
CCS_BOTTOM
CCS_TOP
CCS_NORESIZE
CCS_NOMOVEY
CCS_NOPARENTALIGN
CCS_NODIVIDER
CCS_NOHILITE
common control的Notificatiions,以NM_*开始
NM_*用来通知他的父窗口的,有什么事情发生了,并不是有自己处理,因为他的类别是系统注册的,不知道其中的pfnWndProc,但是可以使用subclass或superclass来改变pfnWndProc
lParam包含NMHDR结构或是包含NMHDR结构的结构
typedef struct _nmhdr
{
HWND hwndFrom; //告诉父窗口这个notification的来源窗口
UINT idFrom;
UINT code;
} NMHDR;
但是大多数通用控件都可以发送以下notification
NM_CLICK
NM_DBLCLK
NM_KILLFOCUS
NM_RCLICK
NM_RDBLCLK
NM_RETURN
NM_SETFOCUS
例如,我在TreeControl上双击了,那么就有NM_DBLCLK,被通知到他的父窗口,也就是我的程序!我的处理
case WM_NOTIFY:
switch(code){
case NM_DBLCLK:
....
break;
}
break;
正式开始:common control 学习
organizational controls:
是指status bars toolbars
status bars
window class:STATUSCLASSNAME
注意:他不在对话框设计器中,也就是说不能画出来,只能用代码建立!
创建方法:
1.HWND hwndStatus=CreateWindowEx(...,STATUSCLASSNAME,...);
2.CreateStatusWindow
3.CStatusBar
4.CStatusBarCtrl
其中CreateStatusWindow的参数
style,wID,hwndParent比较重要
调用系统注册类别的pfnWndProc函数,使用SendMessage
想要让status bars调整大小,那么调用其消息处理器来处理WM_SIZE,或我们自己处理,但是我们自己处理麻烦,直接使用SendMessage(hwnd,WM_SIZE,...)来调用消息处理器来处理WM_SIZE消息
示例工程连接: