Поделиться через


Предоставление Owner-Drawn пунктов меню

Разработчики приложений могут использовать структуру MSAAMENUINFO для предоставления имен элементов меню, нарисованных владельцем. Связав эту структуру с данными элементов меню, нарисованных владельцем, вам не нужно предоставлять элементы меню с IAccessible.

При создании меню, нарисованного владельцем, определите класс или структуру для данных элементов меню, нарисованных владельцем, и создайте экземпляры этого класса для каждого элемента меню. Передайте указатель на данные элемента при добавлении элементов в меню.

Чтобы предоставить имена пунктов меню, структура MSAAMENUINFO должна быть первым членом структуры, определяющей данные элементов приложения, как показано в следующем примере:

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

Структура MSAAMENUINFO не может быть членом класса, содержащего виртуальные функции. При компиляции кода первым членом класса всегда является созданный компилятором указатель на таблицу виртуальных функций. Чтобы обойти эту проблему, создайте структуру данных элемента, которая содержит MSAAMENUINFO в качестве первого члена. Второй член является указателем на экземпляр класса , который определяет данные, нарисованные владельцем. В следующем примере демонстрируется этот метод.

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

При добавлении элементов в меню передайте указатель на экземпляр структуры, содержащей MSAAMENUINFO , чтобы предоставить имена пунктов меню.