0

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

放置以下代码:

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

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

有没有一种优雅的方法来禁用关闭按钮?(我是 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;
    }
};
4

1 回答 1

0

关闭 [X] 按钮是通用控件向导属性表类的一部分。你不应该改变它的表现和行为。您可以做的是处理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?
    }
};

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

于 2012-07-20T11:27:31.550 回答