第二章 一個最簡單窗口程序的轉型
我知道,可能會有很多朋友對上一章的“Hello, World!”ATL版不以為然,因為它並不能算是什麼ATL程序——畢竟它只不過是有了個CComModule而已。不過不管怎樣我還是要說,它幾乎仍然擁有了一個ATL GUI程序的所有組成部分:入口、初始化、程序體、卸載……
“等等!”也許你會突然打斷我,“——還有注冊窗口類、消息循環呢?”
當然,對於一個完整的GUI程序來講,這也是必要的。
貌似廢話
不清楚你是否已經為本章的內容做好了准備,因為下面我們就要動真格的了。不過考慮到本書的讀者群中可能會存在著相當一部分了解MFC卻對Win32 GUI的基本原理和流程不甚熟悉的朋友,所以李馬特別為你們准備了這一節的內容。SDK的粉絲們可以跳過這一節,如果你們覺得李馬講的有些拖沓冗長的話。
那麼,我還是先以一個標准的Win32 SDK程序開始:
////////////////////////////////////////////////////////////////////////// // ATL的GUI程序設計配套源代碼 // 第二章 一個最簡單窗口程序的轉型 // 工程名稱:HelloSDK // 作者:李馬 // http://www.titilima.cn ////////////////////////////////////////////////////////////////////////// #include <windows.h> #include <tchar.h> LRESULT CALLBACK HelloWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ) { case WM_DESTROY: { PostQuitMessage( 0 ); } break; case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint( hWnd, &ps ); DrawText( hdc, _T("Hello, SDK!"), -1, &ps.rcPaint, DT_CENTER | DT_VCENTER | DT_SINGLELINE ); EndPaint( hWnd, &ps ); } break; default: return DefWindowProc( hWnd, uMsg, wParam, lParam ); } return 0; } BOOL InitApplication( HINSTANCE hInstance ) { WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hInstance = hInstance; wc.lpfnWndProc = HelloWndProc; wc.lpszClassName = _T("HelloSDK"); wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; return RegisterClass( &wc ); } int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd ) { // 注冊窗口類 InitApplication( hInstance ); // 創建窗口 HWND hWnd = CreateWindow( _T("HelloSDK"), _T("Hello SDK"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow( hWnd, nShowCmd ); UpdateWindow( hWnd ); // 消息循環 MSG msg; while ( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam; }
不知道你是否會覺得這段代碼有些冗長?事實上,這個程序已經體現了Win32 GUI程序運行的所有流程(請注意,我並不會對這些代碼進行詳細的解釋,因為我已經假設你已經了解了這些代碼具體行為的必要細節。如果不是這樣的話,請參考相關的書籍或者MSDN):
本文示例代碼或素材下載