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提供了大量能使我们快速便捷地处理数据的函数和方法。