次の方法で共有


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 はコントロールで使用されるフォントの高さや幅を認識できていません。したがって、高さや幅の値を必要とする関数呼び出しや計算などは、アプリケーションのメイン関数またはライブラリで行う必要があります。

計測される項目が CMenuCListBox、または CComboBox オブジェクトの場合、適切なクラスの仮想関数 MeasureItem が呼び出されます。各項目のサイズを設定または計算するには、適切なクラスのメンバ関数 MeasureItem をオーバーライドしてください。

OnMeasureItem が呼び出されるのは、実行時に作成されたクラスのコントロールと、LBS_OWNERDRAWVARIABLE または CBS_OWNERDRAWVARIABLE スタイルで作成されたコントロールに対してだけです。ダイアログ エディタで作成されたコントロールに対して OnMeasureItem が呼び出されることはありません。そのようなコントロールに対しては、代わりに作成プロセスの早い段階で WM_MEASUREITEM メッセージが送られます。ただし、DDX_ControlSubclassDlgItem、または SubclassWindow を使用してサブクラス化を行った場合、そのサブクラス化は通常作成プロセスの後で実行されます。したがって、サブクラス化されたコントロールには、OnChildNotify 関数で WM_MEASUREITEM メッセージを処理する機会がありません。しかし、MFC はこの機構で ON_WM_MEASUREITEM_REFLECT を実装しています。

z8wwd4x6.alert_note(ja-jp,VS.90).gifメモ :

このメンバ関数は、アプリケーションが Windows メッセージを処理できるようにするためにフレームワークによって呼び出されます。この関数に渡されるパラメータの値は、フレームワークがメッセージ受信時に受け取ったパラメータの値に基づいています。この関数の基本クラスの実装を呼び出した場合は、関数に渡したパラメータではなく、メッセージと共に渡されたパラメータ自体が使用されます。

必要条件

ヘッダー : afxwin.h

参照

参照

CWnd クラス

階層図

CMenu::MeasureItem

CListBox::MeasureItem

CComboBox::MeasureItem

CComboBox::MeasureItem

その他の技術情報

CWnd のメンバ