CWnd::OnMeasureItem
更新 : 2007 年 11 月
オーナー描画のボタン、コンボ ボックス、リスト ボックス、またはメニュー項目のコントロールが作成された場合に、そのコントロールのオーナーに対して、フレームワークからこのメンバ関数が呼び出されます。
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