CWnd::OnMeasureItem
オーナー描画のボタン、コンボ ボックス、リスト ボックス、またはメニュー項目のコントロールが作成された場合に、そのコントロールのオーナーに対して、フレームワークからこのメンバー関数が呼び出されます。
afx_msg void OnMeasureItem(
int nIDCtl,
LPMEASUREITEMSTRUCT lpMeasureItemStruct
);
パラメーター
nIDCtl
コントロールの ID。lpMeasureItemStruct
オーナー描画コントロールの寸法を持つ MEASUREITEMSTRUCT データ構造体へのポインター。
解説
このメンバー関数をオーバーライドして、lpMeasureItemStruct が指す MEASUREITEMSTRUCT データ構造体にデータを格納し、呼び出し元に制御を戻します。これにより、Windows にコントロールの寸法が通知されるため、ユーザーのコントロールに対する操作を適切に処理できるようになります。
リスト ボックスやコンボ ボックスが LBS_OWNERDRAWVARIABLE または CBS_OWNERDRAWVARIABL スタイルで作成されているときは、コントロールの各項目のオーナーに対して、フレームワークからこの関数が呼び出されます。それ以外のときは、この関数は一度だけ呼び出されます。
Windows は、OWNERDRAWFIXED スタイルで作成されたコンボ ボックスやリスト ボックスのオーナーに対して、WM_INITDIALOG メッセージを送信する前に OnMeasureItem 関数を呼び出します。 つまり、オーナーがこの呼び出しを受けた時点では、Windows はコントロールで使用されるフォントの高さや幅を認識できていません。したがって、高さや幅の値を必要とする関数呼び出しや計算などは、アプリケーションのメイン関数またはライブラリで行う必要があります。
計測される項目が CMenu、CListBox、または CComboBox オブジェクトの場合、適切なクラスの仮想関数 MeasureItem が呼び出されます。 各項目のサイズを設定または計算するには、適切なクラスのメンバー関数 MeasureItem をオーバーライドしてください。
OnMeasureItem が呼び出されるのは、実行時に作成されたクラスのコントロールと、LBS_OWNERDRAWVARIABLE または CBS_OWNERDRAWVARIABLE スタイルで作成されたコントロールに対してだけです。 ダイアログ エディターで作成されたコントロールに対して OnMeasureItem が呼び出されることはありません。 そのようなコントロールに対しては、代わりに作成プロセスの早い段階で WM_MEASUREITEM メッセージが送られます。 ただし、DDX_Control、SubclassDlgItem、または SubclassWindow を使用してサブクラス化を行った場合、そのサブクラス化は通常作成プロセスの後で実行されます。 したがって、サブクラス化されたコントロールには、OnChildNotify 関数で WM_MEASUREITEM メッセージを処理する機会がありません。しかし、MFC はこの機構で ON_WM_MEASUREITEM_REFLECT を実装しています。
注意
このメンバー関数は、アプリケーションが Windows メッセージを処理できるようにするためにフレームワークによって呼び出されます。 この関数に渡されるパラメーターの値は、フレームワークがメッセージ受信時に受け取ったパラメーターの値に基づいています。 この関数の基本クラスの実装を呼び出した場合は、関数に渡したパラメーターではなく、メッセージと共に渡されたパラメーター自体が使用されます。
必要条件
**ヘッダー:**afxwin.h