代码
 1 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 2 {
 3     int wmId, wmEvent;
 4     PAINTSTRUCT ps;
 5     HDC hdc;
 6 
 7     COleDateTime dtNow = COleDateTime::GetCurrentTime();
 8     CString strNow = dtNow.Format(_T("%Y-%m-%d %H:%M:%S"));
 9     if (message == WM_COMMAND)
10     {
11         USES_CONVERSION;
12         _RPT3(_CRT_WARN, "[%s]%s->%d\n", T2A(strNow), GetMsgName(message), message);
13         _RPT3(_CRT_WARN, "HIwParam:%d,LOwParam:%d,lParam:%d\n"
14             , HIWORD(wParam), LOWORD(wParam), lParam);
15     }
16 
17     switch (message)
18     {
19     case WM_COMMAND:
20         wmId    = LOWORD(wParam);
21         wmEvent = HIWORD(wParam);
22         // Parse the menu selections:
23         switch (wmId)
24         {
25         case IDM_ABOUT:
26             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
27             break;
28         case IDM_EXIT:
29             DestroyWindow(hWnd);
30             break;
31         default:
32             return DefWindowProc(hWnd, message, wParam, lParam);
33         }
34         break;
35     case WM_PAINT:
36         hdc = BeginPaint(hWnd, &ps);
37         // TODO: Add any drawing code here...
38         EndPaint(hWnd, &ps);
39         break;
40     case WM_DESTROY:
41         PostQuitMessage(0);
42         break;
43     case WM_CREATE:
44         {
45         HWND hWndBtn = CreateWindow(TEXT("BUTTON"),        //控件"类名称"
46             TEXT("按钮(&A)"),
47             WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,
48             10,
49             10,
50             100,
51             100,
52             hWnd,
53             (HMENU)1000,            //控件ID
54             ((LPCREATESTRUCT) lParam)->hInstance,    //实例句柄
55             NULL);
56         _RPT1(_CRT_WARN, "hWndBtn:%d\n", hWndBtn);
57         return 0;
58         }
59 
60     case WM_GETMINMAXINFO:
61         {
62             PMINMAXINFO pMinMaxInfo = (PMINMAXINFO)lParam;
63             int a = 10;
64         }
65         break;
66     default:
67         return DefWindowProc(hWnd, message, wParam, lParam);
68     }
69     return 0;
70 }

 

 

 

一、概述

控件是子窗口,它们是系统已经定义好的窗口类,因此不需要注册、
也不需要写消息处理函数。
在主窗口得到WM_CREATE消息时,建立子窗口即可。

 

 

二、关于WM_CREATE消息
WM_CREATE 的lParam参数将会传入一个建立时信息结构指针(LPCREATESTRUCT)。
结构中包含了一些有用信息(窗口建立时的参数)。

typedef struct tagCREATESTRUCT {
    LPVOID    lpCreateParams; 
    HINSTANCE hInstance;		//实例句柄 
    HMENU     hMenu;			 
    HWND      hwndParent; 
    int       cy; 
    int       cx; 
    int       y; 
    int       x; 
    LONG      style; 
    LPCTSTR   lpszName; 
    LPCTSTR   lpszClass; 
    DWORD     dwExStyle; 
} CREATESTRUCT, *LPCREATESTRUCT; 

三、 控件与父窗口的协作
控件上发生动作时,将向父窗口发送通知消息WM_COMMAND。
WM_COMMAND:
HIWORD(wParam):通知码(notification code)
LOWORD(wParam):控件ID
(HWND)lParam: 控件句柄

 

四、 输入

当点击Click按钮时,产生的输出日志如下:
hWndBtn:68650        /* 第56行输出的HWND*/
AfterCreateWindow!
AfterShowWindow!
AfterUpdateWindow!
[2010-05-25 22:41:09]WM_COMMAND->273  /* 通知父窗口的消息*/
HIwParam:0,LOwParam:1000,lParam:68650     /* 消息参数,lParam就是控件的HWND*/

将CreateWindow(TEXT("BUTTON")中的“BUTTON” 改为“EDIT"时,产生的日志如下:

AfterUpdateWindow!
[2010-05-25 22:51:20]WM_COMMAND->273  /*  鼠标点击,获取焦点*/
HIwParam:256,LOwParam:1000,lParam:134186        
[2010-05-25 22:51:28]WM_COMMAND->273  /* 利用回退键删除一个字符(产生的第一个消息)*/
HIwParam:1024,LOwParam:1000,lParam:134186
[2010-05-25 22:51:28]WM_COMMAND->273  /* 利用回退键删除一个字符(产生的第二个消息)*/
HIwParam:768,LOwParam:1000,lParam:134186
[2010-05-25 22:51:33]WM_COMMAND->273  /*  控件失去焦点*/
HIwParam:512,LOwParam:1000,lParam:134186

Posted on 2010-05-25 22:55  我不是牛人  阅读(341)  评论(0编辑  收藏  举报