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