【发布时间】:2015-07-07 21:56:37
【问题描述】:
我有 2 个 mfc 按钮,我想在加载 3D stl 文件时隐藏它们,然后在 stl 加载完成时再次显示这些按钮。这是为了防止用户在当前加载时重新加载模型。
代码的sn-p如下
{ // change control state when model loads
((CButton *)this->GetDlgItem(IDC_RELOAD_STOCK_BUTTON))->ShowWindow(SW_HIDE);
((CButton *)this->GetDlgItem(IDOK))->ShowWindow(SW_HIDE);
UpdateWindow();
}
// this process takes few seconds to load the file in the memory
customStockModel.LoadFile(pathName.GetBuffer(pathName.GetLength()));
{
// change control state when the model has loaded
((CButton *)this->GetDlgItem(IDC_RELOAD_STOCK_BUTTON))->ShowWindow(SW_SHOW);
((CButton *)this->GetDlgItem(IDOK))->ShowWindow(SW_SHOW);
UpdateWindow();
}
按钮确实像我预期的那样被隐藏并重新出现,但是当我在按钮区域隐藏时单击它时,当按钮控件重新出现在屏幕上时,onclick 处理程序会立即被调用。似乎单击消息已排队,并且一旦激活按钮,mfc 就会调用处理程序。我在这里做错了什么?
【问题讨论】:
-
使用 EnableWindow 代替 ShowWindow
-
当您的消息处理程序正在执行时,您的消息循环不会运行,也不会处理任何输入。当您的消息处理程序返回时(即在文件加载后),处理将继续。所描述的行为是可以预期的。如果您希望 GUI 在文件加载过程中处理输入,则必须将加载过程卸载到另一个线程。
-
与你的问题无关:你不需要投到
CButton*你可以写this->GetDlgItem(IDC_RELOAD_STOCK_BUTTON))->ShowWindow(SW_HIDE)。 -
不是隐藏按钮,而是使用 EnableWindow 禁用按钮,如下所示:GetDlgItem(IDC_RELOAD_STOCK_BUTTON)->EnableWindow(false)
-
@ScottMcP-MVP 我一开始就有 EnableWindow 但它也有相同的行为,一旦按钮从禁用状态切换到启用状态,就会调用处理程序,因此尝试隐藏控件。