【问题标题】:Graying out a wizard's Close button in WTL在 WTL 中灰显向导的关闭按钮
【发布时间】:2012-07-18 11:20:07
【问题描述】:

我正在编写一个 WTL Aero 向导,我想将窗口的关闭按钮设为灰色(其第一步不需要用户交互且无法取消,因此禁用该按钮非常合适)。

输入以下代码:

CMenuHandle pMenu = GetSystemMenu(FALSE);
pMenu.EnableMenuItem(SC_CLOSE, FALSE);

OnInitDialog 中不起作用,因为该过程在窗口本身显示在屏幕上之前被调用(EnableMenuItem 中的ATLASSERT(::IsMenu(m_hMenu)); 断言在运行时被触发)。

有没有一种优雅的方式来禁用关闭按钮? (我是 WTL 初学者,我希望解决方案尽可能简洁)。

这是向导页面代码的最小版本:

#include "stdafx.h"

class MainPage : public CAeroWizardPageImpl<MainPage> {
public:
    BEGIN_MSG_MAP(MainPage)
        MESSAGE_HANDLER_EX(WM_INITDIALOG, OnInitDialog)
        CHAIN_MSG_MAP(__super)
    END_MSG_MAP()

    enum {
        IDD = IDR_MAINFRAME
    };

    MainPage() : CAeroWizardPageImpl<MainPage>(IDR_MAINFRAME) {
        /* Set the wizard's title */
        m_headerTitle.LoadString(IDS_INSTALLHEADER);
        SetHeaderTitle(m_headerTitle);
    }
private:
    CString m_headerTitle;
    LRESULT OnInitDialog(UINT message, WPARAM wParam, LPARAM lParam) {
        UNREFERENCED_PARAMETER(message);
        UNREFERENCED_PARAMETER(wParam);
        UNREFERENCED_PARAMETER(lParam);

        /* Disable the wizard buttons and center the window */
        ShowWizardButtons(0, 0);
        EnableWizardButtons(PSWIZB_BACK, 0);
        CenterWindow();
        return TRUE;
    }
};

【问题讨论】:

    标签: c++ wtl


    【解决方案1】:

    关闭 [X] 按钮是Common Controls 向导属性表类的一部分。你不应该改变它的表现和行为。您可以做的是处理PSN_QUERYCANCEL 通知并防止向导关闭。使用 WTL 很容易,但是您需要知道有两个版本的通知处理程序可用。

    如果定义了_WTL_NEW_PAGE_NOTIFY_HANDLERS,通常在stdafx.h中,那么你可以这样做:

    class MainPage :
        public CAeroWizardPageImpl<MainPage>
    {
    // ...
        INT OnQueryCancel()
        {
            return 1; // Zero to Allow Wizard Close
        }
    };
    

    否则,使用旧语法:

    class MainPage :
        public CAeroWizardPageImpl<MainPage>
    {
    // ...
        BOOL OnQueryCancel()
        {
            return FALSE; // Allow Wizard Close?
        }
    };
    

    除了防止取消/关闭之外,您还可以通过显示一个消息框来表明这一点,建议您等待待处理的操作完成,或者显示通知(例如,闪烁静态控件等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2023-03-18
      • 1970-01-01
      • 2013-11-24
      • 2011-12-04
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多