【问题标题】:Button TABSTOP in ownerdraw not workingownerdraw中的按钮TABSTOP不起作用
【发布时间】:2015-03-04 06:15:31
【问题描述】:

我创建了一个继承自CButton的自定义按钮类CMyButton,然后我使用DrawItem来自定义按钮。

使用自定义按钮,我在对话框中创建了 3button。

问题是按钮的 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);

}

【问题讨论】:

  • 你怎么知道TAB键不起作用?
  • 当您删除 DrawItem 时,您是否也删除了 BS_OWNERDRAW 样式?这是更大的变化。

标签: mfc


【解决方案1】:

我对此表示怀疑。如果您让按钮所有者绘制,那么您有责任一直绘制它。这包括聚焦状态等。请参阅 DRAWITEMSTRUCT.itemstate 的文档。

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775802%28v=vs.85%29.aspx

【讨论】:

    【解决方案2】:

    焦点矩形会自动呈现给对话框上的标准控件。如果您订阅所有者绘图,则呈现视觉提示的责任将转移到自定义实现。虽然 TABbing 仍然有效,但键盘焦点仍然不可见,除非实现明确说明它。

    您可以使用传递给您的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)。

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 2011-12-02
      • 2011-04-03
      相关资源
      最近更新 更多