位图的显示

<p>
本人创建了一个基于对话框的应用程序来显示位图
</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 句柄为空的现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值