user1002358
user1002358

Reputation: 2942

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

I'm an experienced GUI C# programmer and have some experience with C/C++ for CLI only.

I'm teaching myself native Windows API using C++. I am able to create windows with buttons and input fields, etc; perform actions when buttons are clicked and text is typed, etc.

However, everything I've done so far has been in a single c or cpp file without using classes.

In C#, I would create classes which extend Form:

public class MyForm : Form { }

and then open it like this:

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

or:

new MyForm().ShowDialog();

or:

Application.Run(new MyForm());

however using my flat-file c/cpp method I just have a WinMain which registers my window class, creates the window, and the message loop just churns away. It's not awful for small programs while I'm learning the very basics, but obviously I would want to have things laid out a little nicer like I do in C#.

I haven't found many tutorials or code samples for native Windows API that show how this is generally done.

Can someone please either post some skeleton code and/or link to a tutorial which explains how this is generally accomplished?

Upvotes: 4

Views: 886

Answers (3)

Steve Barna
Steve Barna

Reputation: 1398

If you want to study a framework that exists as a simple C++ wrapper for winapi, check out WTL.

Upvotes: 1

Indy9000
Indy9000

Reputation: 8881

I have used my own Window class similar to what's shown below. This is a reply I poseted for a different question but you might find this useful. So here it is:

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

Also make sure to include an exit condition.

Upvotes: 2

RED SOFT ADAIR
RED SOFT ADAIR

Reputation: 12238

Windows API itself is C, not C++.

For C++, may want to use MFC (not recommended), or managed .NET (not native C++) or one of several other libraries such as QT, as well as the brand new Windows Runtime (that comes with Windows 8 http://msdn.microsoft.com/en-us/library/windows/apps/hh464942%28v=vs.85%29.aspx)

Upvotes: 2

Related Questions