【问题标题】:MFC button onclick handlerMFC 按钮 onclick 处理程序
【发布时间】: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 但它也有相同的行为,一旦按钮从禁用状态切换到启用状态,就会调用处理程序,因此尝试隐藏控件。

标签: c++ events mfc


【解决方案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;
}

它会起作用,但“正确的程序员”看到这个会尖叫! 祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多