3

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?

Christian Rau
  • 45,360
  • 10
  • 108
  • 185
user1002358
  • 2,852
  • 6
  • 22
  • 32

3 Answers3

2

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)

RED SOFT ADAIR
  • 12,032
  • 10
  • 54
  • 92
  • 8
    If you like C++, you wont use MFC. Its a totally misunderstood approach of the language full with macros, incompatibilities etc. and also matured - Thanks for down voting... – RED SOFT ADAIR Oct 19 '11 at 09:49
2

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.

Community
  • 1
  • 1
Indy9000
  • 8,651
  • 2
  • 32
  • 37
1

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

Steve Barna
  • 1,378
  • 3
  • 13
  • 23