C++ MFC自定义控件:【CStatic/Group】分组框扩展,颜色、边框圆角等

2 篇文章 1 订阅

C++ MFC GroupEx 自定义控件:CStatic/Group

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

 

 


前言

MFC做Group的扩展,处理都是在OnPaint里面实现的,同事娜娜也帮我完善改进一点,完整代码:https://download.csdn.net/download/baidu_27541197/14950629,左上角关注小编不迷路!


提示:以下是本篇文章正文内容,下面案例可供参考

一、如何制作?

原生分组框继承CStatic,说白了就是一个标签类型,我们就继承CStatic,具体外观样式在OnPaint里面实现

二、使用步骤

1.头文件

代码如下(示例):

class GroupEx:public CStatic
{
private:
    //Add control properties for use during initialization. 2020/12/24 by LiNa.[add]
    static const COLORREF        BORDERCOLOR = RGB(202, 208, 215);
    static const COLORREF        TEXTCOLOR = RGB(0, 0, 0);
    static const unsigned char    BORDERSTYLE = PS_DOT;
public:
    /************************************************************************/
    /* 文字                                                                     */
    /************************************************************************/
    CString Text;
    /************************************************************************/
    /* 获取文字                                                                     */
    /************************************************************************/
    CString GetText();
    /************************************************************************/
    /* 设置文字                                                                     */
    /************************************************************************/
    void SetText(LPCSTR str);
    /************************************************************************/
    /* 文字颜色                                                                     */
    /************************************************************************/
    COLORREF  TextColor;
    /************************************************************************/
    /* 设置文字颜色                                                                     */
    /************************************************************************/
    void SetTextColor(COLORREF rgb);
    /************************************************************************/
    /* 边框颜色                                                                     */
    /************************************************************************/
    COLORREF BorderColor;
    /************************************************************************/
    /* 设置边框颜色                                                                     */
    /************************************************************************/
    void SetBorderColor(COLORREF rgb);
    UINT BORDER_STYLE;
    /************************************************************************/
    /* 设置边框样式                                                                     */
    /************************************************************************/
    void SetBorderStyle(UINT);
    LPCTSTR    FontName;
    /************************************************************************/
    /* 设置字体                                                                     */
    /************************************************************************/
    void SetFontName(LPCTSTR font);
    /************************************************************************/
    /* 背景颜色                                                                     */
    /************************************************************************/
    COLORREF BackColor;
    /************************************************************************/
    /* 设置背景颜色                                                                     */
    /************************************************************************/
    void SetBackColor(COLORREF color);
    /************************************************************************/
    /* 圆角大小                                                                     */
    /************************************************************************/
    INT RoundSize;
    /************************************************************************/
    /* 设置圆角大小                                                                     */
    /************************************************************************/
    void SetRoundSize(INT);
    GroupEx();
    ~GroupEx();
protected:

    afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
};

2.具体实现

代码如下(示例):

void GroupEx::OnPaint()
{

    CRect rect;
    GetClientRect(&rect);
    CPaintDC pDC(this);
    pDC.SetBkMode(TRANSPARENT);
    pDC.SelectStockObject(NULL_BRUSH);
    //创建笔
    CPen pen;
    //虚线并设置颜色
    pen.CreatePen(BORDER_STYLE, 1, BorderColor);
    //选择笔
    pDC.SelectObject(&pen);
    //创建字体
    CFont font;
    //设置默认字体
    font.CreateFontA(
        FONT_SIZE, 0, 0, 0, FW_THIN, FALSE, FALSE, FALSE, ANSI_CHARSET,
        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, 
        FontName
    );
    //选择字体
    pDC.SelectObject(&font);
    if (BackColor != Color::Transparent)
    {
        //创建笔刷
        CBrush brush;
        brush.CreateSolidBrush(RGB(236, 240, 247));
        brush.CreateSolidBrush(BackColor);
        选择笔刷
        pDC.SelectObject(&brush);
        pDC.Rectangle(&rect);
    }
    //获取文字
    std::string str1 = Text;
    int len = str1.length();
    if (len > 0)
    {
        //画文字
        TEXTMETRIC textMetric;
        pDC.GetTextMetrics(&textMetric);
        int offsetMove = (((textMetric.tmPitchAndFamily & 0x0F))*(len - 1) + textMetric.tmAveCharWidth*len);
        pDC.LineTo(20, 0);
        if (offsetMove > 0)
        {
            pDC.MoveTo((len <= 6 ? offsetMove + textMetric.tmAveCharWidth : offsetMove), 0);
        }
        pDC.LineTo(rect.Width(), 0);
        pDC.LineTo(rect.Width(), rect.Height());
        pDC.LineTo(0, rect.Height());
        pDC.LineTo(0, 0);
        rect.top = -(textMetric.tmHeight / 2);
        rect.left = 20 + textMetric.tmAveCharWidth;
        pDC.SetTextColor(TextColor);
        pDC.DrawText(Text, &rect, DT_LEFT | DT_TOP | DT_SINGLELINE);
    }
    else {
        //没有文字,走默认绘制
        pDC.RoundRect(&rect, CPoint(RoundSize, RoundSize));
    }

    pen.DeleteObject();
    font.DeleteObject();

    ReleaseDC(&pDC);
    CStatic::OnPaint();
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baidu_27541197

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值