在WTL中显示向导的“关闭”按钮

时间:2012-07-19 09:41:29

标签: c++ wtl

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

输入以下代码:

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

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

是否有一种优雅的方法可以禁用“关闭”按钮? (我是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;
    }
};

1 个答案:

答案 0 :(得分:0)

关闭[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?
    }
};

除了防止取消/关闭之外,您还可以通过显示一个消息框来指示这一点,建议使用等待待处理操作完成,或以其他方式显示通知(例如闪存静态控制等)。