如何在按下另一个按钮时创建一个按钮并隐藏另一个按钮

How to create a button when another button is pressed and hide the other one

(问题在最下方)

我正在尝试编写一个只有一个按钮的程序。如果按下这个按钮,它应该创建一个新按钮,并删除另一个按钮,你会看到这里:

constexpr unsigned int button1=111;
constexpr unsigned int button2=112;
bool buttonIsPressed = false;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static RECT    rect;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_CREATE:
    {
        GetClientRect(hWnd, &rect);

        CreateWindowEx(NULL,
                L"BUTTON",
              L"create new button",
              WS_TABSTOP | WS_VISIBLE |
              WS_CHILD | BS_DEFPUSHBUTTON,
              /*windowWidth-15,*/
              400,
              rect.bottom - 40,
              100,
              28,
              hWnd,
              (HMENU)button1,
              GetModuleHandle(NULL),
              NULL);

        
        if (buttonIsPressed == true)
        {
        
            CreateWindowEx(NULL,
                L"BUTTON",
              L"Text of the button",
              WS_TABSTOP | WS_VISIBLE |
              WS_CHILD | BS_DEFPUSHBUTTON,
              /*windowWidth-15,*/
              400,
              rect.bottom - 40,
              100,
              28,
              hWnd,
              (HMENU)button2,
              GetModuleHandle(NULL),
              NULL);

        }

    }
    case WM_PAINT:
    {
       
        return 0;
    }
    
    
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case button1:
        {
            buttonIsPressed = true;
            break;
        }
        }
        break;    
    }

    return DefWindowProc(hWnd, message, wParam, lParam);
}


我也尝试过使用 UpdateWindowInvalidateRect

问题 1:如何在按下另一个按钮时创建一个新按钮?

问题 2:如何停止绘制另一个按钮。如果我使用 InvalidateRect,按钮会变得不可见,但只要我按下 window,它就会再次可见。

感谢您的关注和时间。

你很接近。您已经知道如何创建单独的按钮 (CreateWindowEx())。在您显示的代码中,您只需要将第二个 CreateWindowEx()WM_CREATE 处理程序移动到 WM_COMMAND 处理程序中,一定要检查报告的 ID/HWND 以确保这是您感兴趣的第一个按钮,然后您可以根据需要 ShowWindow()/DestroyWindow() 该按钮并创建新按钮,例如:

constexpr unsigned int button1=111;
constexpr unsigned int button2=112;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static RECT rect;
    //...

    switch (message)
    {
        case WM_CREATE:
        {
            GetClientRect(hWnd, &rect);

            CreateWindowEx(NULL,
                L"BUTTON",
                L"create new button",
                WS_TABSTOP | WS_VISIBLE |
                WS_CHILD | BS_DEFPUSHBUTTON,
                /*windowWidth-15,*/
                400,
                rect.bottom - 40,
                100,
                28,
                hWnd,
                (HMENU)button1,
                GetModuleHandle(NULL),
                NULL);

            break;
        }

        //...

        case WM_COMMAND:
        {
            if (HIWORD(wParam) == BN_CLICKED)
            {
                switch (LOWORD(wParam))
                {
                    case button1:
                    {
                        HWND hwndBtn = (HWND)lParam;
                        // use ShowWindow(hwndBtn, SW_HIDE) or DestroyWindow(hwndBtn) as needed... 

                        GetClientRect(hWnd, &rect);

                        CreateWindowEx(NULL,
                            L"BUTTON",
                            L"Text of the button",
                            WS_TABSTOP | WS_VISIBLE |
                            WS_CHILD | BS_DEFPUSHBUTTON,
                            /*windowWidth-15,*/
                            400,
                            rect.bottom - 40,
                            100,
                            28,
                            hWnd,
                            (HMENU)button2,
                            GetModuleHandle(NULL),
                            NULL);

                        break;
                    }

                    case button2:
                    {
                        //...
                        break;
                    }
                }

                return 0;
            }

            break;    
        }
    }

    return DefWindowProc(hWnd, message, wParam, lParam);
}