メニュー項目Owner-Drawn公開する
アプリケーション開発者は、 MSAAMENUINFO 構造体を使用して、所有者が描画したメニュー項目の名前を公開できます。 この構造を所有者が描画したメニュー項目データに関連付けることで、メニュー項目を IAccessible で公開する必要はありません。
所有者描画メニューを作成する場合は、所有者が描画したメニュー項目データのクラスまたは構造を定義し、メニュー項目ごとにこのクラスのインスタンスを作成します。 メニューに項目を追加するときに、項目データへのポインターを渡します。
メニュー項目の名前を公開するには、次の例に示すように、 MSAAMENUINFO 構造体が、アプリケーション固有の項目データを定義する構造体の最初のメンバーである必要があります。
// Application-specific owner-drawn menu info struct. Owner-drawn data
// is a pointer to one of these.
struct MenuEntry
{
MSAAMENUINFO m_MSAA; // MSAA info - must be first member
LPTSTR m_pName; // Displayed menu text or NULL for
// separator item
int m_CmdID; // Menu command ID
int m_IconIndex; // Index of icon in bitmap or -1 for
// for separator
};
MSAAMENUINFO 構造体は、仮想関数を含むクラスのメンバーにすることはできません。 コードがコンパイルされると、クラスの最初のメンバーは常に、仮想関数のテーブルへのコンパイラによって生成されるポインターです。 この問題を回避するには、最初のメンバーとして MSAAMENUINFO を含む項目データ構造を作成します。 2 番目のメンバーは、所有者が描画したデータを定義する クラスのインスタンスへのポインターです。 次の例では、この手法を示します。
// Application-defined class that contains the owner-drawn data and
// virtual functions that operate on that data.
class MenuEntry
{
LPTSTR m_pName; // Displayed menu text or NULL for
// separator item.
int m_CmdID; // Menu command ID
int m_IconIndex; // Index of icon in bitmap or -1 for
// separator item
virtual void m_AnimateIcon();
virtual void m_ChangeIconColor();
}
// Application-defined struct that contains MSAAMENUINFO as first
// member. Second member points to owner-drawn data.
struct MenuInfo
{
MSAAMENUINFO m_MSAA; // MSAA info - must be first member
MenuEntry *pMenuData; // Points to the owner-drawn data
}
メニューに項目を追加する場合は、 MSAAMENUINFO を含む構造体のインスタンスへのポインターを渡して、メニュー項目の名前を公開します。