Compartir a través de


Exponer elementos de menú de Owner-Drawn

Los desarrolladores de aplicaciones pueden usar la estructura MSAAMENUINFO para exponer los nombres de los elementos de menú dibujados por el propietario. Al asociar esta estructura con los datos del elemento de menú dibujado por el propietario, no es necesario exponer los elementos de menú con IAccessible.

Al crear un menú dibujado por el propietario, defina una clase o estructura para los datos del elemento de menú dibujado por el propietario y cree instancias de esta clase para cada elemento de menú. Pase un puntero a los datos del elemento al agregar elementos al menú.

Para exponer los nombres de los elementos de menú, la estructura MSAAMENUINFO debe ser el primer miembro de la estructura que define los datos de elementos específicos de la aplicación, como se muestra en el ejemplo siguiente:

// 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 estructura MSAAMENUINFO no puede ser miembro de una clase que contenga funciones virtuales. Cuando se compila el código, el primer miembro de la clase siempre es un puntero generado por el compilador a una tabla de las funciones virtuales. Para solucionar este problema, cree una estructura de datos de elemento que contenga MSAAMENUINFO como primer miembro. El segundo miembro es un puntero a una instancia de la clase que define los datos dibujados por el propietario. En el ejemplo siguiente se muestra esta 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 
}

Al agregar elementos al menú, pase un puntero a una instancia de la estructura que contiene MSAAMENUINFO para exponer los nombres de los elementos de menú.