Condividi tramite


Esposizione di voci di menu Owner-Drawn

Gli sviluppatori di applicazioni possono usare la struttura MSAAMENUINFO per esporre i nomi delle voci di menu disegnate dal proprietario. Associando questa struttura ai dati delle voci di menu disegnate dal proprietario, non è necessario esporre le voci di menu con IAccessible.

Quando si crea un menu disegnato dal proprietario, definire una classe o una struttura per i dati delle voci di menu disegnate dal proprietario e creare istanze di questa classe per ogni voce di menu. Passare un puntatore ai dati dell'elemento quando si aggiungono elementi al menu.

Per esporre i nomi delle voci di menu, la struttura MSAAMENUINFO deve essere il primo membro della struttura che definisce i dati dell'elemento specifico dell'applicazione, come illustrato nell'esempio seguente:

// 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 struttura MSAAMENUINFO non può essere un membro di una classe che contiene funzioni virtuali. Quando il codice viene compilato, il primo membro della classe è sempre un puntatore generato dal compilatore a una tabella delle funzioni virtuali. Per risolvere questo problema, creare una struttura di dati dell'elemento contenente MSAAMENUINFO come primo membro. Il secondo membro è un puntatore a un'istanza della classe che definisce i dati disegnati dal proprietario. Nell'esempio seguente viene illustrata questa tecnica.

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

Quando si aggiungono elementi al menu, passare un puntatore a un'istanza della struttura che contiene MSAAMENUINFO per esporre i nomi delle voci di menu.