本人创建了一个基于对话框的应用程序来显示位图
</p>
<p>
我们知道显示位图有两种方法,一种是在响应WM_PAINT消息的时候去贴图,可以用BitBlt函数,也可以用StretchBlt函数,另外一种响应方式就是WM_ERASEBKGND函数来贴图,前者可能会出现闪烁的现象,后者相对不那么明显,我采用的是后者
</p>
<p>
BOOL C贴图Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
bitmap.LoadBitmapW(IDB_BITMAP1);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
BITMAP bitmapinfo;
bitmap.GetBitmap(&bitmapinfo);
pDC->StretchBlt(0,0,bitmapinfo.bmWidth,bitmapinfo.bmHeight,&dcCompatible,0,0,bitmapinfo.bmWidth,bitmapinfo.bmHeight,SRCCOPY);
bitmap.DeleteObject();
//return CDialog::OnEraseBkgnd(pDC); 若是擦出背景那么将会返回真
return true;
}<br />
注意的是,在return CDialog::OnEraseBkgnd(pDC);函数响应完成的时候位图不会出现,因为如果 OnEraseBkgnd函数已经擦除了背景,那么将返回真,否则调用基类的函数去擦出背景,因为我们重新贴了一幅图在上面,所以我们认为我们是擦出了背景,所以我们应该返回真TRUE,另外CBitmap的声明,必须声明为全局变量,否则一旦发生析构,那么就会把相关资源也同时销毁,图像也显示不出来,另外在因为每一次都把bitmap都关联一幅位图,所以要使用bitmap.DeleteObject()函数来解除关联,或者是将对象与位图关联的LoadBitmapW放在初始化函数中WM_ININT,因为这个消息值发送一次==
</p>
在OnPaint函数里面贴图
MessageBox(TEXT("选进设备描述表失败"));
void CControl5Dlg::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
{
CPaintDC dc(this);
BITMAP m_bitinfo1;
m_bitmap2.GetBitmap(&m_bitinfo1);
CDC dcCompatible1;
if(!dcCompatible1.CreateCompatibleDC(&dc))
{
MessageBox(TEXT("创建兼容设备描述表失败"));
}
if(!dcCompatible1.SelectObject(&m_bitmap2))
{
MessageBox(TEXT("选进设备描述表失败"));
}
dc.StretchBlt(0,0,m_bitinfo1.bmWidth,m_bitinfo1.bmHeight,&dcCompatible1,0,0,m_bitinfo1.bmWidth,m_bitinfo1.bmHeight,SRCCOPY);
/*dcCompatible1.Detach();//注意这不能删除,因为在括号内变量,会自动删除
dcCompatible1.DeleteDC();
dc.Detach();
dc.DeleteDC();
m_bitmap2.Detach();
m_bitmap2.DeleteObject();*/
CDialog::OnPaint();
}
}
否则会出现CDC 句柄为空的现象