다음을 통해 공유


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 를 첫 번째 멤버로 포함하는 항목 데이터 구조를 만듭니다. 두 번째 멤버는 소유자가 그린 데이터를 정의하는 클래스의 instance 대한 포인터입니다. 다음 예제에서는 이 기술을 보여 줍니다.

// 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가 포함된 구조체의 instance 대한 포인터를 전달하여 메뉴 항목의 이름을 표시합니다.