SDK创建一个非模态,无资源窗口

使用SDK来创建一个非模态的窗口,不涉及资源,只用注册一个窗口类,创建窗口,显示窗口,然后建立一个消息循环就够了。

首先我们使用SDK创建窗口或者是控件都需要用到类,其他的控件都有系统注册好的类,直接拿来用就可以,窗口的类我们可以自己定义然后注册就可以用了。

第一步:注册一个窗口类

SDK创建一个非模态,无资源窗口_第1张图片

我们看到,窗口程序用的是WinMain而不是控制台程序的main,把代码贴出来看一下

//1.注册窗口类
WNDCLASS wcs = {};
wcs.lpszClassName = L"窗口类名";            //创建的窗口的类名
wcs.style = CS_HREDRAW | CS_VREDRAW;       //窗口的风格
wcs.lpfnWndProc = WindowProc;              //窗口的回调函数
wcs.hbrBackground = HBRUSH(COLOR_BACKGROUND + 1);    //窗口的背景颜色,每次刷新之后填充的颜色就是这个

RegisterClass(&wcs);                       //注册我们定义好的窗口类

第二步:创建窗口
SDK创建一个非模态,无资源窗口_第2张图片

//2.创建窗口
    HWND hWnd = CreateWindow(L"窗口类名",//要用哪个类来创建窗口
        L"My fiast Window",//创建的窗口的窗口名
        WS_OVERLAPPEDWINDOW,//窗口的风格,WS_OVERLAPPEDWINDOW风格是创建一个顶层窗口
        100,
        100,
        500,
        500,//这四个参数表示窗口的坐标和宽高
        NULL,//父窗口的句柄
        NULL,//菜单
        hInstance,//实例句柄
        NULL//WM_CREATE消息的附加消息
        );

第三步:显示窗口

这里写图片描述

第四步:创建消息循环机制
SDK创建一个非模态,无资源窗口_第3张图片

//4.创建消息循环机制
    MSG msg = {};

    while (GetMessage(&msg,//一个MSG结构体,包含许多消息信息
        NULL,//获取那个窗口的消息,如果写NULL则表示获取当前线程的所有消息
        NULL,//设置获取消息范围的最小值
        NULL//设置获取消息范围的最小值
        ))
    {
        DispatchMessage(&msg); //消息分发函数,把消息分发给对应的处理函数
    }

GetMessage()可以从消息队列中获取一个消息,DispatchMessage()就会把消息分发给对应的窗口回调

然后我们还需要一个窗口回调函数

SDK创建一个非模态,无资源窗口_第4张图片

在窗口回调函数中可以响应各种消息,然后做出消息处理,不能处理的消息全都通过DefWindowProc()函数再返还给系统去处理,窗口回调函数的原型可以通过MSDN去查找

LRESULT CALLBACK WindowProc(
    _In_  HWND hwnd,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
    )
{
    switch (uMsg)
    {
    case WM_CREATE:
    {
        MessageBox(hwnd, L"hahahah", L"创建了一个对话框", MB_OK);
    }
        break;
    case WM_CLOSE:
    {
        PostQuitMessage(WM_QUIT);
    }
        break;
    default:

        break;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

你可能感兴趣的:(思想,技术,C语言)