Reputation: 2942
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
Reputation: 1398
If you want to study a framework that exists as a simple C++ wrapper for winapi, check out WTL.
Upvotes: 1
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
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