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

#include <windows.h>

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键被按下;

...其他跟此类似


Windows编程中,button(按钮)是系统内置的窗口子类型之一。按钮是一种常用的用户界面元素,通常用于触发操作或执行某些任务。 在Windows API中,可以使用CreateWindow函数创建一个按钮窗口。以下是创建按钮窗口的示例代码: ```c++ HWND hWndButton = CreateWindow( L"BUTTON", // 窗口类名 L"Click me", // 窗口标题 WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, // 窗口风格 10, 10, // 窗口位置 100, 30, // 窗口大小 hWndParent, // 父窗口句柄 (HMENU)ID_BUTTON, // 控件标识符 hInstance, // 应用程序实例句柄 NULL // 指向窗口创建参数的指针 ); ``` 上述代码中,第一个参数指定了窗口类名为“BUTTON”,表示创建一个按钮窗口。第二个参数是窗口标题,这里设置为“Click me”。第三个参数指定了窗口的风格,这里使用了WS_VISIBLE和WS_CHILD风格,表示按钮可见并且是父窗口的子窗口。BS_PUSHBUTTON表示创建一个普通的按钮,还可以使用其他风格创建不同类型的按钮。接下来的四个参数分别是窗口的位置和大小。第七个参数是父窗口的句柄,表示将按钮添加到父窗口中。第八个参数是控件标识符,用于在程序中标识该按钮。最后两个参数分别是应用程序实例句柄和窗口创建参数。 除了使用CreateWindow函数创建按钮窗口,还可以使用DialogBox函数创建对话框,其中包含多个按钮控件。可以使用CreateWindowEx函数创建更多类型的窗口子类型,例如复选框、单选按钮、组合框等。在Windows编程中,不同类型的窗口子类型都有各自的风格和消息处理函数,需要根据实际需求选择合适的窗口子类型。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值