Partager via


Exposition des éléments de menu Owner-Drawn

Les développeurs d’applications peuvent utiliser la structure MSAAMENUINFO pour exposer les noms des éléments de menu dessinés par le propriétaire. En associant cette structure aux données d’élément de menu dessinées par le propriétaire, vous n’avez pas besoin d’exposer les éléments de menu avec IAccessible.

Lors de la création d’un menu dessiné par le propriétaire, définissez une classe ou une structure pour les données d’élément de menu dessiné par le propriétaire et créez des instances de cette classe pour chaque élément de menu. Transmettez un pointeur vers les données d’élément lors de l’ajout d’éléments au menu.

Pour exposer les noms des éléments de menu, la structure MSAAMENUINFO doit être le premier membre de la structure qui définit les données d’élément spécifiques à l’application, comme illustré dans l’exemple suivant :

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

La structure MSAAMENUINFO ne peut pas être membre d’une classe qui contient des fonctions virtuelles. Lorsque le code est compilé, le premier membre de la classe est toujours un pointeur généré par le compilateur vers une table des fonctions virtuelles. Pour contourner ce problème, créez une structure de données d’élément qui contient MSAAMENUINFO comme premier membre. Le deuxième membre est un pointeur vers un instance de la classe qui définit les données dessinées par le propriétaire. L’exemple suivant illustre cette technique.

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

Lorsque vous ajoutez des éléments au menu, passez un pointeur vers un instance de la structure qui contient MSAAMENUINFO pour exposer les noms des éléments de menu.