我正在编写一个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;
}
};
答案 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?
}
};
除了防止取消/关闭之外,您还可以通过显示一个消息框来指示这一点,建议使用等待待处理操作完成,或以其他方式显示通知(例如闪存静态控制等)。