WinAPI创建窗口。步骤包括注册窗口类、创建窗口实例、显示窗口,并处理消息循环。可能需要编写窗口过程函数来处理消息,比如WM_PAINT来绘制窗口内容,WM_CLOSE来处理关闭事件。
在 C++ 中如果不使用 MessageBox 创建弹窗,可以使用 Windows API 直接创建自定义窗口。以下是使用纯 Win32 API 创建简单弹窗的示例:
#include <windows.h>
#include <gdiplus.h>
// 声明全局字符串
const wchar_t* g_text = L"这是窗口内的文字输出!";
// 创建自定义字体
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_PAINT: // 窗口需要绘制时触发
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); // 获取设备上下文
// 设置文字颜色为蓝色
SetTextColor(hdc, RGB(0, 0, 100));
// 设置背景模式为透明
SetBkMode(hdc, TRANSPARENT);
// 输出文字(位置:x=50, y=50)
TextOutW(hdc, 50, 50, g_text, wcslen(g_text));
// 虚线画笔示例
HPEN hDashPen = CreatePen(PS_DASH, 1, RGB(128, 128, 128));
SelectObject(hdc, hDashPen);
LineTo(hdc, 400, 400);
DeleteObject(hDashPen);
// 其他可用样式:
// PS_SOLID 实线
// PS_DOT 点线
// PS_DASHDOT 点划线
return 0;
}
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)
{
const char* CLASS_NAME = "CustomWindowClass";
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = TEXT(CLASS_NAME);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
if (!RegisterClass(&wc)) return 0;
// 创建窗口
HWND hwnd = CreateWindowEx(
0, // 扩展样式
TEXT(CLASS_NAME), // 窗口类
"自定义弹窗", // 窗口标题
WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式
CW_USEDEFAULT, CW_USEDEFAULT, // 位置
300, 200, // 大小
NULL, // 父窗口
NULL, // 菜单
hInstance, // 实例句柄
NULL // 附加数据
);
if (!hwnd) return 0;
// 消息循环
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
关键点说明:
窗口类注册:通过 WNDCLASS 定义窗口属性
窗口创建:使用 CreateWindowEx 创建实际窗口
消息循环:处理系统消息的循环结构
窗口过程:WindowProc 处理窗口消息(关闭、绘制等)
如果要创建更复杂的弹窗,可以:
添加按钮控件 (CreateWindow 使用 BUTTON 类)
自定义绘制 (处理 WM_PAINT 消息)
添加图标资源
设置自定义窗口样式
注意事项:
需要链接 user32.lib 和 gdi32.lib
这是最底层的 Windows API 实现
如果使用其他框架(Qt/WxWidgets)会有更简单的实现方式
建议使用现代 GUI 框架的场景:
需要复杂界面时 - 推荐 Qt
需要快速开发时 - 推荐 ImGui
需要跨平台支持时 - 推荐 wxWidgets
这种底层实现方式虽然灵活,但需要处理大量窗口消息和资源管理,建议仅在需要完全控制窗口行为时使用。