绘画经验总结------ OnPaint()、BMP位图导入及显示

52 篇文章 1 订阅

1. Picture绘图:

    在picture控件上绘图,分 在控件消息函数中实现在系统WM_PAINT消息函数OnPaint中实现 两种:

    1.1 在某个控件(比如button)的消息函数中绘制时,只绘制一次,当窗口拖移或者最小化以后,绘制的图像会发生变化或消失;

          程序示例:

void CGraphic::OnBnClickedBtnR()
{
	CDC *pDC;
	pDC = m_graDlg_bmp.GetDC();	// m_graDlg_bmp是picture控件对应的变量

	// 创建画刷
	CBrush brush;
	brush.CreateSolidBrush(color);	// 给画刷赋颜色

	// 画矩形
	CRect rect;
	rect.SetRect(0,0,width,height);		// 矩形的尺寸,前两个参数为左上角坐标,后两个参数为右下角坐标
	pDC->Rectangle(rect);				// DC(后台)绘制矩形
	pDC->FillRect(&rect,&brush);			// 为矩形上色
}


 

   1.2 绘制的图形如要一直保持显示,则需要在系统WM_PAINT消息函数中进行绘制。

         在需要绘制的对话框中用Class Wizard添加WM_PAINT消息即可。在需要显示的地方调用Invalidate()函数即可;

         程序示例:

void CGraphic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: Add your message handler code here	

	switch(patternType)
	{
	case RED:
		{
			COLORREF rColor = RGB(255,0,0);

			DrawBMP(bmpCol,bmpRow,rColor);
			break;
		}
	case GREEN:
		{
			COLORREF rColor = RGB(0,255,0);

			DrawBMP(bmpCol,bmpRow,rColor);
			break;
		}
	case BMP:
		{
			CDC * pDC;
			pDC = GetDlgItem(IDC_BMP_DISPLAY)->GetDC();		// 获取picture控件DC

			CDC * bkDc = new CDC;		// 创建后台DC buffer
			bkDc -> CreateCompatibleDC(pDC);	// 后台DC与picture控件DC相关联

			bkDc -> SelectObject(bkBMP);	// 后台DC存入之前已导入的BMP位图

			pDC -> BitBlt(0,0,bmpCol,bmpRow,bkDc,0,0,SRCCOPY);		// picture控件显示

			delete bkDc;	// 不加此句,更改窗口大小时会影响BMP位图显示

			break;
		}
	default: break;
	}

	// Do not call CDialogEx::OnPaint() for painting messages
}


 

2.  BMP位图的导入及显示:

     2.1  一般导入显示方法:添加picture控件,用Class Wizard创建一相关变量m_graDlg_bmp

CString bmpName;	//BMP photo path

	//--------------------------------------------------------------------
	// 打开BMP位图并显示出来
	//--------------------------------------------------------------------
	CFileDialog openDlg(true,"*.bmp",NULL,NULL,"*.bmp|*.bmp||");	// creat open BMP dialog
	if (openDlg.DoModal()==IDOK)	// finish the photo choose
	{
		bmpName = openDlg.GetPathName();	// get BMP photo path

		// display bmp photo
		HBITMAP oldBmp = m_graDlg_bmp.SetBitmap((HBITMAP)LoadImage(NULL,bmpName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE));		// associate bmp photo with bmp control

		DeleteObject(oldBmp);
	}
	else
		return;

将外部的BMP位图导入通过LoadImage函数;

导入后的数据句柄通过picture控件(CStatic类)的SetBitmap函数与picture控件相关联。 

此时位图是导入到了CStatic类的一个对象中(picture控件)。        

这样picture控件就会一直显示导入的BMP位图,如果此时在OnPaint()中也绘制picture则没有效果。    

 

       2.2  Picture控件如果即可以绘制自己所需图形又要显示导入的BMP位图,则必须把picture作为CDC,并将位图导入到CDC中来。

              示例程序如下,本示例中打开BMP位图在button消息函数中,位图显示放在OnPaint函数中:

              定义全局变量:CBitmap bkBMP;  // BMP位图后台buffer

void CGraphic::OnBnClickedBtnLoadbmp()
{
	// TODO: Add your control notification handler code here

	//--------------------------------------------------------------------
	// 打开BMP位图并显示出来
	//--------------------------------------------------------------------
	CFileDialog openDlg(true,"*.bmp",NULL,NULL,"*.bmp|*.bmp||");	// creat open BMP dialog
	if (openDlg.DoModal()==IDOK)	// finish the photo choose
	{
		CString bmpName = openDlg.GetPathName();	// get BMP photo path

		bkBMP.m_hObject = (HBITMAP)::LoadImage(NULL,bmpName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
		// 通过LoadImage获取位图数据,转存人BMP后台buffer

	}
	else
		return;
        patternType = BMP;
	Invalidate();	// 调用OnPaint函数
}
void CGraphic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: Add your message handler code here	
        CDC * pDC;
	pDC = GetDlgItem(IDC_BMP_DISPLAY)->GetDC();		// 获取picture控件DC

        CDC * bkDc = new CDC;			// 创建后台DC buffer
	bkDc -> CreateCompatibleDC(pDC);	// 后台DC与picture控件DC相关联

	bkDc -> SelectObject(bkBMP);	// 后台DC存入之前已导入的BMP位图

	pDC -> BitBlt(0,0,bmpCol,bmpRow,bkDc,0,0,SRCCOPY);		// picture控件显示
}

参考:http://zhidao.baidu.com/link?url=srnP3x7k7q1LZoVre1domfabNlvPcC51dj4aVZCzn2H40PYbV43oZJmyG3nqvrYZksXn2DXFwzFtjbWduc91c_&from=commentSubmit#answers88903431




 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值