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

  • CTabCtrl项目已选中并具有焦点。
  • CTabctrl项目已选中,但没有焦点。

  • 焦点是指焦点矩形未绘制。这是两个图像,可帮助您识别这两种状态:

    c++ - CTabCtrl ItemAction和ItemState-LMLPHP c++ - CTabCtrl ItemAction和ItemState-LMLPHP

    这是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项目“已选择并集中”,“已选择但未集中”的两个状态的正确方法,我将不胜感激。

    最佳答案

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

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

    适用时,应为所有者绘制选项卡控件自动绘制焦点矩形。确保为选项卡控件设置了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);
    }
    

    c++ - CTabCtrl ItemAction和ItemState-LMLPHP

    关于c++ - CTabCtrl ItemAction和ItemState,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53185229/

    10-11 15:16