要创建一个窗口首先要注册一个窗口类,而窗口类又需要通过窗口过程来处理窗口消息。窗口过程是由用户自定义的函数,该函数被window调用,而这个函数的参数 描述了window向窗口发送并由该函数接收的特定消息。下面一段代码举例说明怎么创建一个窗口:
#include
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再将消息
分发给合适的窗口过程。