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

2019-04-15 15:40发布

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); // 给画刷赋颜 {MOD} // 画矩形 CRect rect; rect.SetRect(0,0,width,height); // 矩形的尺寸,前两个参数为左上角坐标,后两个参数为右下角坐标 pDC->Rectangle(rect); // DC(后台)绘制矩形 pDC->FillRect(&rect,&brush); // 为矩形上 {MOD} }
     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