編寫窗口程序的步驟:
1 定義WinMain函數
2 定義窗口處理函數–自己定義處理消息
3 注冊窗口類(往OS寫入數據)
4 創建窗口 (在內存中創建窗口)
5 顯示窗口(根據內存中對於窗口的描述信息,在顯示器中繪制窗口)
6 消息循環(提取/翻譯/派發)
7 消息處理
#include "stdafx.h"
HINSTANCE g_hInstance = 0;
//窗口處理函數
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_DESTROY:
PostQuitMessage( 0 );//可以使GetMessage返回0??
break;
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
//注冊窗口類
BOOL Register( LPSTR lpClassName, WNDPROC wndProc )
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = wndProc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx( &wce );
if( nAtom==0 )
return FALSE;
return TRUE;
}
//創建主窗口
HWND CreateMain( LPSTR lpClassName, LPSTR lpWndName )
{
HWND hWnd = CreateWindowEx( 0, lpClassName, lpWndName,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL, NULL, g_hInstance, NULL );
return hWnd;
}
//顯示窗口
void Display( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
}
//消息循環
void Message( )
{
MSG nMsg = { 0 };
while( GetMessage(&nMsg, NULL, 0, 0) )
{
TranslateMessage( &nMsg );
DispatchMessage( &nMsg );
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
g_hInstance = hInstance;
BOOL nRet = Register( "Main", WndProc );
if( nRet == FALSE )
{
MessageBox( NULL, "注冊失敗", "Infor", MB_OK );
return 0;
}
HWND hWnd = CreateMain( "Main", "window" );
Display( hWnd );
Message( );
return 0;
}