显示一幅位图很简单,代码如下:
void CTuopan1View::OnShowbmp()
{
// TODO: Add your command handler code here
CFileDialog bmpfile(TRUE,"bmp","*.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP位图文件(*.bmp)|*.bmp||",NULL);
if(IDOK==bmpfile.DoModal()){
CString FileName=bmpfile.GetPathName();
HBITMAP mybmp;
mybmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,NULL,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
HBITMAP oldbmp;
CDC memdc;
CDC *dc=GetDC();
CRect rect;
memdc.CreateCompatibleDC(dc);
GetClientRect(rect);
oldbmp = (HBITMAP)memdc.SelectObject(mybmp);
//显示图片
dc->BitBlt(20,20,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
memdc.SelectObject(oldbmp);
ReleaseDC(dc);
}
}
另一种显示位图的方法:
1、定义一个位图指针变量为窗口(Wnd)类的成员变量:
CBitmap *bitmap;
CDC* mydc;
2、在窗口(Wnd)类的构造函数中,为位图变量申请空间,并从硬盘上加载此图片:
bitmap = new CBitmap;
bitmap->m_hObject = LoadImage(NULL,"my.bmp",IMAGE_BITMAP,100,100,LR_LOADFROMFILE)
%%参数:第一个:图片句柄,当直接从硬盘上加载的时候设为NULL,
%%第二个:文件路径,如果是当前路径,直接写文件名
%%第三个:文件类型
%%第四、五个:图片的宽和高
%%第六个:位图加载方式,LR_LOADFROMFILE表示按文件名的方式加载
3、将加载的图片和当前的窗口联系起来,
mdc = new CDC;%%在内存中申请一块区域,前提是定义了一个Wnd类的成员变量CDC *mdc;
CClientDC dc(this);%%定义一个客户作图区的变量,this指针就是当前窗口
mdc->CreatCompatibleDC(&dc);%%将申请的内存和客户作图区联系起来
mdc->SlectObject(bitmap);%%将图片放入申请的内存。
4、显示图片:
dc->BitBlt(20,20,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
%%显示图片并将这句话放在OnDraw函数中。每次重绘都会调用
注意:
(1)申请堆内存new,可以在构造函数中执行
(2)mdc->CreatCompatibleDC(&dc);这句话是创建一个与指定设备兼容的内存设备上下文环境,对于全局变量mdc来说,它只能创建一次。所以这句话不能放在OnPaint函数中,因为这个函数会被多次执行。也不能放在构造函数中,如果放在上面两个函数中会导致程序崩溃。(具体原因尚且不清楚)。所以只有把这句话放在OnCreate函数中,这个函数只有在窗口创建的时候会被调用一次。