如何构build像C#WinForms这样的C ++ Windows API程序

我是一名经验丰富的GUI C#程序员,并且只具有C / C ++ CLI方面的一些经验。

我教自己使用C ++的本地Windows API。 我能够创buildbutton和input字段等窗口; 单击button并input文本时执行操作等。

但是,到目前为止,我所做的一切都是在一个单独的c或cpp文件中,而不使用类。

在C#中,我会创build类扩展Form

 public class MyForm : Form { } 

然后像这样打开它:

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

要么:

 new MyForm().ShowDialog(); 

要么:

 Application.Run(new MyForm()); 

然而,使用我的平面文件c / cpp方法,我只是有一个WinMain注册我的窗口类,创build窗口,消息循环只是搅动了。 在我学习基础知识的时候,对于小程序来说并不是很糟糕,但是显然我会希望把事情做的更好,就像我在C#中所做的那样。

我还没有find许多教程或代码示例本地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 = GetmoduleeHandle(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, GetmoduleeHandle(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(不推荐)或托管.NET(不是本机C ++),或者其他几个库之一(如QT),以及全新的Windows运行时(Windows 8附带的http:// msdn.microsoft.com/en-us/library/windows/apps/hh464942%28v=vs.85%29.aspx )

如果你想研究一个作为winapi的简单C ++包装的框架,请查看WTL 。