如何构建c++ Windows API程序,如c# WinForms

How to structure C++ Windows API programs like C# WinForms

本文关键字:API 程序 WinForms Windows c++ 何构建 构建      更新时间:2023-10-16

我是一名经验丰富的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#那样好一点。

我还没有找到很多关于本机Windows API的教程或代码示例来展示通常如何完成。

有人可以张贴一些骨架代码和/或链接到教程,解释这通常是如何完成的?

我使用了我自己的Window类,如下所示。这是我对另一个问题的回答,但你可能会发现这很有用。这里是:

#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);
    }
};

Windows API本身是C,而不是c++。

对于c++,可能想要使用MFC(不推荐),或managed .NET(不是本地c++)或其他几个库之一,如QT,以及全新的Windows运行时(随Windows 8一起http://msdn.microsoft.com/en-us/library/windows/apps/hh464942%28v=vs.85%29.aspx)

如果您想研究一个作为winapi的简单c++包装器存在的框架,请查看WTL。