正确确定自定义绘图的复选框状态

AlwaysLearningNewStuff

简介和相关信息:

我需要具有主题通用控件,但具有不同的文本颜色和透明背景。我遇到了一个在这个问题中有充分记录的问题

我在处理方面取得了一些进展NM_CUSTOMDRAW,因此决定先完成此复选框

问题:

无法确定复选框的状态,因此无法为传递正确的参数DrawThemeBackground()

代码比单词更重要,因此以下是代码段:

case WM_NOTIFY:
    {
        if( ((LPNMHDR)lParam)->code == NM_CUSTOMDRAW )
        {
            switch( ((LPNMHDR)lParam)->idFrom ) 
            {
            case IDC_CHECK1:
                {
                    switch( ((LPNMCUSTOMDRAW)lParam)->dwDrawStage  )
                    {
                    case CDDS_PREERASE:
                        {
                            HRESULT hr = DrawThemeParentBackground(
                                ((LPNMCUSTOMDRAW)lParam)->hdr.hwndFrom
                                ((LPNMCUSTOMDRAW)lParam)->hdc,
                                &((LPNMCUSTOMDRAW)lParam)->rc );

                            if( FAILED(hr) ) // if failed draw without theme
                            {
                                SetWindowLongPtr( hDlg, DWLP_MSGRESULT
                                    (LONG_PTR)CDRF_DODEFAULT );
                                return TRUE;
                            }

                            HTHEME hTheme = OpenThemeData(
                                ((LPNMCUSTOMDRAW)lParam)->hdr.hwndFrom,
                                L"BUTTON" );

                            if( ! hTheme )  // if failed draw without theme
                            {
                                CloseThemeData(hTheme);
                                SetWindowLongPtr( hDlg, DWLP_MSGRESULT
                                    (LONG_PTR)CDRF_DODEFAULT );
                                return TRUE;
                            }

                            // draw the state-->this is the problem part

                            // I thought this might be useful           
                            LRESULT state = SendMessage(
                                ((LPNMCUSTOMDRAW)lParam)->hdr.hwndFrom,
                                BM_GETSTATE, 0, 0 );

                            int stateID;  // parameter for DrawThemeBackground

                            switch( ((LPNMCUSTOMDRAW)lParam)->uItemState )
                            {
                            case CDIS_HOT:
                                {
                                    if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
                                        stateID = CBS_CHECKEDHOT;
                                    else
                                        stateID = CBS_UNCHECKEDHOT;
                                    break;
                                }
                            case CDIS_DEFAULT:
                                {
                                    if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
                                        stateID = CBS_CHECKEDNORMAL;
                                    else
                                        stateID = CBS_UNCHECKEDNORMAL;
                                    break;
                                }
                            case CDIS_FOCUS:
                                {
                                    if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
                                        stateID = CBS_CHECKEDNORMAL;
                                    else
                                        stateID = CBS_UNCHECKEDNORMAL;
                                    break;
                                }
                            case CDIS_SELECTED:
                                {
                                    if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
                                        stateID = CBS_CHECKEDPRESSED;
                                    else
                                        stateID = CBS_UNCHECKEDPRESSED;
                                    break;
                                }
                            }

                            RECT r;
                            SIZE s;

                            // get check box dimensions so we can calculate 
                            // rectangle dimensions for text
                            GetThemePartSize( hTheme, 
                                ((LPNMCUSTOMDRAW)lParam)->hdc, 
                                BP_CHECKBOX, stateID, NULL, 
                                TS_TRUE ,&s );

                            r.left = ((LPNMCUSTOMDRAW)lParam)->rc.left;
                            r.top = ((LPNMCUSTOMDRAW)lParam)->rc.top;
                            r.right = ((LPNMCUSTOMDRAW)lParam)->rc.left + s.cx;
                            r.bottom = ((LPNMCUSTOMDRAW)lParam)->rc.top + s.cy;

                            DrawThemeBackground( hTheme, ((LPNMCUSTOMDRAW)lParam)->hdc,
                                BP_CHECKBOX, stateID, &r, NULL );

                            // adjust rectangle for text drawing
                            ((LPNMCUSTOMDRAW)lParam)->rc.left +=  2 + s.cx;

                            DrawText( ((LPNMCUSTOMDRAW)lParam)->hdc,
                                L"Example text", -1, 
                                &((LPNMCUSTOMDRAW)lParam)->rc,
                                DT_SINGLELINE | DT_VCENTER );

                            CloseThemeData(hTheme);
                            SetWindowLongPtr( hDlg, DWLP_MSGRESULT
                                (LONG_PTR)CDRF_SKIPDEFAULT );
                            return TRUE;
                        }
                    }
                }
            }
        }
    }
    break;

文本颜色和文本背景在WM_CTLCOLORSTATIC处理程序中设置

case WM_CTLCOLORSTATIC:
    {
        SetTextColor( (HDC)wParam, RGB( 255, 0, 0 ) );
        SetBkMode( (HDC)wParam, TRANSPARENT );
    }
    return (INT_PTR)( (HBRUSH)GetStockObject(NULL_BRUSH) );

我已经包括公共控件6与#pragma commentInitCommonControlsEx()

问题:

我现在需要的只是为传递正确的状态DrawThemeBackground有人可以帮我弄这个吗?

谢谢你。

最好的祝福。

雷米·勒博(Remy Lebeau)

NM_CUSTOMDRAW为您提供有关所绘制控件的状态信息。NMCUSTOMDRAW::uItemState字段是一个位掩码,一次可以保存多个值,但是您没有考虑到这一点。您需要使用&按位运算符来检查特定值的存在。

更改此:

// I thought this might be useful           
LRESULT state = SendMessage(
    ((LPNMCUSTOMDRAW)lParam)->hdr.hwndFrom,
    BM_GETSTATE, 0, 0 );

int stateID;  // parameter for DrawThemeBackground

switch( ((LPNMCUSTOMDRAW)lParam)->uItemState )
{
    case CDIS_HOT:
    {
        if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
            stateID = CBS_CHECKEDHOT;
        else
            stateID = CBS_UNCHECKEDHOT;
        break;
    }
    case CDIS_DEFAULT:
    {
        if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
            stateID = CBS_CHECKEDNORMAL;
        else
            stateID = CBS_UNCHECKEDNORMAL;
        break;
    }
    case CDIS_FOCUS:
    {
        if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
            stateID = CBS_CHECKEDNORMAL;
        else
            stateID = CBS_UNCHECKEDNORMAL;
        break;
    }
    case CDIS_SELECTED:
    {
        if( IsDlgButtonChecked( hDlg, ((LPNMCUSTOMDRAW)lParam)->hdr.idFrom ) )
            stateID = CBS_CHECKEDPRESSED;
        else
            stateID = CBS_UNCHECKEDPRESSED;
        break;
    }
}

更像这样:

int stateID;  // parameter for DrawThemeBackground

UINT uiItemState = ((LPNMCUSTOMDRAW)lParam)->uItemState;
bool bChecked = (uiItemState & CDIS_CHECKED);

if (uiItemState & CDIS_HOT)
    stateID = bChecked ? CBS_CHECKEDHOT : CBS_UNCHECKEDHOT;

else if (uiItemState & CDIS_SELECTED)
    stateID = bChecked ? CBS_CHECKEDPRESSED : CBS_UNCHECKEDPRESSED;

else
    stateID = bChecked ? CBS_CHECKEDNORMAL : CBS_UNCHECKEDNORMAL;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何自定义处于不确定状态的复选框的样式?

来自分类Dev

自定义复选框不正确

来自分类Dev

获取自定义复选框以正确显示

来自分类Dev

自定义Android复选框

来自分类Dev

自定义复选框问题

来自分类Dev

Inno Setup在下次安装时记住“自定义”复选框状态

来自分类Dev

在WooCommerce Thankyou页面上显示自定义复选框字段状态

来自分类Dev

如何从WooCommerce结帐保存自定义复选框字段状态?

来自分类Dev

Magento自定义集合阻止正确的Massaction复选框选择

来自分类Dev

定义自定义复选框样式

来自分类Dev

jQuery自定义复选框+隐藏的html复选框

来自分类Dev

网格中的CSS自定义复选框-无法删除原始复选框

来自分类Dev

自定义复选框:如何检查复选框是否被选中

来自分类Dev

高级自定义字段复选框显示值

来自分类Dev

Firefox上的自定义复选框失败

来自分类Dev

WordPress中的高级自定义字段复选框

来自分类Dev

AngularJS复选框已选中自定义值

来自分类Dev

自定义列表视图中的复选框

来自分类Dev

自定义复选框不起作用

来自分类Dev

自定义复选框/单选按钮焦点

来自分类Dev

以编程方式检查自定义Treeview复选框

来自分类Dev

自定义复选框类别选择器

来自分类Dev

添加自定义角度复选框

来自分类Dev

自定义Bootstrap-Vue复选框组件

来自分类Dev

使用复选框单击自定义列表

来自分类Dev

Firefox上的自定义复选框失败

来自分类Dev

自定义复选框未呈现

来自分类Dev

使自定义复选框不更改其大小。

来自分类Dev

如何禁用自定义复选框的单击事件