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 を使用すると簡単ですが、2 つのバージョンの通知ハンドラーが利用できることを知っておく必要があります。

_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 に答える