描述:
在MFC界面中如果你想要自绘一些图形,则需要在对话框的OnPaint()消息映射函数中通过GDI绘图技术自己去绘制图形。
MFC的每个界面窗口都是一个CDC设备上下文对象,CDC类有许多绘图的接口,可以用这些接口去绘制点、直线、矩形、图像等。而且与CDC的一些绘图工具如画笔(CPen)、画刷(CBrush)、字体(CFont)配合着用,效果会更好。
有一点要注意,就是绘图的顺序很重要。界面像一个画板,如果你先绘制了文字,然后去绘制背景,那文字就会被背景遮盖住了,所以我们要设计好我们的画画顺序,这点要注意。
- 绘制边框和背景
void UICustom::DoDraw(CDC* pDc)
{
bool bBorderColor = true; //是否有边框颜色
COLORREF colorBorder = RGB(0, 0, 0); //边框颜色
bool bBackgroundColor = true; //是否有背景颜色
COLORREF colorBackground = RGB(255, 255, 255); //背景颜色
if (bBorderColor && !bBackgroundColor)
{///只绘制边框颜色
CPen penBorder(PS_SOLID, 1, colorBorder);
CPen* pOldPen = pDc->SelectObject(&penBorder);
auto pOldBrush = pDc->SelectStockObject(NULL_BRUSH);
pDc->Rectangle(m_rect); //绘制矩形(用画笔画线,用画刷填充颜色)
pDc->SelectObject(pOldPen);
pDc->SelectObject(pOldBrush);
}
else if (!bBorderColor && bBackgroundColor)
{///只绘制背景颜色
CPen penBackground(PS_SOLID, 1, colorBackground);
CPen* pOldPen = pDc->SelectObject(&penBackground);
CBrush brushBackground(colorBackground);
CBrush* pOldBrush = pDc->SelectObject(&brushBackground);
pDc->Rectangle(m_rect); //绘制矩形(用画笔画线,用画刷填充颜色)
pDc->SelectObject(pOldPen);
pDc->SelectObject(pOldBrush);
}
else if (bBorderColor && bBackgroundColor)
{///边框颜色和背景颜色都绘制
CPen penBorder(PS_SOLID, 1, colorBorder);
CPen* pOldPen = pDc->SelectObject(&penBorder);
CBrush brushBackground(colorBackground);
CBrush* pOldBrush = pDc->SelectObject(&brushBackground);
pDc->Rectangle(m_rect); //绘制矩形(用画笔画线,用画刷填充颜色)
pDc->SelectObject(pOldPen);
pDc->SelectObject(pOldBrush);
}
}
- 绘制点
void UICustom::DoDraw(CDC* pDc)
{
COLORREF colorPt = RGB(255, 0, 0); //点颜色
CPoint pt(100, 100); //点
pDc->SetPixel(pt,colorPt);
}
- 绘制直线
void UICustom::DoDraw(CDC* pDc)
{
COLORREF colorLine = RGB(0, 255, 0); //线颜色
CPoint ptStart(10,10); //起点
CPoint ptEnd(200,400); //终点
CPen penLine(PS_SOLID, 1, colorLine);
CPen* pOldPen = pDc->SelectObject(&penLine);
pDc->MoveTo(ptStart);
pDc->LineTo(ptEnd);
pDc->SelectObject(pOldPen);
}
- 绘制文本
void UICustom::DoDraw(CDC* pDc)
{
COLORREF colorText = RGB(255, 0, 0); //文本颜色
CString strText = _T("你好"); //文本字符串
UINT alignText = DT_LEFT | DT_VCENTER | DT_SINGLELINE; //对齐方式
int nHeightText = 14; //文字高度
CString strFaceName = _T("黑体"); //字体名称
CRect rectText(0,0,100,50); //文字区域
auto oldMode = pDc->SetBkMode(TRANSPARENT);
//The text alignment mode for the device context must include the TA_LEFT, TA_TOP, and TA_NOUPDATECP flags.
auto oldAlign = pDc->SetTextAlign(TA_LEFT | TA_TOP | TA_NOUPDATECP);
auto oldColor = pDc->SetTextColor(colorText);
CFont fontText;
fontText.CreateFont(
nHeightText, //字体高度
0, //字体宽度
0, //指定偏离垂线与x轴在显示面上的夹角(用0.1度单位)
0, //指定字符基线和x轴之间的夹角(用0.1度单位)
FW_MEDIUM, //文字粗细(FW_HEAVY为最粗)
0, //指定字体是否为斜体
0, //指定字体是否带下划线
0, //指定是否是字体字符突出。如果设置为非零,则突出。
ANSI_CHARSET, //指定字体的字符集
OUT_DEFAULT_PRECIS, //指定所需的输出精度
CLIP_DEFAULT_PRECIS, //指定所需的剪贴精度
DEFAULT_QUALITY, //指示字体的输出质量
DEFAULT_PITCH, //指定字体的间距
strFaceName //指定字体名称
);
CFont* pOldFont = pDc->SelectObject(&fontText);
pDc->DrawText(strText, rectText, alignText);
pDc->SetBkMode(oldMode);
pDc->SetTextAlign(oldAlign);
pDc->SetTextColor(oldColor);
pDc->SelectObject(pOldFont);
fontText.DeleteObject();
}
- 绘制图片
void UICustom::DoDraw(CDC* pDc)
{
bool bStretch = false; //是否拉伸
CRect rectImage(150, 100, 200, 150); //图片区域
CImage image;//支持JPGE GIF BMP PNG多种格式图片
if (image.Load(_T("E:\\01-work\\temp\\MFCApplication3\\MFCApplication3\\res\\测试图标.png")) == S_OK)
{
int nImageWidth = image.GetWidth();
int nImageHeight = image.GetHeight();
if (!bStretch)
{///不拉伸
image.BitBlt(
pDc->m_hDC, //目标 HDC
rectImage.left, //目标矩形左上角的逻辑 x 坐标
rectImage.top, //目标矩形左上角的逻辑 y 坐标
SRCCOPY //指定要执行的光栅操作(SRCCOPY:拷贝源位图到目标位图)
);
}
else
{///拉伸
image.StretchBlt(
pDc->m_hDC, //目标 HDC
rectImage.left, //目标矩形左上角的逻辑 x 坐标
rectImage.top, //目标矩形左上角的逻辑 y 坐标
rectImage.Width(), //目标矩形的宽度(以逻辑单元表示)
rectImage.Height(), //目标矩形的高度(以逻辑单元表示)
SRCCOPY //指定要执行的光栅操作(SRCCOPY:拷贝源位图到目标位图)
);
}
//释放资源
image.Destroy();
}
}