如何在按下另一个按钮时创建一个按钮并隐藏另一个按钮
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);
}
我也尝试过使用 UpdateWindow
和 InvalidateRect
。
问题 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);
}
(问题在最下方)
我正在尝试编写一个只有一个按钮的程序。如果按下这个按钮,它应该创建一个新按钮,并删除另一个按钮,你会看到这里:
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);
}
我也尝试过使用 UpdateWindow
和 InvalidateRect
。
问题 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);
}