Для стандартного элемента управления вкладкой пользовательский интерфейс не всегда рисует прямоугольник фокуса. Чтобы увидеть прямоугольник фокуса, вкладка должна иметь флаг WS_TABSTOP
.
Прямоугольник фокуса будет виден, когда пользователь нажимает клавишу Tab , чтобы просмотреть элементы управления диалогового окна, или когда нажата клавиша Alt и элемент управления табуляции имеет фокус.
Прямоугольник фокуса должен быть нарисован автоматически для контроля вкладки рисования владельцем, когда это применимо. Убедитесь, что для элемента управления вкладкой установлено WS_TABSTOP
(в редакторе диалогов перейдите в свойства элемента управления вкладкой и установите "Tabstop = true"
)
BOOL focused = selected && (GetFocus() == this);
всегда будет TRUE
, когда пользователь щелкает элемент управления вкладкой. ODS_NOFOCUSRECT
будет указывать, если прямоугольник фокуса не запрашивается пользовательским интерфейсом. См. Пример ниже.
Примечание: sizeof(szTabText)
возвращает неправильное значение для wchar_t
. Используйте _countof(szTabText)
или sizeof(szTabText)/sizeof(*szTabText)
void CXtabCtrl::DrawItem(LPDRAWITEMSTRUCT di)
{
CDC* pDC = CDC::FromHandle(di->hDC);
TC_ITEM tci;
wchar_t text[256] = { 0 };
tci.mask = TCIF_TEXT;
tci.pszText = text;
tci.cchTextMax = _countof(text);
GetItem(di->itemID, &tci);
BOOL selected = di->itemState & ODS_SELECTED;
BOOL focused = selected && (GetFocus() == this);
//The UI may not be drawing focus rectangle, even if we click on the tab
if(di->itemState & ODS_NOFOCUSRECT)
focused = FALSE;
CString str;
if(selected) str += L"SEL ";//indicate selected
if(focused) str += L"FOC ";//indicate focused
CRect rect(di->rcItem);
pDC->TextOut(rect.left, rect.top, str);
}