1. 该画法是采用后台绘画,再在前台显示,这样上一次画的内容不会残留:
//--------------------------------------------------------------------------
// 画图:矩形
// 采用后台画法:新画的图面会替代上一次的画面,之前画的内容不会再显示
// BMP_WIDTH 和 BMP_HEIGHT为画图区域总区域的宽和高
// 函数参数 width 和 height 为当前所画的画面区域的宽和高,
// 不能超出BMP_WIDTH,BMP_HEIGHT
// 注意:使用BMP_WIDTH 和 BMP_HEIGHT的两处位置,如替换成width和height则
// 无法出现背景,上一次画的图会残留显示
//--------------------------------------------------------------------------
void CGraphic::DrawBMP(int width, int height, COLORREF color)
{
// 获取picture控件DC
CDC *pDC;
pDC = m_graDlg_bmp.GetDC(); // m_graDlg_bmp是picture控件对应的变量
// pDC = GetDlgItem(IDC_BMP_DISPLAY)->GetDC(); // 第二种获取picture控件DC的方法
// 创建后台位图buffer
CBitmap bBmp;
bBmp.CreateCompatibleBitmap(pDC,BMP_WIDTH,BMP_HEIGHT); // 将后台BMP buffer和picture控件关联起来
// 注意后两位参数,是显示的区域范围
// 创建后台DC
CDC bDC;
bDC.CreateCompatibleDC(pDC); // 将后台DC和前台DC关联起来
bDC.SelectObject(&bBmp); // 后台DC与后台BMP buffer关联起来
// 创建画刷
CBrush brush;
brush.CreateSolidBrush(color); // 给画刷赋颜色
// 画矩形
CRect rect;
rect.SetRect(0,0,width,height); // 矩形的尺寸,前两个参数为左上角坐标,后两个参数为右下角坐标
bDC.Rectangle(rect); // DC(后台)绘制矩形
bDC.FillRect(&rect,&brush); // 为矩形上色
// 将后台DC绘制的内容copy显示到前台
pDC->BitBlt(0,0,BMP_WIDTH,BMP_HEIGHT,&bDC,0,0,SRCCOPY);
}
2. 创建打开窗口,下载BMP位图,m_graDlg_bmp为Picture控件对应的Control型变量:
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;
picture控件与要显示的位图,通过SetBitMap关联起来;位图的导入通过LoadImage()函数。
也可以在button控件函数中只导入BMP位图,显示在WM_COLOR的Onpaint()函数实现:
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
{
bmpName = openDlg.GetPathName(); // get BMP photo path
}
else
return;
}
void CGraphic::OnPaint()
{
m_graDlg_bmp.SetBitmap((HBITMAP)LoadImage(NULL,bmpName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
}
注意:导入BMP文件要使用LoadImage(),不能用CBitmap::LoadBitmap。
参考:http://blog.csdn.net/phenixyf/article/details/38439435