c++ - WinAPI GUI 看起来很奇怪。应使用默认的 Windows 样式
问题描述
我正在尝试使用选项卡控件制作一个简单的窗口 GUI。问题是 GUI 在某种程度上没有将默认的 Windows 样式应用于按钮。我该如何解决?
#include <Windows.h>
#include <CommCtrl.h>
#pragma comment(lib, "Comctl32.lib")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS")
#define ID_TABCTRL 1
#define ID_EDIT 2
#define BTN_ADD 3
#define BTN_DEL 4
#define BTN_CLR 5
#define MAX_TAB_LEN 15
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
TCITEMW tie;
wchar_t text[4];
LRESULT count, id;
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&icex);
HWND hTab, hEdit;
hTab = CreateWindowExW(0, WC_TABCONTROLW, nullptr, WS_CHILD | WS_VISIBLE,
0, 0, 200, 150, hwnd, (HMENU)ID_TABCTRL, nullptr, nullptr);
hEdit = CreateWindowExW(0, WC_EDITW, nullptr, WS_CHILD | WS_VISIBLE | WS_BORDER,
250, 20, 100, 25, hwnd, (HMENU)ID_EDIT, nullptr, nullptr);
SendMessageW(hEdit, EM_SETLIMITTEXT, MAX_TAB_LEN, 0);
CreateWindowExW(0, WC_BUTTONW, L"Add", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
250, 50, 100, 25, hwnd, (HMENU)BTN_ADD, nullptr, nullptr);
CreateWindowExW(0, WC_BUTTONW, L"Delete", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
250, 80, 100, 25, hwnd, (HMENU)BTN_DEL, nullptr, nullptr);
CreateWindowExW(0, WC_BUTTONW, L"Clear", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
250, 110, 100, 25, hwnd, (HMENU)BTN_CLR, nullptr, nullptr);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd
)
{
const wchar_t g_szClassName[] = L"MainForm";
// Register the window class
WNDCLASSEXW wc;
wc.cbSize = sizeof(WNDCLASSEXW);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(nullptr, IDI_APPLICATION);
wc.hCursor = LoadCursorW(nullptr, IDC_ARROW);
wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
wc.lpszMenuName = nullptr;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIconW(nullptr, IDI_APPLICATION);
if (!RegisterClassExW(&wc))
{
MessageBoxW(nullptr, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Create the window
HWND hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, g_szClassName, L"Test", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 840, 520, nullptr, nullptr, hInstance, nullptr);
if (!hwnd)
{
MessageBoxW(nullptr, L"Window Creation Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);
// The message loop
MSG msg;
while (GetMessageW(&msg, nullptr, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return msg.wParam;
}
解决方案
推荐阅读
- javascript - 花括号外的展开运算符有什么作用?
- python-3.x - 优化组合的组合
- laravel - 雄辩地将 json 数组更新为字符串转换失败,但使用 save() 有效
- django - Django STATIC_URL 请求
- python - 使用按键重新启动 While 循环
- rust - Rust std 库中的所有宏都包含在前奏中吗?
- codenameone - 排除未使用的 .class 文件
- asp.net-core - ASP.NET Core 如何根据布尔值将用户重定向到页面
- java - 从 WSJdbcDataSource(连接池)解包 OracleConnection
- laravel - Laravel 模型未路由到视图