所有者中的按钮TABSTOP无法正常工作

时间:2015-03-03 14:22:04

标签: mfc

我创建了一个继承自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);

}

2 个答案:

答案 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)。