CTabCtrl ItemAction & ItemState - PullRequest
       3

CTabCtrl ItemAction & ItemState

0 голосов
/ 07 ноября 2018

Я создал свой собственный CXTabCtrl, который расширяет CTabCtrl и переопределяет функцию DrawItem. На этапе переписывания функции DrawItem я не смог провести различие между этими двумя состояниями CTabCtrl Item:

  1. CTabCtrl элемент выбран и имеет фокус.
  2. CTabctrl элемент выбран, но не имеет фокуса.

Под фокусом я имею в виду, что прямоугольник Фокуса не рисует Вот два изображения, которые помогут идентифицировать два состояния:

Selected but not focused Select & Focus

Вот текущий код DrawItem, в котором я могу обнаружить выбранные состояния, но все еще не могу обнаружить состояния фокусировки.

Вот часть текущего кода DrawItem, в котором я могу обнаружить выбранные состояния, но все еще не могу обнаружить состояния фокуса.

void CXtabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    BOOL bFontSuccess = FALSE;
    CFont* def_font = NULL;
    CFont font_italic;

    TC_ITEM tci;
    CRect rect(lpDrawItemStruct->rcItem); 
    wchar_t szTabText[256]; 
    wmemset(szTabText,_T('\0'),256);

    RECT rectComplet; 
    GetClientRect(&rectComplet);
    CBrush brtmp(ColorCategoryBackgroundTop);
    int nbItem = GetItemCount();

    tci.mask = TCIF_TEXT;
    tci.pszText = szTabText;
    tci.cchTextMax = sizeof(szTabText) -1;
    GetItem(lpDrawItemStruct->itemID, &tci);

    BOOL bSelect = (lpDrawItemStruct->itemState & ODS_SELECTED) &&
                   (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE));
    BOOL bfocus = (lpDrawItemStruct->itemState & ODS_FOCUS) &&
                  (lpDrawItemStruct->itemAction & (ODA_FOCUS | ODA_DRAWENTIRE));

    if (bSelect)//Draw In a Specific Way
    if (bFocus) //Draw In a Specific Way
}

Итак, я был бы признателен, если бы кто-нибудь смог описать правильный способ определения двух состояний элемента CTabCtrl: «Выбрано и сфокусировано», «Выбрано и не сфокусировано»

1 Ответ

0 голосов
/ 07 ноября 2018

Для стандартного элемента управления вкладкой пользовательский интерфейс не всегда рисует прямоугольник фокуса. Чтобы увидеть прямоугольник фокуса, вкладка должна иметь флаг 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);
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...