c++ - 如何构造像 C# WinForms 这样的 C++ Windows API 程序

标签 c++ windows winapi

我是一位经验丰富的 GUI C# 程序员,并且仅在 CLI 方面拥有一些 C/C++ 经验。

我正在使用 C++ 自学原生 Windows API。我能够创建带有按钮和输入字段等的窗口;在单击按钮和键入文本等时执行操作。

但是,到目前为止,我所做的一切都在一个单独的 c 或 cpp 文件中,而没有使用类。

在 C# 中,我会创建扩展 Form 的类:

public class MyForm : Form { }

然后像这样打开它:

MyForm myForm = new MyForm();
myForm.ShowDialog();

或:

new MyForm().ShowDialog();

或:

Application.Run(new MyForm());

然而,使用我的平面文件 c/cpp 方法,我只有一个 WinMain,它注册了我的窗口类,创建了窗口,然后消息循环就消失了。当我学习非常基础的知识时,这对于小程序来说并不可怕,但显然我希望像在 C# 中那样把东西布置得更好一些。

我还没有找到很多 native Windows API 的教程或代码示例来说明这通常是如何完成的。

有人可以发布一些框架代码和/或链接到解释这通常是如何完成的教程吗?

最佳答案

我使用了自己的 Window 类,如下所示。这是 a reply I poseted for a different question但您可能会发现这很有用。所以这里是:

#pragma once

#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

static const char *g_AppName  = "Test";

class CMyWindow
{
    HWND  _hWnd;
    int _width;
    int _height;
public:
    CMyWindow(const int width,const int height):_hWnd(NULL),_width(width),_height(height)
    {
        _beginthread( &CMyWindow::thread_entry, 0, this);
    }

    ~CMyWindow(void)
    {
        SendMessage(_hWnd, WM_CLOSE, NULL, NULL);
    }


private:
    static void thread_entry(void * p_userdata)
    {
        CMyWindow * p_win = static_cast<CMyWindow*> (p_userdata);
        p_win->create_window();
        p_win->message_loop();
    }

    void create_window()
    {
        WNDCLASSEX wcex;

        wcex.cbSize         = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = &CMyWindow::WindowProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = GetModuleHandle(NULL);
        wcex.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = g_AppName;
        wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

        RegisterClassEx(&wcex);

        _hWnd = CreateWindow(g_AppName, g_AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, GetModuleHandle(NULL), NULL);

        ShowWindow(_hWnd, SW_SHOWDEFAULT);
        UpdateWindow(_hWnd);
    }

    void message_loop()
    {
        MSG msg = {0};

        while (GetMessage(&msg, NULL, 0, 0))
        {
            if(msg.message == WM_QUIT)
            {
                break;
            }

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    static LRESULT WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_POWERBROADCAST:
            {
                //power management code here
            }

        }

        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
};

还要确保包含退出条件。

关于c++ - 如何构造像 C# WinForms 这样的 C++ Windows API 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816267/

相关文章:

C++ 3 级映射

c++ - 重载的构造函数对于移动和复制是非法的

windows - 如何设置 Chocolatey 将应用程序安装到另一个驱动器上?

c++ - Windows api,是用C还是C++写的?

windows - ImageList_Add 在由 pcAnywhere 控制的 PC 上返回 -1

c++ - 在每台计算机上生成相同的随机排列

c++ - iphone 上的 pragma pack(push)

r - 如何更改英文工作日缩写?

winapi - 如何使用 win32 API 更改组合框的颜色

c++ - 什么消息导致按钮发送 WM_COMMAND 消息