Windows编程入门——从一个简单的窗口说起

#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;
}


在程序中加入这样一段代码之后,在程序窗口中点击一下,便会弹出一个新的窗口。具体效果如下图所示:

Windows编程入门——从一个简单的窗口说起_第1张图片



深入研究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键被按下;

...其他跟此类似



你可能感兴趣的:(Windows编程)