#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL,"苟利国家生死以,岂因祸福避趋之","念诗",MB_OK);
return 0;
}
这就是最简单的一个Win32程序,里面有很多声明都是以前在C/C++学习中没有见到过的。
WinMain():是和以往编程中的main()等价的东西.这是程序开始执行的入口;
HINSTANCE hInstance:程序可执行模块的句柄;
HINSTANCE hPrevInstance:总是为NULL;
LPSTR lpCmdLine:命令行参数组成的一个单字符串,不包括程序名;
int nCmdShow:要传递给ShowWindow()的一个整数。
主程序中出现的MessageBox()原型为:int WINAPI MessageBox(
HWND
hWnd,
LPCTSTR
lpText,
LPCTSTR
lpCaption,
UINT
uType)
其实是根据Unicode的定义来的:
WINUSERAPI int WINAPI MessageBoxA(
HWND hWnd,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType);
WINUSERAPI int WINAPI MessageBoxW(
HWND hWnd,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType);
#ifdef UNICODE
#define MessageBox MessageBoxW//如果启用Unicode库,就用MessageBoxW
#else
#define MessageBox MessageBoxA//否则,就用MessageBoxA
#endif
单单只有一个窗口未免也太low了,我们可以增加一些互动元素,比如对于鼠标点击的处理。
这时我们可以尝试着把WM_LBUTTONDOWN添加到WndProc()中,看看能够发生什么
WndProc()部分的完整代码如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
{
char szFileName[MAX_PATH];
HINSTANCE hInstance=GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, "窗口弹出成功", "新消息", MB_OK|MB_ICONINFORMATION);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
在程序中加入这样一段代码之后,在程序窗口中点击一下,便会弹出一个新的窗口。具体效果如下图所示:
深入研究WndProc函数:
WinProc是窗口回调过程。Windows通过它将事件传递给程序。回调函数是被调用回来的函数。这个函数处理所有发送给主程序窗口的消息。所以,通常WinProc是主程序源代码文件中最长的函数。
需要了解这个函数,因为它是通向初始化Direct3D的钥匙。它的参数既简单又直白,它们代表Windows程序的真实“引擎”。据前述,这一信息是早先在WinMain中由GetMessage函数获取的。不要将InitInstance和WinProc混淆在一起。InitInstance只运行一次,对选项进行设置。而后就由WinProc接管,接收并处理消息。
有关于WinProc的参数:
HWND hWnd:在游戏中,通常要使用hWnd作为参数创建一个新的设备环境句柄,也就是一个hDC。在DirectX到来之前,必须要保留好窗口句柄,因为只要引用一个窗口或控件就必须使用到它。在DirectX程序中,窗口句柄仅在开始时用于创建窗口。
UINT messgae:发送给窗口回调过程的消息。消息可以是任何东西,甚至是无需使用的消息。由于这个原因,有一个将消息传递给默认消息处理器的方法。
WPARAM wParam和LPARAM lParam:与特定命令消息一起传递过来的参数值的高位和低位。
关于按键消息捕捉的参数:
MK_CONTROL:键盘上Ctrl键被按下;
MK_LBUTTON:鼠标左键被按下;
MK_MBUTTON:鼠标中键被按下;
MK_RBUTTON:鼠标右键被按下;
MK_SHIFT:键盘Shift键被按下;
...其他跟此类似