Учебное пособие: Работа с окнами приложений
UINT itemID; // идентификатор элемента (номер пункта)
UINT itemWidth; // ширина элемента
UINT itemHeight; // высота элемента
DWORD itemData; // данные элемента
} MEASUREITEMSTRUCT;
Поля CtlType, CtlID, itemID и itemData заполняются Windows, вы будете их использоватьь для определения нужного элемента.
Поле CtlType может быть одним из следующих:
ODT_BUTTON - кнопка
ODT_COMBOBOX - элемент комбинированного список
ODT_LISTBOX - элемент простого список
ODT_MENU - элемент меню
Поля CtlID и ItemID определяют идентификаторы дочернего окна и элемента этого дочернего окна (если дочернее окно является списком или рисуется элемент меню).
Поле ItemData является значением, которое Вы передали либо при создании дочернего окна (имя кнопки) либо при добавлении элемента в список или меню (см. сообщения CB_ADDSTRING, CB_INSERTSTRING, LB_ADDSTRING, LB_INSERTSTRING и функции InsertMenu, AddMenu). Обычно это поле является указателем на название окна/элемента.
Два поля itemHeight и itemWidth вы должны определить сами. При этом надо иметь в виду, что некорректное задание этих полей или некорректная обработка сообщения WM_DRAWITEM может привести к непредсказуемым результатам, так как Windows не проверяет корректности значений и выполненых действий).
WM_DRAWITEM nID lpDI
а это сообщение посылается, когда необходимо нарисовать требуемый элемент. Параметр lPar является дальним указателем на структуру DRAWITEMSTRUCT, которая содержит необходимые для рисования данные.
typedef struct tagDRAWITEMSTRUCT { /* ditm */
UINT CtlType; // тип рисуемого элемента
UINT CtlID; // идентификатор
UINT itemID; // идентификатор элемента (номер пункта)
UINT itemAction; // из-за чего надо рисовать
UINT itemState; // как надо рисовать
HWND hwndItem; // хендл окна рисуемого элемента
HDC hDC; // хендл контекста устройства для рисования
RECT rcItem; // прямоугольник, в котором надо рисовать
DWORD itemData; // данные элемента
} DRAWITEMSTRUCT;
Обратим внимание на поля itemAction и itemState. Они в некоторой степени дублируют друг друга, так как itemState указывает текущее состояние элемента, а itemAction - причину рисования, например получение фокуса или выбор элемента. Для упрощения логики рисования, можно перерисовывать все окошко, ориентируясь только на поле itemState, указывающее как надо рисовать.
Если надо нарисовать элемент, имеющий фокус, то можно оспользоваться функцией