Как структурировать C ++ программы Windows API, такие как C # WinForms - PullRequest
3 голосов
/ 19 октября 2011

Я опытный программист C # на GUI и имею некоторый опыт работы с C / C ++ только для CLI.

Я учу себя нативному Windows API, используя C ++. Я могу создавать окна с кнопками и полями ввода и т.д .; выполнять действия при нажатии кнопок, наборе текста и т. д.

Однако все, что я до сих пор делал, было в одном файле 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 #.

Я не нашел много учебников или примеров кода для собственного API Windows, которые бы показали, как это обычно делается.

Может кто-нибудь опубликовать какой-нибудь скелетный код и / или ссылку на учебник, который объясняет, как это обычно делается?

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Я использовал свой собственный класс 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);
    }
};

Также обязательно укажите условие выхода.

2 голосов
/ 19 октября 2011

Windows API сам по себе C, а не C ++.

Для C ++ может потребоваться использовать MFC (не рекомендуется) или управляемый .NET (не собственный C ++) или одну из нескольких других библиотек, таких как QT, а также совершенно новую среду выполнения Windows (которая поставляется сWindows 8 http://msdn.microsoft.com/en-us/library/windows/apps/hh464942%28v=vs.85%29.aspx)

1 голос
/ 19 октября 2011

Если вы хотите изучить структуру, которая существует как простая оболочка C ++ для winapi, посмотрите WTL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...