day2 – 窗口的创建

本文介绍了Windows程序设计的基本步骤,包括设计窗口类、创建窗口、显示和更新窗口、建立消息循环以及实现窗口过程函数。窗口处理函数用于响应系统消息,如WM_DESTROY消息,触发窗口关闭。注册窗口类并使用CreateWindowEx创建窗口,最后通过ShowWindow和UpdateWindow显示和更新窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建窗口的六要素

  • 设计注册窗口类
  • 创建窗口
  • 显示窗口
  • 更新窗口
  • 建立消息循环
  • 实现窗口过程函数(窗口回调函数、消息处理函数)

@err,hr 获取错误信息

(unsigned long)(tib+0x34),hr 获取错误信息(vc6)

定义winMain函数

我们在新添加的空的cpp文件中,添加如下程序入口的wWinMain函数:

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR    lpCmdLine,
_In_ int       nCmdShow)
{
}

这里我们先介绍下WinMain函数的几个参数:

  • hInstance —— 当前程序的实例句柄,也就是目前程序所在的内存的位置。
  • hPrevInstance ——当前程序的前一个程序实例句柄,目前已经废弃,不再使用。
  • lpCmdLine —— 命令行参数,我们执行程序时可以用命令行的形式传入一些参数。
  • nCmdShow —— 窗口的显示方式,最大化、最小化那种。

定义窗口处理函数

窗口处理函数用来为系统回调函数,主要用来处理消息。像我们平常对程序的一系列操作,反应到程序内部,其实都是产生了一系列的操作。比如窗口关闭时会传递窗口关闭的消息,窗口最大化时也会传递最大化的消息,包括我们拖动窗口都会产生消息。而我们定义的窗口处理函数就是处理操作上述的消息,如下面所示,我们定义的窗口处理函数处理了一个WM_DESTROY消息,这是我们在关闭窗口时发送的消息,被我们的窗口处理函数捕获之后,会调用系统的APIPostQuitMessage(0),使窗口退出。

窗口处理函数共有四个参数:

  • hWnd —— 是窗口的句柄。
  • uMsg —— 是传入的消息,它的本质就是无符号整形的数字。
  • wParam、lParam —— 是消息附带的两个参数。
//窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_DESTROY:
        PostQuitMessage(0);//可以使GetMessage返回0
        break;
        default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

编写窗口注册函数

个窗口,在创建之前需要先向操作系统进行注册,这类似现实生活中我们开公司,要先向工商局进行注册一样。wce是一个WNDCLASSEX 类型的结构体,这就是一个窗口类,包含了我们所需要的窗口信息,包括菜单、图标、背景色等等。它最主要的是两个成员,hInstance是当前程序的实例句柄,lpszClassName是我们注册的类名称,其他的这里不再解释,可参照MSDN。

我们通过RegisterClassEx()这个API将窗口类在操作系统中进行注册,并通过其返回值判断是否注册成功。我们在WinMain函数中进行窗口的注册工作,请看下面的代码:

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR    lpCmdLine,
_In_ int       nCmdShow)
{
    //注册窗口类
    WNDCLASSEX wce = { 0 };
    wce.cbSize = sizeof(wce);
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hIconSm = NULL;
    wce.hInstance = hInstance;
    wce.lpfnWndProc = wndProc;
    wce.lpszClassName = "Main";
    wce.lpszMenuName = NULL;
    wce.style = CS_HREDRAW | CS_VREDRAW;
    ATOM nAtom = RegisterClassEx(&wce);
    if (!nAtom )
    {
        MessageBox(NULL, "注册失败", "Infor", MB_OK);
        return 0;
    }
}

创建窗口

接下来我们创建窗口,创建窗口我们使用CreateWindowEx系统API,请留意下面它的第2、3两个参数,第二个参数使我们之前注册的窗口类名称,第三个参数是窗口的标题名称,其他的是一些窗口显示的参数,这里不再详细解释。

HWND hWnd = CreateWindowEx(0, "Main", "Window",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);

作业需求得用非模态,模态用注释

更新和显示

ShowWindow(hWnd, SW_SHOW);

UpdateWindow(hWnd);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值