我创建了一个继承自CButton的自定义按钮类CMyButton,然后我使用DrawItem来自定义按钮。
使用custtom按钮,我在对话框中创建了3按钮。
问题是该按钮的TAB键无法正常工作。如果我删除drawitem然后没有问题。有人可以帮忙吗?
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;
pDC->DrawFrameControl(rect, DFC_BUTTON , DFCS_BUTTONPUSH | DFCS );
pDC->FillSolidRect(rect, RGB(24, 72, 76));
pDC->SetTextColor(RGB(255, 255, 255));
CString strText;
GetWindowText(strText);
pDC->DrawText(strText,rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
答案 0 :(得分:1)
我对此表示怀疑。如果您创建了一个按钮所有者绘图,那么您有责任一直绘制它。这包括焦点状态等。请参阅DRAWITEMSTRUCT.itemstate的文档。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb775802%28v=vs.85%29.aspx
答案 1 :(得分:1)
焦点矩形会自动呈现给对话框上的标准控件。如果您订阅了所有者绘图,则呈现可视提示的责任将转移到自定义实现。虽然 TAB bing仍然有效,但键盘焦点仍然不可见,除非实现明确说明它。
您可以使用传递给DrawItem
方法的DRAWITEMSTRUCT来查询项目的状态。如果itemState
包含ODS_FOCUS
标记,则呈现的控件具有键盘焦点,并应生成所需的视觉提示。
作为一个简单的插图,请使用以下代码替换您对FillSolidRect
的来电:
if ( state & ODS_FOCUS )
// Control has keyboard focus -> render it green
pDC->FillSolidRect( rect, RGB( 0, 255, 0 ) );
else
// Control doesn't have keyboard focus -> render it red
pDC->FillSolidRect( rect, RGB( 255, 0, 0 ) );
这使您可以看到 TAB 键按预期工作:键盘焦点的按钮控件呈现绿色,而所有其他按钮均为红色。
如果您正在寻找更标准的外观,可以致电CDC::DrawFocusRect(或DrawFocusRect)。