MFC GDI绘图

描述:
       在MFC界面中如果你想要自绘一些图形,则需要在对话框的OnPaint()消息映射函数中通过GDI绘图技术自己去绘制图形。
       MFC的每个界面窗口都是一个CDC设备上下文对象,CDC类有许多绘图的接口,可以用这些接口去绘制点、直线、矩形、图像等。而且与CDC的一些绘图工具如画笔(CPen)、画刷(CBrush)、字体(CFont)配合着用,效果会更好。
       有一点要注意,就是绘图的顺序很重要。界面像一个画板,如果你先绘制了文字,然后去绘制背景,那文字就会被背景遮盖住了,所以我们要设计好我们的画画顺序,这点要注意。

  1. 绘制边框和背景
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);
	}
}
  1. 绘制点
void UICustom::DoDraw(CDC* pDc)
{
	COLORREF colorPt = RGB(255, 0, 0);			//点颜色
	CPoint pt(100, 100);						//点

	pDc->SetPixel(pt,colorPt);
}
  1. 绘制直线
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);
}
  1. 绘制文本
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();
}
  1. 绘制图片
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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值