说明:
win32应用程序学习的人都会学到windows消息循环。我只是记录一下自己的学习过程,不是在这里炫耀吹牛。
研究windows的主函数的时候,注册窗口,创建窗口,在主函数中调用结果显示不出来,最后查阅网络才明白,窗口回调函数是必须写好的,一开始我只是简单的写了返回0,调试很多次都不能够显示自己的窗口,最后才通过。
代码:
#include <Windows.h>
//window call back method.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
MessageBoxW(hWnd,L"create window",L"TipWindow",MB_OK);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
//register window class.
ATOM RegisterWndClass(HINSTANCE hInstance)
{
WNDCLASSEXW wndClass;
wndClass.cbSize=sizeof(WNDCLASSEXW);
wndClass.style=CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=NULL;
wndClass.cbWndExtra=NULL;
wndClass.hInstance=hInstance;
wndClass.hIcon=LoadIconW(hInstance,IDI_APPLICATION);
wndClass.hCursor=LoadCursorW(hInstance,IDC_ARROW);
wndClass.hbrBackground=NULL;
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=L"TestWndClass";
wndClass.hIconSm=LoadIconW(hInstance,IDI_APPLICATION);
return RegisterClassExW(&wndClass);
}
//init main window.
BOOL InitWndow(HINSTANCE hInstance,INT nShowCmd)
{
HWND hWnd=NULL;
hWnd=CreateWindowW(
L"TestWndClass",
L"MainWindow",
WS_OVERLAPPEDWINDOW,
300,
50,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
DWORD error=GetLastError();
if(!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);
return TRUE;
}
INT WINAPI wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
INT nShowCmd)
{
//register window
if(!RegisterWndClass(hInstance))
{
MessageBoxW(NULL,L"Register window failed!",L"TipWindow",MB_OK);
}
//init the main window
if(!InitWndow(hInstance,nShowCmd))
{
MessageBoxW(NULL,L"Initialize window failed!",L"TipWindow",MB_OK);
}
//message loop
MSG message;
while(GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return 0;
}
补充:
这个程序是一个很稳固的程序,不需要导入任何资源。但是,这个程序不是一个灵活的程序,注册窗口类的名字我写死了,可以抽取函数参数。窗口标题的名字同理。
结果:
1。创建时提示窗口。
2。窗口显示结果
总结:
window窗口应用程序主函数有三个
1.WinMain -- 主要针对ANSI 字符集处理的程序。
2._tWinMain -- 这个是希望兼容ANSI和Unicode两种字符集的程序。
3.wWinMain -- 主要针对Unicode字符集的程序。
无论哪个主函数,在我所知道的书籍里面都点明说windows最后还是会调用wWinMain主函数,所以,我写的程序,在windows平台上,win32窗口应用程序是用wWinMain主函数的实现自己的程序的。