このサイトは2013/3/20に新しい名前になりました(ニックネーム変更のため)

2011年09月08日

MENUITEMINFO構造体の詳細

MENUITEMINFO構造体は、メニューの項目の情報を取り扱う構造体です。
InsertMenuItem関数などの引数になっています。

構造はこのようになっています。

typedef struct tagMENUITEMINFO {
 UINT    cbSize; 
 UINT    fMask; 
 UINT    fType; 
 UINT    fState; 
 UINT    wID; 
 HMENU   hSubMenu; 
 HBITMAP hbmpChecked; 
 HBITMAP hbmpUnchecked; 
 ULONG_PTR dwItemData; 
 LPTSTR  dwTypeData; 
 UINT    cch; 
 HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;

構造体の扱い方についてなんですが、
HSPでは、構造体は扱えないので、このような大きな領域が必要となる場合は、allocで領域を確保します。
この構造体はすべてのメンバが4byteです。
つまり、たとえば5番目のwIDを書きかえる時には、lpoke関数を使って

lpoke  (割り当てた変数),16(=すべてが4byteなので、5番目は0から数えて0,4,8,12,[16]となります),(書き換える数値32bit整数値)

となります。

それぞれのメンバの意味は、次のようになっています。

cbsize
構造体のサイズを指定します。必ず48を指定してください。

fMask
ここが大事。ここには、どのメンバを使用するかを指定します。
下の定数のうち、たとえばMIIM_ID(0x2)のみを指定すると、wIDメンバの値のみが変更されます。
(指定されていないメンバに値を入れても、変更されません。)
MIIM_BITMAP 0x00000080 hbmpItemメンバ
MIIM_CHECKMARKS 0x00000008 hbmpCheckedメンバとhbmpUncheckedメンバ
MIIM_DATA 0x00000020 dwItemDataメンバ
MIIM_FTYPE 0x00000100 fTypeメンバ
MIIM_ID 0x00000002 wIDメンバ
MIIM_STATE 0x00000001 fStateメンバ
MIIM_STRING 0x00000040 dwTypeDataメンバ
MIIM_SUBMENU 0x00000004 hSubMenuメンバ
MIIM_TYPE 0x00000010 MIIM_BITMAP、MIIM_FTYPE、MIIM_STRINGの組み合わせ


fType
メニューアイテムのタイプを下の定数で指定します。
MFT_MENUBARBREAK 0x00000020 メニューバーにおいては新しい行にメニューアイテムを追加、ドロップダウンメニューやサブメニュー、ショートカットメニューにおいては新しい列にメニューアイテムを追加します。
ドロップダウンメニュー、サブメニュー、ショートカットメニューでは新しいメニューアイテムとの間に水平線が挿入されます。
MFT_MENUBREAK 0x00000040 メニューバーにおいては新しい行にメニューアイテムを追加、ドロップダウンメニューやサブメニュー、ショートカットメニューにおいては新しい列にメニューアイテムを追加します。
ドロップダウンメニュー、サブメニュー、ショートカットメニューでも新しいメニューアイテムとの間に水平線は挿入されません。
MFT_OWNERDRAW 0x00000100 オーナーウインドウにメニューアイテムを描画する役割が割り当てられます。ウインドウは最初にメニューを表示する前にWM_MEASUREITEMメッセージを受け取り、またWM_DRAWITEMメッセージを受け取った時は常にメニューアイテムを最新の状態にしなければいけません。この定数を指定する場合、dwTypeDataにアプリケーション定義の値を指定する必要があります。
MFT_RADIOCHECK 0x00000200 hBmpCheckedがNULLの場合チェックマークの代わりにラジオボタンを表示します。
MFT_RIGHTJUSTIFY 0x00004000 メニューアイテムをメニューバーの右側に配置します。メニューバーのアイテムのみ有効です。
MFT_SEPARATOR 0x00000800 メニューアイテムをセパレーターとして追加します。セパレーターは横向きの水平線です。dwTypeDataとcchは無視されます。この定数はドロップダウンメニュー、サブメニュー、ショートカットメニューで有効です。


fstate
メニューアイテムの状態を下の定数で指定します。
MFS_CHECKED 0x00000008 メニューアイテムにチェックマークをつけます。
MFS_DEFAULT 0x00001000 デフォルトのメニューアイテムにします。デフォルトのアイテムはメニューの中に1つだけ含むことができ、それは太字で表示されます。
MFS_DISABLED 0x00000003 メニューアイテムを無効化し選択できなくします。MFS_GRAYEDと等価です。
MFS_ENABLED 0x00000000 メニューアイテムを有効にし選択可能にします。デフォルトの状態です。
MFS_GRAYED 0x00000003 メニューアイテムを無効化し選択できなくします。MFS_DISABLEDと等価です。
MFS_HILITE 0x00000080 メニューアイテムをハイライト表示にします。
MFS_UNCHECKED 0x00000000 メニューアイテムのチェックマークを消します。
MFS_UNHILITE 0x00000000 メニューアイテムをハイライト状態を解除します。デフォルトの状態です。


wID
メニュー項目のIDを指定します。

hSubMenu
ドロップダウンメニューまたはサブメニューのハンドルを指定します。ない時はNULL(=0)を指定してください。

dwTypeData
メニュー項目の内容の文字列のアドレスを指定します。
メモリアドレスを取得するためには、varptr()関数[HSP]を使用してくださいな。


この構造体はfMaskでどのメンバを使うかを指定して、指定したメンバに値を入れて関数を使い変更するというものです。
このような形式にすることで、関数が増えることなく、不要な引数も取らず楽になるわけです。
この構造体をどのように利用しているかは、メニューバーについて書かれている記事を見てもらえばいいと思います。




posted by ? at 21:42| Comment(0) | WINAPIメモ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。