绘制自定义Windows控件的问题

时间:2011-03-11 16:34:32

标签: windows winapi themes custom-controls gdi

我正在使用Windows中的uxTheme库来绘制我自己的自定义控件,我无法理解为什么我的控件看起来不像常规的Windows控件(据说)使用相同的主题我'使用:

A Windows ComboBox and my control that uses the ComboBox theme

上图显示了标准的Windows ComboBox(顶部)和使用ComboBox主题(底部)绘制的自定义控件。我无法解决的问题是为什么我控制的边框与标准控件的形状和颜色不同。

在我的类构造函数中,我打开主题数据:

mComboTheme = OpenThemeData( hwnd, L"COMBOBOX" );

然后在WM_PAINT的处理程序中,我只是绘制了ComboBox组件的两个部分:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC         hdc;
    RECT        client;

    if( GetUpdateRect( hwnd, &ps.rcPaint, false ))
    {
        hdc = BeginPaint( hwnd, &ps );
        GetClientRect( hwnd, &client );

        if( IsThemeBackgroundPartiallyTransparent( mComboTheme, CP_BACKGROUND, CBXS_HOT ))
        {
            DrawThemeParentBackground( hwnd, hdc, &ps.rcPaint );
        }
        DrawThemeBackground( mComboTheme, hdc, CP_BACKGROUND, CBXS_HOT, &client, &ps.rcPaint );
        client.left = client.right - 20;
        DrawThemeBackground( mComboTheme, hdc, CP_DROPDOWNBUTTONRIGHT, CBXSR_HOT, &client, ps.rcPaint );

        EndPaint( *this, &ps );
    }
    break;
}

对于为什么这两个控件看起来不一样的任何建议都将不胜感激。

谢谢,

詹姆斯

1 个答案:

答案 0 :(得分:4)

您使用DrawThemeBackgroundCP_BACKGROUND致电CP_DROPDOWNBUTTONRIGHT。如果您希望边框与标准组合框相匹配,也许您也应该使用CP_BORDER来调用它?