Dela via


Exponera Owner-Drawn menyalternativ

Programutvecklare kan använda MSAAMENUINFO- strukturen för att exponera namnen på ägarskapade menyalternativ. Genom att associera den här strukturen med de användardefinierade menyobjektsdata behöver du inte exponera menyalternativen med IAccessible.

När du skapar en ägarritad meny definierar du en klass eller struktur för den ägarritade menyobjektens data och skapar instanser av den här klassen för varje menyobjekt. Skicka in en pekare till objektdata när du lägger till objekt på menyn.

Om du vill exponera namnen på menyalternativen måste MSAAMENUINFO struktur vara den första medlemmen i strukturen som definierar programspecifika objektdata, som du ser i följande exempel:

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

Den MSAAMENUINFO- struktur kan inte vara medlem i en klass som innehåller virtuella funktioner. När koden kompileras är den första medlemmen i klassen alltid en kompilatorgenererad pekare till en tabell med de virtuella funktionerna. Undvik det här problemet genom att skapa en objektdatastruktur som innehåller MSAAMENUINFO som den första medlemmen. Den andra medlemmen är en pekare till en instans av klassen som definierar ägarritade data. I följande exempel visas den här tekniken.

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

När du lägger till objekt i menyn skickar du en pekare till en instans av strukturen som innehåller MSAAMENUINFO för att exponera namnen på menyalternativen.