如何画Windows窗体

初始化窗体 函数

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

第一个参数是 装载基地址 MZ头 第二个参数  输入命令行 

接着需要注册窗口

WNDCLASSEXW wcex;

这里写一个函数来初始化他

lpfnWndProc 需要一个 函数指针 这些需要提前声明

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

 

//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;//风格
    wcex.lpfnWndProc = WndProc;//函数指针
    wcex.cbClsExtra = 0;//额外空间
    wcex.cbWndExtra = 0;//额外空间
    wcex.hInstance = hInstance;//实列句柄
    wcex.hIcon =NULL;//图标
    wcex.hCursor = NULL;//光标
    wcex.hbrBackground = NULL;//背景
    wcex.lpszMenuName = NULL;//菜单
    wcex.lpszClassName = L"test";//类名 窗口类名 类名唯一
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);//注册
}

注册完后接着要 创建窗体

  HWND hWnd = CreateWindowW(L"test", //类名
        L"TEST",//标题
        WS_OVERLAPPEDWINDOW,//风格
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //坐标尺寸
        NULL, NULL, hInstance, NULL);//父窗口,菜单,实例句柄
//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance)
{


    HWND hWnd = CreateWindowW(L"test", //类名
        L"TEST",//标题
        WS_OVERLAPPEDWINDOW,//风格
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //坐标尺寸
        NULL, NULL, hInstance, NULL);//父窗口,菜单,实例句柄

    if (!hWnd)
    {
        return FALSE;
    }

    ShowWindow(hWnd, SW_SHOW);//显示更新窗口
    UpdateWindow(hWnd);

    return TRUE;
}

接着取消息 GetMessage 利用这个函数

GetMessageW(
    _Out_ LPMSG lpMsg,
    _In_opt_ HWND hWnd,
    _In_ UINT wMsgFilterMin,
    _In_ UINT wMsgFilterMax);
#ifdef UNICODE
lpMsg 这个属于哪个窗口    第2个 就是 拿这个窗口句柄的消息 null就是拿所有  第3个 4个 属于拿的消息范围 0默认所有消息都处理
拿到消息需要处理 并循环接收消息
整体代码就是
// WindowsProject1.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "WindowsProject1.h"


LRESULT CALLBACK    WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;//风格
    wcex.lpfnWndProc = WndProc;//函数指针
    wcex.cbClsExtra = 0;//额外空间
    wcex.cbWndExtra = 0;//额外空间
    wcex.hInstance = hInstance;//实列句柄
    wcex.hIcon = NULL;//图标
    wcex.hCursor = NULL;//光标
    wcex.hbrBackground = NULL;//背景
    wcex.lpszMenuName = NULL;//菜单
    wcex.lpszClassName = L"test";//类名 窗口类名
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);//注册
}


BOOL InitInstance(HINSTANCE hInstance)
{


    HWND hWnd = CreateWindowW(L"test", //类名
        L"TEST",//标题
        WS_OVERLAPPEDWINDOW,//风格
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //坐标尺寸
        NULL, NULL, hInstance, NULL);//父窗口,菜单,实例句柄

    if (!hWnd)
    {
        return FALSE;
    }

    ShowWindow(hWnd, SW_SHOW);//显示更新窗口
    UpdateWindow(hWnd);

    return TRUE;
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    MyRegisterClass(hInstance);
    InitInstance(hInstance);

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
            DispatchMessage(&msg);//自动区分子窗体消息

    }
}

可以自定义消息处理

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 



posted @ 2021-08-04 23:31  紅人  阅读(214)  评论(0编辑  收藏  举报