MFC 在对话框显示图片的多种方法-动态载入图片
函数说明=================================================================函数说明
void LoadImage(DWORD nID,LPCTSTR ImageURL)
参数说明:
nID 需要绘制图像的窗口
ImageURL 图象在硬盘上的地址(动态载入,只支持BMP图象)
void ShowImage(DWORD nID)
参数说明:
nID 需要绘制图像的窗口
实现过程=================================================================实现过程
1.首先在CLoginDlg类中声明一个变量: CBitmap m_bmp;
2.在对话框中加入一个picture 标签,名为IDC_STATIC1,作为绘制图像的窗口.
3.BOOL CLoginDlg::OnInitDialog()
{
CDialogDlg::OnInitDialog();
LoadImage(IDC_STATIC1,"c:\\\\login.bmp");
return TRUE;
}
4.void CLoginDlg::OnPaint()
{
//CPaintDC dc(this); 一定要去除
// TODO: Add your message handler code here
ShowImage(IDC_STATIC1);
}
函数过程=================================================================函数过程
void CLoginDlg::LoadImage(DWORD nID,LPCTSTR ImageURL)
{
if( m_bmp.m_hObject != NULL )//判断
m_bmp.DeleteObject();
/载入图片
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),ImageURL,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if( hbmp == NULL )
return FALSE;
该断程序用来取得加载的BMP的信息
m_bmp.Attach( hbmp );
DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
m_bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biWidth; //得到图像宽度
int cy=bminfo.biHeight; //得到图像高度
///得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片
CRect rect;
GetDlgItem(nID)->GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(nID)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
return TRUE;
}
void CLoginDlg::ShowImage(DWORD nID)
{
///绘制图像
//CPaintDC dc(this); //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.
CPaintDC dc(GetDlgItem(nID)); //用此句,得到picture控件的DC,图像将被绘制在控件上.
//CDC dc;
//dc.m_hDC=::GetDC(NULL); //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上.
CRect rcclient;
GetDlgItem(nID)->GetClientRect(&rcclient);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
memdc.SelectObject( &bitmap );
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
CDC maskdc;
maskdc.CreateCompatibleDC(&dc);
CBitmap maskbitmap;
maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);
maskdc.SelectObject( &maskbitmap );
maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,rcclient.left, rcclient.top, SRCCOPY);
CBrush brush;
brush.CreatePatternBrush(&m_bmp);
dc.FillRect(rcclient, &brush);
dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),&memdc, rcclient.left,rcclient.top,SRCPAINT);
brush.DeleteObject();
}