2012-07-19 1 views
0

Я пишу мастер WTL Aero, и я хотел бы седеть из окна Close (первый шаг не требует взаимодействия с пользователем и не может быть отменен, поэтому отключение кнопки отлично подходит).Окрашивание кнопки закрытия мастера в WTL

Собираем следующий код:

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

Кнопка закрыть [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? 
    } 
}; 

Наряду с предотвращением отмены/закрытия вы можете указать это, показывая окно сообщения, предлагающее использовать, чтобы дождаться завершения ожидающей операции или иным образом отобразить уведомление (например, включить статическое управление и т. д.)

Смежные вопросы