MFC 按钮 onclick 处理程序
Posted
技术标签:
【中文标题】MFC 按钮 onclick 处理程序【英文标题】:MFC button onclick handler 【发布时间】: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 但它也有相同的行为,一旦按钮从禁用状态切换到启用状态,就会调用处理程序,因此尝试隐藏控件。
【参考方案1】:
理想情况下,您应该在线程中读取您的文件 - 这将允许您的应用程序正常刷新自身并处理消息。 现在,如果您对此不确定(多线程 很难),您可以在长函数中定期调用以下函数来清除消息循环。
BOOL YourClass::DoEvents()
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if (msg.message == WM_QUIT)
return FALSE;
if (!AfxGetApp()->PreTranslateMessage(&msg))
::TranslateMessage(&msg);
::DispatchMessage(&msg);
return TRUE;
它会起作用,但“正确的程序员”看到这个会尖叫! 祝你好运
【讨论】:
以上是关于MFC 按钮 onclick 处理程序的主要内容,如果未能解决你的问题,请参考以下文章