CTabCtrl ItemAction和ItemState

时间:2018-11-07 07:39:36

标签: c++ mfc

我创建了自己的CXTabCtrl,扩展了CTabCtrl并覆盖了DrawItem函数。 在重写DrawItem函数的阶段,我无法区分CTabCtrl项的这两种状态:

  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 :(得分:0)

对于标准选项卡控件,UI不会始终绘制焦点矩形。要查看焦点矩形,选项卡控件必须具有WS_TABSTOP标志。

当用户单击 Tab 键浏览对话框的控件时,或者当按下 Alt 键并且选项卡控件具有焦点时,焦点矩形将可见。 / p>

在适用时,应为所有者绘制选项卡控件自动绘制焦点矩形。确保为标签页控件设置了WS_TABSTOP(在对话框编辑器中,转到标签页控件的属性并设置"Tabstop = true"

用户单击选项卡控件时,

BOOL focused = selected && (GetFocus() == this);将始终为TRUEODS_NOFOCUSRECT将指示UI是否未请求焦点矩形。请参见下面的示例。

旁注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