Compartilhar via


Expondo itens de menu Owner-Drawn

Os desenvolvedores de aplicativos podem usar a estrutura MSAAMENUINFO para expor os nomes dos itens de menu desenhados pelo proprietário. Ao associar essa estrutura aos dados do item de menu desenhados pelo proprietário, você não precisa expor os itens de menu com IAccessible.

Ao criar um menu desenhado pelo proprietário, defina uma classe ou estrutura para os dados de item de menu desenhados pelo proprietário e crie instâncias dessa classe para cada item de menu. Passe um ponteiro para os dados do item ao adicionar itens ao menu.

Para expor os nomes dos itens de menu, a estrutura MSAAMENUINFO deve ser o primeiro membro da estrutura que define os dados de item específicos do aplicativo, conforme mostrado no exemplo a seguir:

// 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 
};

A estrutura MSAAMENUINFO não pode ser membro em uma classe que contém funções virtuais. Quando o código é compilado, o primeiro membro da classe é sempre um ponteiro gerado pelo compilador para uma tabela das funções virtuais. Para contornar esse problema, crie uma estrutura de dados de item que contenha MSAAMENUINFO como o primeiro membro. O segundo membro é um ponteiro para uma instância da classe que define os dados desenhados pelo proprietário. O exemplo a seguir demonstra essa técnica.

// 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 
}

Ao adicionar itens ao menu, passe um ponteiro para uma instância da estrutura que contém MSAAMENUINFO para expor os nomes dos itens de menu.