1 /*------------------------------------------------------------------------2 HELLOWIN.C -- Displays "Hello, Windows 98!" in client area3
4 (c) Charles Petzold, 19985
6 -----------------------------------------------------------------------*/
7
8 #include
9 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;10
11
12 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, intiCmdShow)13
14 {15
16 static TCHAR szAppName[] = TEXT ("HelloWin") ;17
18 HWND hwnd ;19
20 MSG msg ;21 //前面都是变量定义,不关注。
22
23 WNDCLASwndclass ;24
25
26 wndclass.style = CS_HREDRAW |CS_VREDRAW ;27
28 wndclass.lpfnWndProc = WndProc ; //关键句,指出消息的处理函数所在位置
29
30 wndclass.cbClsExtra = 0;31
32 wndclass.cbWndExtra = 0;33
34 wndclass.hInstance =hInstance ;35
36 wndclass.hIcon =LoadIcon (NULL, IDI_APPLICATION) ;37
38 wndclass.hCursor =LoadCursor (NULL, IDC_ARROW) ;39
40 wndclass.hbrBackground=(HBRUSH) GetStockObject (WHITE_BRUSH) ;41
42 wndclass.lpszMenuNam =NULL ;43
44 wndclass.lpszClassName=szAppName ;45
46 //这一连串的wndclass是在定义一类窗口的属性,形象地说就是在定义一个模子,然后后面可以用这个模子去建立更多的窗口,其中这个模子中我们需要注意的就是红字的 wndclass.lpfnWndProc = WndProc ;,他指出了这个模子的消息处理函数是哪个?也就是说这个窗口内发生的一切事件,比如说点击,双击,鼠标移动,按键,按下按钮这一切都会生消息,而系统会自动调用WndProc去处理这些问题。*/
47 if (!RegisterClass (&wndclass))48
49 {50
51 MessageBox ( NULL, TEXT ("This program requires Windows NT!"),52
53 szAppName, MB_ICONERROR) ;54
55 return 0;56
57 }58 //上面的是很简单的一个注册模子,你开始定义了这个模子wndclass,那你得让系统知道啊,这部分就是这个功能,不须太关注。
59 hwnd = CreateWindow( szAppName, //window class name
60
61 TEXT ("The Hello Program"), //window caption
62
63 WS_OVERLAPPEDWINDOW, //window style
64
65 CW_USEDEFAULT,//initial x position
66
67 CW_USEDEFAULT,//initial y position
68
69 CW_USEDEFAULT,//initial x size
70
71 CW_USEDEFAULT,//initial y size
72
73 NULL, //parent window handle
74
75 NULL, //window menu handle
76
77 hInstance, //program instance handle
78
79 NULL) ; //creation parameters80
81 //注意上面便是利用这个模子,再加上一些自己独有的特点建立了一个窗口,大家不需关注
82
83 ShowWindow (hwnd, iCmdShow) ;84
85 UpdateWindow (hwnd) ;86
87
88 while (GetMessage (&msg, NULL, 0, 0))89
90 {91
92 TranslateMessage (&msg) ;93
94 DispatchMessage (&msg) ;95
96 }97 //上面这个需要关注,前面提到过,如果窗口产生了消息我们需要调用WndProc来处理,那么之前我们需要上面的哪个while循环先处理下,这个现在我们也不需要了解。
98 returnmsg.wParam ;99
100 }101
102
103 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)104 {105
106 HDC hdc ;107
108 PAINTSTRUCT ps ;109
110 RECT rect ;111
112 //重点来了,大家注意当我们到了WndProc这个消息处理函数中时,我们会不自然地想到:那么多种的消息,系统如何分辨是那个呢,这是我们就要注意到UINT message,他说明了消息的种类,而WPARAM,LPARAM都是消息具体的参数,大家这时看下面,因为message表示的消息不同,系统使用了switch来选择对应的处理程序,这里要注意WM_CREATE:像这些WM_开头的都是消息,而实质上都是数字,不过是头文件定义了一些等价字符串而已。
113 switch(message)114
115 {116
117 caseWM_CREATE:118
119 PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME |SND_ASYNC) ;120
121 return 0;122
123 caseWM_PAINT:124
125 hdc = BeginPaint (hwnd, &ps) ;126
127 GetClientRect (hwnd, &rect) ;128
129 DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,130
131 DT_SINGLELINE | DT_CENTER |DT_VCENTER) ;132
133 EndPaint (hwnd, &ps) ;134
135 return 0;136
137 caseWM_DESTROY:138
139 PostQuitMessage (0) ;140
141 return 0;142 }143 returnDefWindowProc (hwnd, message, wParam, lParam) ;144 }
本文介绍了如何在OD调试器中设置消息断点,特别是在Windows程序中,通过在WndProc函数下断点来捕获和分析消息处理流程。示例代码展示了WinMain和WndProc的基本结构,帮助理解消息处理机制。
1452

被折叠的 条评论
为什么被折叠?



