次の方法で共有


メニュー項目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 を含む構造体のインスタンスへのポインターを渡して、メニュー項目の名前を公開します。