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 处理程序的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MFC 中的多个按钮编写一个消息处理程序?

使用酶测试按钮 onClick 处理程序时遇到问题

在 MFC SDI 应用程序中调用 OnDraw

使用键盘按钮提交网页? [复制]

关于JS修改a标签的onclick方法后修改的JS方法不能使用的问题?

单击按钮路由到下一页[重复]