ホーム ATL/WTL
UI更新ハンドラ - ダイアログのポップアップメニューアイテム
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2003/12/27
PR
 モーダルダイアログでもモードレスダイアログでも、 ポップアップメニューアイテムのUI更新ハンドラを使用できます。

 以下に示すのは、これまでに作成したダイアログにポップアップメニューアイテムのUI更新ハンドラを追加する手順です。 ここでは、ダイアログにメニューバーを追加し、[常に手前に表示]というメニューアイテムを作成して メニューアイテムが選択されるたびに、UI更新ハンドラによってメニューアイテムのチェックマークの付加と消去を繰り返すようにします。 なお、ここ示す手順はモーダルダイアログ、モードレスダイアログのどちらにも当てはまります。


 まずはプロジェクトにIDR_MENU_MAINというIDのメニューリソースを追加し、 [常に手前に表示]というメニューアイテムを作成してそれにID_MENUITEM_TOPMOSTというIDを設定します。 次に、ダイアログのプロパティを開き、メニューとしてIDR_MENU_MAINを指定します。 これでダイアログにメニューが追加されます。



 次に、UI更新ハンドラを使用するためにはCUpdateUIクラスが必要になるため、 atlframe.hヘッダをインクルードします。

// stdafx.h内
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>

#include <atlcrack.h>
#include <atlmisc.h>
#include <atlframe.h>
			

 次に、CUpdateUIクラスをダイアログクラスであるCMainDlgクラスの基底クラスにします。

class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>
			

 CMainDlgクラス内では、UI更新ハンドラマップにID_MENUITEM_TOPMOST用のエントリを追加します。 さらにメッセージマップにはID_MENUITEM_TOPMOST用のコマンドハンドラエントリと、 CUpdateUIクラスへのチェーンを追加します。

class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>
{
public:
    enum { IDD = IDD_DIALOG1 };

    // UI更新ハンドラマップ
    BEGIN_UPDATE_UI_MAP(CMainDlg)
        UPDATE_ELEMENT(ID_MENUITEM_TOPMOST, UPDUI_MENUPOPUP)
    END_UPDATE_UI_MAP()

    // メッセージマップ
    BEGIN_MSG_MAP_EX(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        COMMAND_ID_HANDLER_EX(ID_MENUITEM_TOPMOST, OnMenuTopmost)  // [常に手前に表示]
        ...
        ...
        CHAIN_MSG_MAP(CUpdateUI<CMainDlg>)  // CUpdateUIクラスへのチェーン
    END_MSG_MAP()

    ...
			

 次に、CMainDlgクラスにID_MENUITEM_TOPMOSTのコマンドメッセージハンドラを追加します。

class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>
{
    ...
    ...
    
    void OnMenuTopmost(UINT uNotifyCode, int nID, HWND hWndCtl){
        bool bTopmost = !(UIGetState(nID) & UPDUI_CHECKED);
        SetWindowPos(bTopmost ? HWND_TOPMOST : HWND_NOTOPMOST,
            0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
        UISetCheck(nID, bTopmost);
    }

    ...
			

これで、ポップアップメニューアイテム用のUI更新ハンドラが動くようになります。 まず、ダイアログにメニューを追加することで、メニューが表示されるときにWM_INITMENUPOPUPメッセージが ダイアログに送られてくるようになります。 CMainDlgクラスのメッセージマップではWM_INITMENUPOPUPメッセージを処理しないため、 このメッセージはチェーン先のCUpdateUIクラスへ送られます。 CUpdateUIクラスの基底クラスであるCUpdateUIBaseには WM_INITMENUPOPUPメッセージハンドラが用意されており、 そこでポップアップメニューアイテムが更新されます。