在这里我主要参考了一下这个网页的介绍,介绍的很不错。
http://www.programfan.com/article/showarticle.asp?id=2453
在此对此作者表示感谢。
但我在实际应用过程中,遇到以下这个问题,我在fileopen中能够正确显示出来,但是画面更新后显示的图片就不再存在,因此我想到在OnPaint()函数中实现(我的时一个对话框工程,没有OnDraw函数),这里还有个问题是给该类增加了很多成员函数,因为如果用局部变量的话,在每次更新的时候可能会出问题。
并且我是在某个子窗口中显示图片。
我的步骤如下:1)在FileOpen函数中只是获得了文件名,并且更新
if(dlgFile.DoModal()==IDOK)
{
m_FileName=dlgFile.GetFileName();
Invalidate();
}
2)在OnPaint()函数中
先判断m_fileName 是否为空,如果非空,才做以下步骤
if(!m_FileName.IsEmpty())
{
。。。。。。
}
在拷代码之前,我先把用到的成员变量拷上,
CWnd* m_pWnd;
CString m_FileName;
CRect m_ClientRect;
CRect m_ZhiFangTu;
CMenu* m_Menu;
BITMAP bmMetric;
下面是实现代码
CPaintDC dc1(GetDlgItem(IDC_STATIC_KEY)); //定义某子窗口的设备上下文
CDC memDC; // 定义内存变量DC,存放图片
CBitmap bm,*pbm;
// BITMAP bmMetric;
// CRect m_ZhiFangTu;
m_pWnd=GetDlgItem(IDC_STATIC_KEY);
m_pWnd->GetClientRect(&m_ClientRect);
m_pWnd->ClientToScreen(&m_ClientRect);
ScreenToClient(&m_ClientRect);
// ClientToScreen(&m_ClientRect);
hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
m_FileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
bm.Attach(hbmp);
bm.GetBitmap(&bmMetric);
memDC.CreateCompatibleDC(&dc1);
pbm=memDC.SelectObject(&bm);
/* dc.StretchBlt(0,0,100,100,
&memDC,0,0,100,100,SRCCOPY);
*/
// CString out;
// out.Format("rect.left = %d,rect.top = %d ",rect.left,rect.top);
// out.Format("right =%d bottom =%d ,bmWidth=%d,bmHeight=%d,left = %d,top = %d",m_ClientRect.right,m_ClientRect.bottom,bmMetric.bmWidth,bmMetric.bmHeight,
// m_ClientRect.left,m_ClientRect.top);
// MessageBox(out);
dc1.StretchBlt(0,0,m_ClientRect.Width(),m_ClientRect.Height(),
&memDC,0,0,bmMetric.bmWidth,bmMetric.bmHeight,SRCCOPY);
// 到此为止,即可以在需要显示图片的空间内显示图片了,
//在一个SingleDocument中显示图片,需要在OnDraw函数中写代码
如下代码有一定的错误
HBITMAP hbitmap=(HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//if( hbitmap == NULL )
// MessageBox("加载位图失败!");
// bitmap.Detach();
bitmap.Attach(hbitmap);
bitmap.GetObject(sizeof(bmInfo),&bmInfo);
CDC dcComp;
dcComp.CreateCompatibleDC(pDC);
dcComp.SelectObject(&bitmap);
pDC->BitBlt(0,0,bmInfo.bmWidth,bmInfo.bmHeight,&dcComp,0,0,SRCCOPY);
bitmap.Detach();
// 注意:bitmap 在Attach前后都要检查是否已经关联了图像,如果已经关联,则需要取消。并且在所有图片显示完成后需要释放开辟的资源。