作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是一位经验丰富的 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# 中那样把东西布置得更好一些。
我还没有找到很多 native Windows API 的教程或代码示例来说明这通常是如何完成的。
有人可以发布一些框架代码和/或链接到解释这通常是如何完成的教程吗?
最佳答案
我使用了自己的 Window 类,如下所示。这是 a reply I poseted for a different question但您可能会发现这很有用。所以这里是:
#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);
}
};
还要确保包含退出条件。
关于c++ - 如何构造像 C# WinForms 这样的 C++ Windows API 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816267/
我是一名优秀的程序员,十分优秀!