我创建了自己的CXTabCtrl
,它扩展了CTabCtrl
并覆盖了DrawItem
函数。
在重写DrawItem
函数的阶段,我无法区分CTabCtrl
项的以下两种状态:
CTabCtrl
项目已选中并具有焦点。 CTabctrl
项目已选中,但没有焦点。 焦点是指焦点矩形未绘制。这是两个图像,可帮助您识别这两种状态:
这是
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);
将始终为TRUE
。 ODS_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,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53185229/