要创建一个窗口首先要注册一个窗口类,而窗口类又需要通过窗口过程来处理窗口消息。窗口过程是由用户自定义的函数,该函数被window调用,而这个函数的参数 描述了window向窗口发送并由该函数接收的特定消息。下面一段代码举例说明怎么创建一个窗口:
#include<windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); #pragma comment(lib,"WINMM.lib") int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,PSTR szCmdLine,int nShowCmd) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hWnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR); return 0; } hWnd = CreateWindow(szAppName, //window class name TEXT("The Hello Program"), //window caption WS_OVERLAPPEDWINDOW, //window style CW_USEDEFAULT, //initail x position CW_USEDEFAULT, //initail y position CW_USEDEFAULT, //initail x size CW_USEDEFAULT, //initail y size NULL, //parent window handle NULL, //window menu handle hInstance, //program instance handle NULL); //creation parameters ShowWindow(hWnd,SW_SHOWNORMAL); UpdateWindow(hWnd); //窗口自绘 while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_CREATE: PlaySound(TEXT("hellowin.wav"),NULL, SND_FILENAME|SND_ASYNC);//采用异步的方式播放声音,即不用等声音播放完,函数立即返回。 return 0; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rect); DrawText(hdc,TEXT("Hello,Window 98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hWnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,message,wParam,lParam); }
程序首先声明了一个回调函数WndProc(HWND hWnd,UNIT message ,WPARARM wParam,LPARAM lParam);这个函数就是所谓的窗口过程。参数hWnd表示一个接收消息窗口的窗口句柄(即CreateWindow的返回值),message 表示Window发给窗口的消息类型,后两个参数根据消息的不同而不同。当窗口过程对消息进行处理后,都应该返回0值。所有窗口不进行处理的消息都必须传給名称为DefWindowProc的Windows函数。DefWindowProc的返回值必须从窗口过程返回。
RegisterClass注册了一个窗口类。CreateWindow函数创建一个窗口。ShowWindow函数显示窗口。UpdateWindow函数向窗口发送一个WM_PAINT消息。
GetMessage从消息队列中取一条消息,后3个参数为NULL或者0,表示该窗口接收改程序创建的所有窗口的窗口消息。当GetMessage从消息队列中取到一条WM_QUIT消息时程序返回0值,否则返回非0值。TranslateMessage将消息返还给windows以进行某些键盘消息的转换。DispatchMessage将消息返还给windows,windows再将消息
分发给合适的窗口过程。