MFC按钮onclick处理程序

时间:2015-07-07 21:56:38

标签: c++ events mfc

我想要在加载3D stl文件时隐藏2个mfc按钮,然后在stl加载完成时再次显示按钮。这是为了防止用户在正在进行加载时重新加载模型。

代码片段如下

        { // 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就会调用处理程序。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

理想情况下,您应该在一个线程中读取您的文件 - 这将允许您的应用程序正常刷新并处理消息。 现在,如果您对此不确定(多线程 很难),您可以定期调用lenghty函数中的以下函数来清除消息循环。

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;
}

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