如何构建c++ Windows API程序,如c# WinForms
How to structure C++ Windows API programs like C# WinForms
我是一名经验丰富的GUI c#程序员,并且有一些仅用于CLI的C/c++经验。
我正在用c++自学本地Windows API。我能够创建与按钮和输入字段等窗口;当按钮被点击和文本被输入时执行操作,等等
然而,到目前为止,我所做的一切都是在一个单独的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#那样好一点。
我还没有找到很多关于本机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 = 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);
}
};
Windows API本身是C,而不是c++。
对于c++,可能想要使用MFC(不推荐),或managed .NET(不是本地c++)或其他几个库之一,如QT,以及全新的Windows运行时(随Windows 8一起http://msdn.microsoft.com/en-us/library/windows/apps/hh464942%28v=vs.85%29.aspx)
如果您想研究一个作为winapi的简单c++包装器存在的框架,请查看WTL。
相关文章:
- 在Windows 10上使用Visual Studio 2019构建的Tesseract API c ++程序在Wind
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- 程序在对mouse_event的 Windows API 调用中冻结
- 如何使用 ALSA API 在应用程序中在单声道和立体声之间切换声音输出?
- 当某些应用程序处于全屏模式时,DesktopDuplication API会产生黑帧
- 是否有一个Windows驱动程序函数可以执行Windows文件api SeFileAttributes的等效功能
- 使用OpenCV为使用GENICAM API和C++的各种相机创建程序
- c ++ 是否有任何用于列出 Windows 驱动程序管理器控制台中显示的设备驱动程序的 Windows API?
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- Windows 应用程序中的谷歌地图 API
- QT C++使用 QGIS API 的应用程序
- 绑定 API 在服务器程序中究竟做了什么
- 检查任务栏中的当前应用程序吗?(C ,Windows API)
- 如何监视应用程序进行的Windows系统API调用?
- c ++ Win32 API GetMessage 关闭程序在线程内
- 使用Richedit控件时,基于对话框的Win32 API程序将不会显示窗口
- 如何构建c++ Windows API程序,如c# WinForms