没用VC++很久了,趁这个暑假有时间复习一下吧.
看了孙鑫老师的视频,感觉很多地方都生疏了.今天就复习第一章,Windows程序的运行机制.
先说一下大致的结构:
首先是入口函数WinMain,然后定义一个窗口类,接着注册窗口类,再创建窗口,显示窗口,编写消息循环机制,编写回调函数.
下面是一个简单的Windows程序的C代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<span style="color: #339933;">#include <windows.h></span>
<span style="color: #339933;">#include <stdio.h></span>
LRESULT CALLBACK WinProc<span style="color: #009900;">(</span>
HWND hwnd<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// handle to window</span>
UINT uMsg<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// message identifier</span>
WPARAM wParam<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// first message parameter</span>
LPARAM lParam <span style="color: #666666; font-style: italic;">// second message parameter</span>
<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> WINAPI WinMain<span style="color: #009900;">(</span>
HINSTANCE hInstance<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// handle to current instance</span>
HINSTANCE hPrevInstance<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// handle to previous instance</span>
LPSTR lpCmdLine<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// command line</span>
<span style="color: #993333;">int</span> nCmdShow <span style="color: #666666; font-style: italic;">// show state</span>
<span style="color: #009900;">)</span>
<span style="color: #009900;">{</span>
WNDCLASS wndcls<span style="color: #339933;">;</span>
wndcls.<span style="color: #202020;">lpfnWndProc</span><span style="color: #339933;">=</span>WinProc<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//注意这:回调函数名</span>
wndcls.<span style="color: #202020;">lpszClassName</span><span style="color: #339933;">=</span><span style="color: #ff0000;">"WinClass"</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//注意:类名</span>
...
RegisterClass<span style="color: #009900;">(</span><span style="color: #339933;">&</span>amp<span style="color: #339933;">;</span>wndcls<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//注册窗口类</span>
HWND hwnd<span style="color: #339933;">;</span>
hwnd<span style="color: #339933;">=</span>CreateWindow<span style="color: #009900;">(</span><span style="color: #ff0000;">"WinClass"</span><span style="color: #339933;">,</span><span style="color: #ff0000;">"这是标题"</span><span style="color: #339933;">,</span>WS_OVERLAPPEDWINDOW<span style="color: #339933;">,</span>
<span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">600</span><span style="color: #339933;">,</span><span style="color: #0000dd;">400</span><span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span>hInstance<span style="color: #339933;">,</span>NULL<span style="color: #009900;">)</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//具体参数参阅MSDN</span>
ShowWindow<span style="color: #009900;">(</span>hwnd<span style="color: #339933;">,</span>SW_SHOWNORMAL<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//显示窗口</span>
UpdateWindow<span style="color: #009900;">(</span>hwnd<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//刷新窗口</span>
MSG msg<span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">(</span>GetMessage<span style="color: #009900;">(</span><span style="color: #339933;">&</span>amp<span style="color: #339933;">;</span>msg<span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span>
<span style="color: #009900;">{</span>
TranslateMessage<span style="color: #009900;">(</span><span style="color: #339933;">&</span>amp<span style="color: #339933;">;</span>msg<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//翻译消息</span>
DispatchMessage<span style="color: #009900;">(</span><span style="color: #339933;">&</span>amp<span style="color: #339933;">;</span>msg<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//将消息交给回调函数处理</span>
<span style="color: #009900;">}</span>
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
LRESULT CALLBACK WinSunProc<span style="color: #009900;">(</span> <span style="color: #666666; font-style: italic;">//回调函数</span>
HWND hwnd<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// handle to window</span>
UINT uMsg<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// message identifier</span>
WPARAM wParam<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// first message parameter</span>
LPARAM lParam <span style="color: #666666; font-style: italic;">// second message parameter</span>
<span style="color: #009900;">)</span>
<span style="color: #009900;">{</span>
<span style="color: #b1b100;">switch</span><span style="color: #009900;">(</span>uMsg<span style="color: #009900;">)</span> <span style="color: #666666; font-style: italic;">//消息处理</span>
<span style="color: #009900;">{</span>
<span style="color: #b1b100;">case</span> WM_CLOSE<span style="color: #339933;">:</span>
DestroyWindow<span style="color: #009900;">(</span>hwnd<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">case</span> WM_DESTROY<span style="color: #339933;">:</span>
PostQuitMessage<span style="color: #009900;">(</span><span style="color: #0000dd;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
<span style="color: #b1b100;">return</span> DefWindowProc<span style="color: #009900;">(</span>hwnd<span style="color: #339933;">,</span>uMsg<span style="color: #339933;">,</span>wParam<span style="color: #339933;">,</span>lParam<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
|
这里要注意窗口类里的lpfnWndProc和lpszClassName两个参数是与回调函数和CreateWindow里的参数是对应的.
转载请注明:爱开源 » VC++复习笔记1-Windows程序的运行机制