カスタマイズ通知の処理

更新 : 2007 年 11 月

Windows ツール バー コモン コントロールには、システム定義のカスタム ダイアログ ボックスなど、カスタマイズ機能が組み込まれています。この機能を使用して、ユーザーはツール バー ボタンを挿入、削除、または再整列できます。アプリケーションは、カスタマイズ機能が使用できるかどうかを判断し、ユーザーがツール バーをどの程度までカスタマイズできるかを制御します。

ツール バーに CCS_ADJUSTABLE スタイルを設定することで、これらのカスタマイズ機能をユーザーが使用できるようにできます。カスタマイズ機能を使用して、ユーザーはボタンを新しい位置にドラッグしたり、ボタンをツール バーからドラッグして削除したりできます。さらに、ユーザーがツール バーをダブルクリックしたときに [ツール バーのカスタマイズ] ダイアログ ボックスを表示させることもできます。[ツール バーのカスタマイズ] ダイアログ ボックスを使用すると、ツール バー ボタンを追加、削除、および再整列できます。アプリケーションでは、Customize メンバ関数を使用することでこのダイアログ ボックスを表示できます。

ツール バー コントロールは、カスタマイズ処理の各手順で通知メッセージを親ウィンドウに送ります。ユーザーが Shift キーを押しながらボタンのドラッグを開始すると、ツール バーは自動的にドラッグ操作を処理します。ツール バーは TBN_QUERYDELETE 通知メッセージを親ウィンドウに送り、ボタンを削除できるかどうかを判断します。親ウィンドウが FALSE を返すと、ドラッグ操作は終了します。それ以外の場合、ツール バーはマウス入力をキャプチャし、ユーザーがマウス ボタンを離すのを待ちます。

ユーザーがマウス ボタンを離すと、ツール バー コントロールはマウス ポインタの場所を調べます。ポインタがツール バーの外側にある場合、ボタンは削除されます。ポインタが別のツール バー ボタン上にある場合、ツール バーは TBN_QUERYINSERT 通知メッセージを親ウィンドウに送り、指定したボタンの左側にボタンを挿入できるかどうかを判断します。親ウィンドウが TRUE を返すと、ボタンは挿入されます。それ以外の場合は、挿入されません。ツール バーは TBN_TOOLBARCHANGE 通知メッセージを送り、ドラッグ操作の終了を知らせます。

ユーザーが Shift キーを押さずにドラッグ操作を開始すると、ツール バー コントロールは TBN_BEGINDRAG 通知メッセージを親ウィンドウに送ります。独自のボタン ドラッグ コードを実装しているアプリケーションでは、このメッセージをシグナルとして使用してドラッグ操作を開始できます。ツール バーは TBN_ENDDRAG 通知メッセージを送り、ドラッグ操作の終了を知らせます。

ユーザーが [ツール バーのカスタマイズ] ダイアログ ボックスを使用してツール バーをカスタマイズする場合、ツール バー コントロールは通知メッセージを送ります。ダイアログ ボックスが作成される前にユーザーがツール バーをダブルクリックすると、ツール バーは TBN_BEGINADJUST 通知メッセージを送ります。次に、ツール バーは一連の TBN_QUERYINSERT 通知メッセージを送り始め、ボタンを挿入できるかどうかを判断します。親ウィンドウが TRUE を返すと、ツール バーは TBN_QUERYINSERT 通知メッセージを送るのを終了します。親ウィンドウが、どのボタンに対しても TRUE を返さない場合、ダイアログ ボックスは破棄されます。

続いて、ツール バー コントロールは、ツール バーのボタンごとに TBN_QUERYDELETE 通知メッセージを送ってツール バーからボタンを削除できるかどうかを判断します。ボタンを削除できる場合、親ウィンドウは TRUE を返します。それ以外の場合は FALSE を返します。ツール バーはすべてのツール バー ボタンをダイアログ ボックスに追加しますが、削除できないボタンは淡色表示します。

ツール バー コントロールは、[ツール バーのカスタマイズ] ダイアログ ボックスのボタンに関する情報が必要になると、TBN_GETBUTTONINFO 通知メッセージを送り、情報が必要なボタンのインデックスと TBNOTIFY 構造体のアドレスを指定します。親ウィンドウでは構造体に適切な情報を格納する必要があります。

[ツール バーのカスタマイズ] ダイアログ ボックスには、[ヘルプ] ボタンと [リセット] ボタンがあります。ユーザーが [ヘルプ] をクリックすると、ツール バー コントロールは TBN_CUSTHELP 通知メッセージを送ります。親ウィンドウではヘルプ情報を表示して応答する必要があります。ユーザーが [リセット] をクリックすると、ダイアログ ボックスは TBN_RESET 通知メッセージを送ります。このメッセージは、ツール バーがダイアログ ボックスを再初期化しようとしていることを示します。

これらのメッセージはすべて WM_NOTIFY メッセージです。メッセージをオーナー ウィンドウで処理するには、オーナー ウィンドウのメッセージ マップに次のような形式でメッセージ マップのエントリを追加します。

ON_NOTIFY( wNotifyCode, idControl, memberFxn )

  • wNotifyCode
    通知メッセージの識別子コード。TBN_BEGINADJUST など。

  • idControl
    通知を送るコントロールの識別子。

  • memberFxn
    この通知が受け取られるときに呼び出されるメンバ関数。

メンバ関数は次のプロトタイプで宣言されます。

afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );

通知メッセージ ハンドラが値を返す場合は、その値を result が指す LRESULT に格納する必要があります。

各メッセージに対して、pNotifyStruct は NMHDR 構造体または TBNOTIFY 構造体のいずれかを指します。構造体は次のとおりです。

NMHDR 構造体には、以下のメンバが含まれています。

typedef struct tagNMHDR {

HWND hwndFrom; // handle of control sending message

UINT idFrom;// identifier of control sending message

UINT code; // notification code; see below

} NMHDR;

  • hwndFrom
    通知を送るコントロールのウィンドウ ハンドル。このハンドルを CWnd ポインタに変換するには、CWnd::FromHandle を使用します。

  • idFrom
    通知を送るコントロールの識別子。

  • code
    通知コード。このメンバは、TBN_BEGINADJUSTTTN_NEEDTEXT などのコントロールの種類に固有の値になるか、または以下に示す共通の通知コードの値のいずれかになります。

    • NM_CLICK   コントロール内でユーザーがマウスの左ボタンをクリックしました。

    • NM_DBLCLK   コントロール内でユーザーがマウスの左ボタンをダブルクリックしました。

    • NM_KILLFOCUS   コントロールは入力フォーカスを失いました。

    • NM_OUTOFMEMORY   メモリ不足のために、コントロールは操作を完了できませんでした。

    • NM_RCLICK   コントロール内でユーザーがマウスの右ボタンをクリックしました。

    • NM_RDBLCLK   コントロール内でユーザーがマウスの右ボタンをダブルクリックしました。

    • NM_RETURN   コントロールに入力フォーカスがあり、ユーザーが Enter キーを押しました。

    • NM_SETFOCUS   コントロールは入力フォーカスを受け取りました。

TBNOTIFY 構造体には、以下のメンバが含まれています。

typedef struct {

NMHDR hdr; // information common to all WM_NOTIFY messages

int iItem; // index of button associated with notification

TBBUTTON tbButton; // info about button associated withnotification

int cchText; // count of characters in button text

LPSTR lpszText;// address of button text

} TBNOTIFY, FAR* LPTBNOTIFY;

解説

  • hdr
    すべての WM_NOTIFY メッセージに共通な情報。

  • iItem
    通知に関連付けられたボタンのインデックス。

  • tbButton
    通知に関連付けられたツール バー ボタンに関する情報を含む TBBUTTON 構造体。

  • cchText
    ボタンのテキストの文字数。

  • lpszText
    ボタンのテキストへのポインタ。

ツール バーが送る通知は、以下のとおりです。

  • TBN_BEGINADJUST   ユーザーがツール バー コントロールのカスタマイズを開始すると送られます。ポインタは通知についての情報を持つ NMHDR 構造体を指します。ハンドラは、値を返す必要はありません。

  • TBN_BEGINDRAG   ユーザーがツール バー コントロールにあるボタンのドラッグを開始すると送られます。ポインタは TBNOTIFY 構造体を指します。iItem メンバには、ドラッグされているボタンの 0 から始まるインデックス番号が含まれます。ハンドラは、値を返す必要はありません。

  • TBN_CUSTHELP   ユーザーが [ツール バーのカスタマイズ] ダイアログ ボックスの [ヘルプ] をクリックすると送られます。戻り値はありません。ポインタは通知についての情報を持つ NMHDR 構造体を指します。ハンドラは、値を返す必要はありません。

  • TBN_ENDADJUST   ユーザーがツール バー コントロールのカスタマイズを終了すると送られます。ポインタは通知についての情報を持つ NMHDR 構造体を指します。ハンドラは、値を返す必要はありません。

  • TBN_ENDDRAG   ユーザーがツール バー コントロールにあるボタンのドラッグを終了すると送られます。ポインタは TBNOTIFY 構造体を指します。iItem メンバには、ドラッグされているボタンの 0 から始まるインデックス番号が含まれます。ハンドラは、値を返す必要はありません。

  • TBN_GETBUTTONINFO   ユーザーがツール バー コントロールをカスタマイズしているときに送られます。ツール バーは、この通知メッセージを使用して [ツール バーのカスタマイズ] ダイアログ ボックスで必要になる情報を取得します。ポインタは TBNOTIFY 構造体を指します。iItem メンバは、ボタンの 0 から始まるインデックス番号を示します。pszText メンバと cchText メンバは、それぞれ、現在のボタンのテキストのアドレスと文字数を指定します。アプリケーションでは、ボタンに関する情報をこの構造体に格納する必要があります。ボタンの情報が構造体にコピーされた場合は TRUE を返し、それ以外の場合は FALSE を返します。

  • TBN_QUERYDELETE   ユーザーがツール バー コントロールをカスタマイズしているときに、ツール バー コントロールからボタンを削除できるかどうかを判断する場合に送られます。ポインタは TBNOTIFY 構造体を指します。iItem メンバには、削除されるボタンの 0 から始まるインデックス番号が含まれます。ボタンの削除を許可する場合は TRUE を返し、ボタンの削除を禁止する場合は FALSE を返します。

  • TBN_QUERYINSERT   ユーザーがツール バー コントロールをカスタマイズしているときに、指定したボタンの左側にボタンを挿入できるかどうかを判断する場合に送られます。ポインタは TBNOTIFY 構造体を指します。iItem メンバには、挿入されるボタンの 0 から始まるインデックス番号が含まれます。指定したボタンの前にボタンの挿入を許可する場合は TRUE を返し、ボタンの挿入を禁止する場合は FALSE を返します。

  • TBN_RESET   ユーザーが [ツール バーのカスタマイズ] ダイアログ ボックスの内容をリセットすると送られます。ポインタは通知についての情報を持つ NMHDR 構造体を指します。ハンドラは、値を返す必要はありません。

  • TBN_TOOLBARCHANGE   ユーザーがツール バー コントロールのカスタマイズを終了したときに送られます。ポインタは通知についての情報を持つ NMHDR 構造体を指します。ハンドラは、値を返す必要はありません。

参照

概念

コントロール (MFC)

参照

CToolBarCtrl の使い方