【问题标题】:Is there a way I can run 3 CreateWindow functions at once?有没有办法一次运行 3 个 CreateWindow 函数?
【发布时间】:2020-03-21 03:00:15
【问题描述】:

我正在开发我的新程序,询问用户是否同意这些条款。

我的程序正在创建一个带有复选框的黑色窗口,当用户选中复选框时, 创建了一个名为“RUN”的按钮。 我的问题是我无法更改复选框旁边的静态文本的颜色,我必须先创建复选框,然后创建并更改静态文本。

让我解释一下,我的 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);
    }
}

我曾尝试将它与无价值的功能一起使用,但还是一样。

【问题讨论】:

  • 您是否考虑过创建多个相互叠加的静态(或其他)控件,并在某些时候隐藏/取消隐藏您需要的控件,而不是做所有这些?这应该与根据某些标准在运行时创建控件具有相同的效果。也不那么笨拙。
  • @PaulMcKenzie 嘿,我做了什么?我只创建了三个 CreateWindow 函数,但我遇到了一些问题,除了我的“RUN”按钮,我不需要隐藏任何东西。
  • 请尝试调试我的程序 -- 没有resource.h文件。
  • @PaulMcKenzie 你可以删除它,它只是我 exe 文件的一个图标。
  • @drescherjm 我会编辑的。

标签: c++ winapi


【解决方案1】:

当您收到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;

【讨论】:

    【解决方案2】:

    您的问题是您有相同的子窗口标识符。

    变化:

    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);
    

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2022-10-21
      • 2022-11-23
      • 1970-01-01
      相关资源
      最近更新 更多