我先用打开对话框打开需要的bmp图像取得图片的地址,代码如下:
void CBmpLockDlg::OnBnClickedOpen()
{
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp||",AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
m_path = dlg.GetPathName();//取得路径
UpdateData(FALSE);
}
else
{
return;
}
}
然后在OnPaint的else中加入以下代码void CBmpLockDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CString strImage=m_path;
//加载位图
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); if (hBitmap==NULL)
{
return;
}
CBitmap m_Bmp;
m_Bmp.Attach(hBitmap); //获取位图信息
BITMAP bmpinfo;
m_Bmp.GetBitmap(&bmpinfo);
//创建内存DC
CDC MemDC;
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Bmp);
CRect rect;
GetClientRect(&rect); pDC->StretchBlt(rect.left,rect.right,rect.Width(),rect.Height()-50,&MemDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
Invalidate();
CDialog::OnPaint();
}
}位图一直显示不出来,怎么回事?
void CBmpLockDlg::OnBnClickedOpen()
{
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp||",AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
m_path = dlg.GetPathName();//取得路径
UpdateData(FALSE);
}
else
{
return;
}
}
然后在OnPaint的else中加入以下代码void CBmpLockDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CString strImage=m_path;
//加载位图
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); if (hBitmap==NULL)
{
return;
}
CBitmap m_Bmp;
m_Bmp.Attach(hBitmap); //获取位图信息
BITMAP bmpinfo;
m_Bmp.GetBitmap(&bmpinfo);
//创建内存DC
CDC MemDC;
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Bmp);
CRect rect;
GetClientRect(&rect); pDC->StretchBlt(rect.left,rect.right,rect.Width(),rect.Height()-50,&MemDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
Invalidate();
CDialog::OnPaint();
}
}位图一直显示不出来,怎么回事?
Invalidate();
CDialog::OnPaint();
改在下面的代码试试:
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hBitmap==NULL)
{
return;
}
CBitmap m_Bmp;
m_Bmp.Attach(hBitmap); //获取位图信息
BITMAP bmpinfo;
m_Bmp.GetBitmap(&bmpinfo);
//创建内存DC
CDC *MemDC=new CDC;
CPaintDC dc(this);
MemDC->CreateCompatibleDC(&dc);
MemDC->SelectObject(&m_Bmp);
CRect rect;
GetClientRect(&rect); dc.StretchBlt(rect.left,rect.right,rect.Width(),rect.Height()-50,MemDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
Invalidate();
CDialog::OnPaint();
// in .h CBitmap m_bitmap;
// in ctor: m_bitmap.LoadBitmap(IDB_CLOUDS);
BOOL CDlgHasToolBarDlg::OnEraseBkgnd(CDC* pDC)
{
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our window's client area
CRect rect;
GetClientRect(&rect);
// Fill the window's client area with our bitmap
pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
dcMem.SelectObject( pOldBitmap );
//
return TRUE;//CDialog::OnEraseBkgnd(pDC);
}
http://blog.csdn.net/xianglitian/article/details/6023656
void CDemoBitmapDlgDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CString m_path;
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp||",AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
m_path = dlg.GetPathName();
}
else
{
return;
}
CBitmap cbmp;
HBITMAP hbitmap;
hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
cbmp.Attach(hbitmap);
BITMAP bm;
cbmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(cbmp);
CRect lRect;
GetClientRect(&lRect);
GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&poldBitmap);
}
0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
有报异常,停在 CDC dcMem;上...
bmpinfo有问题。不需要
直接:
bmp.bmWidth,bmp.bmHeight
应该是rect.top
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,"Blue hills.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hBitmap==NULL)
{
return;
} CBitmap m_Bmp;
m_Bmp.Attach(hBitmap);
//获取位图信息
BITMAP bmpinfo;
m_Bmp.GetBitmap(&bmpinfo);
//创建内存DC
CDC MemDC;
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Bmp);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height()-50,&MemDC,
0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
// Invalidate();
CDialog::OnPaint();
}
}
if (hBitmap==NULL)
{
return;
} CBitmap m_Bmp;
m_Bmp.Attach(hBitmap);
//获取位图信息
BITMAP bmpinfo;
m_Bmp.GetBitmap(&bmpinfo);
//创建内存DC
CDC MemDC;
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Bmp);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height()-50,&MemDC,
0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);你rect.top写成rect.right
本来你已经画好了,你又invalidate(),把画得全部擦除了。
还有CDC都有了,何必再去获取呢,
最后,为什么用invalide呢,这个不应该加,这个是外部刷新用的,在里面就不用了吧!