• 如何画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;
    }


    从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
  • 相关阅读:
    leetcode44:wildcard
    Python实现决策树
    PCA实现
    js触摸事件
    js中的getBoundingClientRect()函数
    Java中timer的schedule()和schedualAtFixedRate()函数的区别
    nodejs中的exports和module.exports
    为什么MySQL数据库要用B+树存储索引
    浅谈微服务中的熔断,限流,降级
    缓存击穿、缓存穿透和缓存雪崩
  • 原文地址:https://www.cnblogs.com/feizianquan/p/15101314.html
Copyright © 2020-2023  润新知