我创建了自己的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项目“已选择并集中”,“已选择但未集中”的两种状态的正确方法,我将不胜感激。
答案 0 :(得分:0)
对于标准选项卡控件,UI不会始终绘制焦点矩形。要查看焦点矩形,选项卡控件必须具有WS_TABSTOP
标志。
当用户单击 Tab 键浏览对话框的控件时,或者当按下 Alt 键并且选项卡控件具有焦点时,焦点矩形将可见。 / p>
在适用时,应为所有者绘制选项卡控件自动绘制焦点矩形。确保为标签页控件设置了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);
}