绘画经验总结------ 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
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮