c++ - 设置复选框选项 C++
问题描述
我有以下代码,用 C++ 编写,而不是只有一个复选框说“显示标题”,我希望能够为不同/更多复选框传递多个字符串。如何为多个复选框为 CreateWindowW 函数提供多个字符串?并且 CreateWindowW 函数应该在 Select 函数中修改还是在 WndProc 函数中修改?
void Select(vector<string>& ret)
{
HINSTANCE hInstance = NULL; //NULL = the current process
WNDCLASSW wc = { 0 };
MSG msg;
wc.lpszClassName = L"Check Box";
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(0, IDC_ARROW);
RegisterClassW(&wc);
CreateWindowW(wc.lpszClassName, L"Check Box",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
150, 150, 230, 150, 0, 0, hInstance, 0);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
bool checked = true;
switch (msg) {
case WM_CREATE:
CreateWindowW(L"button", L"Show Title",
WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
20, 20, 185, 35, hwnd, (HMENU)1,
NULL, NULL);
CheckDlgButton(hwnd, 1, BST_CHECKED);
break;
case WM_COMMAND:
checked = IsDlgButtonChecked(hwnd, 1);
if (checked) {
CheckDlgButton(hwnd, 1, BST_UNCHECKED);
SetWindowTextW(hwnd, L"");
}
else {
CheckDlgButton(hwnd, 1, BST_CHECKED);
SetWindowTextW(hwnd, L"Check Box");
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
编辑:这是新代码
void columnSelect(vector<string>& ret)
{
HINSTANCE hInstance = NULL; //NULL = the current process
WNDCLASSW wc = { 0 };
MSG msg;
wc.lpszClassName = L"Check Box";
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(0, IDC_ARROW);
RegisterClassW(&wc);
CreateWindowW(wc.lpszClassName, L"Check Box",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
150, 150, 230, 150, 0, 0, hInstance, &ret);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
bool checked = true;
switch (msg) {
case WM_CREATE: {
LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
vector<string> *strings = reinterpret_cast<vector<string>*>(lpcs->lpCreateParams);
for (int i = 0; i != strings->size(); i++)
{
CreateWindowA("button", (*strings)[i].c_str(),
WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
20, 20, 185, 35, hwnd, (HMENU)1,
NULL, NULL);
CheckDlgButton(hwnd, 1, BST_CHECKED);
}
break;
}
case WM_COMMAND: {
checked = IsDlgButtonChecked(hwnd, 1);
if (checked) {
CheckDlgButton(hwnd, 1, BST_UNCHECKED);
SetWindowTextW(hwnd, L"");
}
else {
CheckDlgButton(hwnd, 1, BST_CHECKED);
SetWindowTextW(hwnd, L"Check Box");
}
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
解决方案
如何
CreateWindowW
为多个复选框提供多个字符串?
CreateWindow()
每次调用只能创建 1 个窗口/控件。您将不得不手动拆分字符串,然后CreateWindow()
为每个单独的复选框单独调用。
假设您vector<string>
包含复选框字符串,您可以通过 的参数将 传递vector
给您的窗口,然后在您的消息处理程序中访问它,例如:lpParam
CreateWindow()
WM_CREATE
void Select(vector<string>& ret)
{
...
CreateWindowW(..., &ret);
...
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE: {
LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
vector<string> *strings = reinterpret_cast<vector<string>*>(lpcs->lpCreateParams);
// use strings as needed ...
break;
}
...
}
...
}
推荐阅读
- laravel - 在 Live Server 上切换 git 存储库
- laravel - 反序列化购物车数据不起作用 Laravel
- c# - 在 Mac 上的 C# 中更改控制台背景颜色
- reactjs - 无法向 Linkedin 应用程序添加权限并收到错误未经授权的_scope_error
- python - 在 conda 和 VS Code 中导入 Opencv 模块,但在 VsCode 和 IDLE 中未导入非 IDLE 和 Libs
- scala - Spark Scala:取消列保持相同的列DataType
- cumulocity - 累积文件存储库
- java - Groovy:在 LinkedHasMap 中创建添加对象
- powershell-5.0 - Powershell 5 Get-content命令使用select-string命令从文本文件中选择特定单词我得到整行
- jquery - Rails 和 jQuery - 如何在所有时区显示相同的日期?