如何打造一个与众不同的Group控件?先上效果图后讲实现过程,最后再赋上源码。如果大家要是觉得这个效果入不了您的眼那就不用浪费时间往下看了。

实现过程:

       开发环境:VS2019

       第三方库:酷宝-001-先驱者 下载地址:库来帮 www.kulb.cn

       接入方法我前面有讲就不再重述。

#define KB_GROUPBOX_ROUND_FALSE              0                       //关闭圆角
#define KB_GROUPBOX_ROUND_MINI               1                       //开启小圆角
#define KB_GROUPBOX_ROUND_LARGE              2                       //开启大圆角
#define KB_GROUPBOX_ROUND_SUPER              3                       //开启超大圆角

#define KB_GROUPBOX_ROUND_STYLE_ROUND        0                       //圆角样式-圆
#define KB_GROUPBOX_ROUND_STYLE_SHARP        1                       //圆角样式-直

#define KB_GROUPBOX_LAYOUT_DEFAULT           0                       //文字默认排版
#define KB_GROUPBOX_LAYOUT_LEFT              1                       //文字左侧排版
#define KB_GROUPBOX_LAYOUT_RIGHT             2                       //文字右侧排版
#define KB_GROUPBOX_LAYOUT_BOTTOM            3                       //文字底部排版

typedef struct KB_GroupConf
{
    BOOL BRoundRect;    //是否开启圆角 默认不开启
    BYTE BRoundStyle;   //圆角样式 参见KB_GROUPBOX_ROUND_STYLE...
    BYTE BLayout;       //布局方式 参见KB_GROUPBOX_LAYOUT...
    DWORD dwLineColor;  //保存线条颜色
    KB_GroupConf()
    {
        BRoundRect = KB_GROUPBOX_ROUND_FALSE;
        BRoundStyle = KB_GROUPBOX_ROUND_STYLE_ROUND;
        BLayout = KB_GROUPBOX_LAYOUT_DEFAULT;
        dwLineColor = 0xFFFFFFFF;
        // 0xFF  FF  FF  FF
        //透明度 R   G   B
    }
}KB_GROUP_CONF;

以上是须要用到的参数和结构

---------------------------------------------------------------------

下面是关于Group修改须要用到的所有函数


//获取Group全局配置
//buf:保存获取到的配置信息
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIB KB_GetGroupBaseConf(KB_GroupConf& buf);

//修改Group类型的全局配置 所有窗口的Group以及后面新创建的Group都会以这个为准
//GC:新的配置
//反回值:反回已修改的数量 没有反回0

KBLIBRARYAPII KB_SetGroupBaseConf(const KB_GroupConf& GC);

//获取指定Group的配置
//buf:保存获取到的配置信息
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIB KB_GetGroupConf(HWND hWnd, KB_GroupConf& buf);

//修改指定Group的配置
//hWnd:须要修改的窗口句柄,以及该窗口下面的所有子窗口都会被修改
//GC:新的配置
//反回值:反回已修改的数量 没有反回0

KBLIBRARYAPII KB_SetGroupConf(HWND hWnd, const KB_GroupConf& GC);

//通过ID获取Group的配置(KB_GetGroupConf作用相同)
//hParent:Group所在的父窗口句柄
//UID:Group的控件ID
//buf:保存获取到的配置信息
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIB KB_GetIDGroupConf(HWND hParent, UINT UID, KB_GroupConf& buf);

//通过ID修改指定Group的配置(KB_SetGroupConf作用相同)
//hParent:Group所在的父窗口句柄
//UID:Group的控件ID, 以及该ID下面的所有子窗口都会被修改
//GC:新的配置
//反回值:反回已修改的数量 没有反回0

KBLIBRARYAPII KB_SetIDGroupConf(HWND hParent, UINT UID, const KB_GroupConf& GC);

//获取指定Group线条颜色
//hWnd:须要获取的Group句柄
//反回值:成功反回指定Group线条颜色 失败反回0

KBLIBRARYAPID KB_GetGroupLineColor(HWND hWnd);

//修改指定Group线条颜色
//hWnd:须要修改的Group句柄
//dwLineColor:须要设置的线条颜色
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIB KB_SetGroupLineColor(HWND hWnd, DWORD dwLineColor);

//Group开启圆角效果
//hWnd:须要设置的Group句柄
//BRound:开启或关闭圆角 详情见KB_GROUPBOX_ROUND...
//BRoundStyle:圆角样式 详情见KB_GROUPBOX_ROUND_STYLE...
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIB KB_SetGroupRoundRect(HWND hWnd, BYTE BRound, BYTE BRoundStyle = KB_GROUPBOX_ROUND_STYLE_ROUND);

//Group文字排版布局
//hWnd:须要设置的Group句柄
//BLay:布局标志 详情见KB_GROUPBOX_LAYOUT...
//反回值:成功反回TRUE 失败反回FALSE

KBLIBRARYAPIB KB_SetGroupLayout(HWND hWnd, BYTE BLayout);

如果是圆角样式线条颜色等整体修改,那就使用这两个函数

KB_SetGroupConfKB_SetIDGroupConf 功能都是一样的,一个是通过控件句柄去修改,另一个是通过控件ID去修改。

如果只修改其中一个项那就分别使用

KB_SetGroupLineColor 修改线条颜色及透明度

KB_SetGroupRoundRect 修改圆角样式

KB_SetGroupLayout 修改文字排版布局

添加控件ComboBox用于控制圆角的开启,并响应切换消息

nRoundRect = m_Combo1.GetCurSel();
KB_SetGroupRoundRect(m_Map1, nRoundRect, nRoundStyle);

添加控件ComboBox用于控制圆角,并响应切换消息

nRoundStyle = m_Combo2.GetCurSel();
KB_SetGroupRoundRect(m_Map1, nRoundRect, nRoundStyle);

添加控件ComboBox用于控制文字排版,并响应切换消息

int nRe = m_Combo3.GetCurSel();
KB_SetGroupLayout(m_Map1, nRe);

添加按钮控制线条颜色

CColorDialog CDlg(DwordChangeColor(dwLineColor));
    int nRe = (int)CDlg.DoModal();
    if (nRe == IDOK)
    {
        WCHAR wBuffer[MAX_PATH] = { 0 };
        dwLineColor = DwordChangeColor(CDlg.GetColor());
        DWORD dwColor = dwLineColor | 0xFF000000;
        
        KB_SetGroupLineColor(m_Map1, dwColor);
    }

添加滑块控制线条透明度,响应WM_HSCROLL消息

int pos = m_Slider1.GetPos();
    float fpos = (float)pos;
    fpos /= 100;
    fpos *= 0xFF;
    BAlpha = (BYTE)fpos;

    DWORD dwColor = BAlpha << 24;
    dwColor |= dwLineColor & 0x00FFFFFF;
        
    KB_SetGroupLineColor(m_Map1, dwColor);

看看我自己最终实现的效果。

完整源码我已上传,大家可自行下载研究。

更多推荐