有没有办法一次运行 3 个创建窗口函数?
Is there a way I can run 3 CreateWindow functions at once?
我正在开发我的新程序,询问用户是否同意这些条款。
我的程序正在创建一个带有复选框的黑色窗口,当用户选中该复选框时, 创建了一个名为"运行"的按钮。 我的问题是我无法更改复选框旁边的静态文本的颜色,我必须首先创建复选框,然后创建和更改静态文本。
让我解释一下,我的WM_CREATE正在使用三个 CreateWindow 函数,一个是复选框,然后是"运行"按钮,最后一个是复选框旁边的静态文本。 现在,当我首先创建按钮时,按钮工作良好,我可以检查和取消选中它,但静态文本效果不佳。 对于静态文本,我删除了他的背景并用WM_CTLCOLORSTATIC更改了他的颜色,但背景没有删除,颜色也没有删除。
现在,当我首先创建文本时,文本运行良好,颜色和背景已更改,并且按钮不起作用,我无法选中或取消选中它。
请尝试调试我的程序,这很难解释。 您需要尝试在WM_CREATE中的两个功能之间切换,尝试创建第一个文本,然后您可以看到复选框无法正常工作。
我的整个程序:
#include <windows.h>
#include <iostream>
#include <thread>
using namespace std;
// Text
#define IDC_STATIC 1
// Buttons
#define IDC_BUTTON 2
HWND agree, button1, text;
LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM param, LPARAM lparam);
int WINAPI WinMain(HINSTANCE currentInstance, HINSTANCE previousInstance, PSTR cmdLine, INT cmdCount)
{
// Register the window class
const char* CLASS_NAME = "myWin32WindowClass";
WNDCLASS wc{};
wc.hInstance = currentInstance;
wc.lpszClassName = CLASS_NAME;
wc.hIcon = 0;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = CreateSolidBrush(RGB(20, 20, 20));
wc.lpfnWndProc = WindowProcessMessages;
RegisterClass(&wc);
HWND main = CreateWindow(CLASS_NAME, "WastedBit 1.6.2",
WS_VISIBLE, // Window style
CW_USEDEFAULT, CW_USEDEFAULT, // Window initial position
950, 750, // Window size
nullptr, nullptr, nullptr, nullptr);
// TopMost
SetWindowPos(main, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
// Window loop
MSG msg{};
while (GetMessage(&msg, nullptr, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_CREATE: {
button1 = CreateWindow("button", 0, WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 20, 490, 15, 15, hwnd, (HMENU)1, ((LPCREATESTRUCT)lparam)->hInstance, NULL);
agree = CreateWindow("button", "RUN", WS_CHILD, 750, 525, 150, 150, hwnd, 0, 0, 0);
text = CreateWindow("static", "By checking this button, you agree to the terms above", WS_CHILD | WS_VISIBLE, 30, 490, 150, 150, hwnd, (HMENU)IDC_STATIC, 0, 0);
}
break;
case WM_COMMAND: {
BOOL checked = IsDlgButtonChecked(hwnd, 1);
if (checked) {
CheckDlgButton(hwnd, 1, BST_UNCHECKED);
ShowWindow(agree, SW_HIDE);
}
else {
CheckDlgButton(hwnd, 1, BST_CHECKED);
ShowWindow(agree, SW_SHOW);
}
}
break;
case WM_DESTROY: {
PostQuitMessage(0);
}
break;
case WM_CTLCOLORSTATIC: {
if ((HWND)lparam == GetDlgItem(hwnd, IDC_STATIC))
{
SetBkMode((HDC)wparam, TRANSPARENT);
SetTextColor((HDC)wparam, RGB(400, 0, 0));
return (BOOL)GetStockObject(NULL_BRUSH);
}
break;
}
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
}
我尝试将其与无价值的功能一起使用,但仍然相同。
您的问题是您具有相同的子窗口标识符。
改变:
button1 = CreateWindow("button", 0, WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 20, 490, 15, 15, hwnd, (HMENU)1, ((LPCREATESTRUCT)lparam)->hInstance, NULL);
到某事:
#define ID_BUTTON_2 101
button1 = CreateWindow("button", 0, WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 20, 490, 15, 15, hwnd, (HMENU)ID_BUTTON_2, ((LPCREATESTRUCT)lparam)->hInstance, NULL);
当你收到WM_COMMAND
时,你应该检查WM_COMMAND
来源。
您创建了 3 个控件,因此,它们可以向您发送WM_COMMAND
.
WM_COMMAND
源可以从控制ID(CreateWindow
的参数HMENU
(知道。
这是快速修复。
case WM_COMMAND:
if( wparam == 1 ) {
BOOL checked = IsDlgButtonChecked(hwnd, 1);
if (checked) {
CheckDlgButton(hwnd, 1, BST_UNCHECKED);
ShowWindow(agree, SW_HIDE);
}
else {
CheckDlgButton(hwnd, 1, BST_CHECKED);
ShowWindow(agree, SW_SHOW);
}
}
}
break;
相关文章:
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 如何创建函数管道,以便函数一个接一个地运行?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- cout 新创建的对象引发运行时错误
- 创建 QtChart 对象会在运行时创建EXC_BAD_ACCESS错误
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- 在编译时而不是运行时创建一个由两个字节组成的值
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 有没有办法一次运行 3 个创建窗口函数?
- 如何在运行时创建和命名对象?
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- 如何在运行时对程序创建的.sys文件设置文件版本
- 参数包推导不一致 int 和 int& 在可变参数模板化成员函数中创建运行成员函数的线程
- 在函数中创建的数组,编译时还是运行时?
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- C++程序将进程置于前台(如果已在运行),否则创建一个新进程
- 在运行时创建和更改游戏状态
- 使用Visual c++ 2010 Express在其他Windows计算机上运行创建静态/发布构建