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