公开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 作为第一个成员的项数据结构。 第二个成员是指向定义所有者绘制数据的 类实例的指针。 以下示例演示了此方法。

// 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 的 结构的实例的指针,以公开菜单项的名称。