【问题标题】:How to update the current state for window after showing/hiding controls?显示/隐藏控件后如何更新窗口的当前状态?
【发布时间】:2020-04-06 17:47:40
【问题描述】:

我是初学者,今天是我学习创建 Windows 应用程序的第一天。 我有两个按钮。

#define BUTTON_SW 1
#define BUTTON_SW2 2
HWND Button1;
HWND Button2;
Button1 = CreateWindow("button", "Enter", WS_VISIBLE | WS_CHILD, 215, 10, 40, 25, hwnd, HMENU(BUTTON_SW), NULL, NULL);   
Button2 = CreateWindow("button", "You'll be gone", WS_VISIBLE | WS_CHILD, 260, 10, 95, 25, hwnd, HMENU(BUTTON_SW2), NULL, NULL);

点击Button1时,如何隐藏Button2或使其失去WS_VISIBLE标志并正确反映当前情况,像这样?

LONG style = GetWindowLong(Button2,GWL_STYLE);
style = style | WS_VISIBLE; // style = style & ~WS_VISIBLE
SetWindowLong(Button2,GWL_STYLE,style);

这很好用。但是,一旦分配了WS_VISIBLE 标志,按钮仍然保持不可见,直到第一次鼠标单击它。 反之亦然,当我使用 style = style & ~WS_VISIBLE; 删除 WS_VISIBLE 标志后,按钮变为被动(不可点击)但保持可见。

如何解决这个问题?尝试了很多我在网上找到但无法修复的东西。另外请不要建议我买一本像样的书,我现在没钱。

(P.S:ShowWindowSW_HIDE/SW_SHOW 的函数对我不起作用,也许我用错了。你能帮我看看如何正确隐藏这个 Button2 吗?我正在尝试遵循命令,但没有任何反应。)

ShowWindow(GetDlgItem(Button2, 2), SW_HIDE);

@Edit:我注意到当我最小化应用程序并最大化它时 再次,按钮状态更新。但是怎么会自动 更新状态?

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    这应该可以工作

    ShowWindow(Button2, SW_HIDE);
    

    ShowWindow(GetDlgItem(DialogHWND, BUTTON_SW2), SW_HIDE);
    

    GetDlgItem 需要父窗口(对话框)的HWND 作为第一个参数。

    【讨论】:

    • 谢谢,看了很多东西,我自己也发现了。但这只是最准确的答案。
    【解决方案2】:

    为了让窗口反映更改,您必须要求操作系统执行此操作。

    了解 RedrawWindowinvalidated 区域。

    请注意,某些操作(例如调整大小或从最小化恢复)会自动使操作系统使该区域无效并重新绘制它。

    用途:

    RedrawWindow(Button2,NULL,NULL,RDW_INVALIDATE | RDW_INTERNALPAINT);
    

    【讨论】:

    • 你能举一个小例子来重绘Button1吗?还是我应该重绘整个窗口?
    • 你能告诉我为什么ShowWindow(GetDlgItem(Button2, 2), SW_HIDE);什么都不做吗?
    • 阅读this Question and its Answers。您需要了解在触发 WM_PAINT 消息之前会累积一些命令。
    • 即使 RedrawWindow()RDW_UPDATENOW 标志也没有重绘当前状态。我仍然需要最小化并恢复它以查看按钮已消失。
    • 我不知道你的其余代码,也许你那里有问题。无论如何,我建议阅读MS docs Painting and Drawing
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多