为什么WinCE中LoadBitmap加载位图后无法在其上DrawText和画图?

本文探讨了在WinCE环境中使用DrawText函数遇到的问题及解决方案。通过创建额外的内存DC并选择兼容位图,成功实现在背景图片上绘制文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

之前想在WinCE中背景图片上DrawText,可是不成功,代码如下:

 

CPaintDC dc(this); // device context for painting

CRect rect ;
CBitmap   bBitmap  ; //加载背景图片
CBitmap* pOldBitmap;
CDC    displayDC; //加载背景图片的内存DC
CFont font;

rect.left = 80;
rect.right = 180;
rect.top = 15;
rect.bottom = 47;
font.CreateFont(30, 12, 0, 0, FW_BOLD, FALSE, FALSE, 0,  ANSI_CHARSET,  OUT_DEFAULT_PRECIS,  CLIP_DEFAULT_PRECIS,    DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS, _T("Arial") );

bBitmap.LoadBitmap(IDB_BITMAP1);//加载背景图片

displayDC.CreateCompatibleDC(&dc);//创建兼容DC

pOldBitmap = displayDC.SelectObject(&bBitmap); //选入背景图片

displayDC.SetBkMode(TRANSPARENT);    //透明背景
displayDC.SetTextColor(RGB(255,255,255));
displayDC.SelectObject(&font);

displayDC.DrawText(_T("Temp"),&rect,DT_SINGLELINE|DT_LEFT);//写字 画图。。。。

dc.BitBlt(0,0,800,480,&displayDC,0,0,SRCCOPY);//内存DC---->屏幕DC奇怪的是同样的代码,在Windows中就可以。后终于在一篇文章中发现原因:

LoadBitmap:

    从资源加载位图,返回Device Independent 位图。WINCE 的设计为了节省内存,从资源中加载的位图不进行内存的复制,位图buffer直接用的是进程内静态资源区域的空间。实际上是把不可写的位图选进了DC, 那么试图对这个DC进行任何的写操作都将失败。

MSDN:

Bitmaps returned from LoadBitmap are not writable. All calls to write to a bitmap returned by the LoadBitmap function will fail.

我的解决办法是再创建一内存DC,并选入新建的兼容位图,将之前从资源加载位图的DC拷贝过来,就可以DrawText了。代码如下:

 

tempDC.CreateCompatibleDC(pDC);  
DisplayDC.CreateCompatibleDC(pDC);  


pOldBitmap = tempDC.SelectObject(&bBitmap); //选入背景位图
bDrawbmp.CreateCompatibleBitmap(pDC,800,480); //创建屏幕DC兼容位图才能在其上写字
pOldDrawbmp = DisplayDC.SelectObject(&bDrawbmp); //选入兼容位图
DisplayDC.BitBlt(0,0,800,480,&tempDC,0,0,SRCCOPY);  //将tempDC中的位图拷到DisplayDC中

DisplayDC.SetBkMode(TRANSPARENT);   //透明背景
DisplayDC.SetTextColor(WHITE);
DisplayDC.DrawText(_T("Temp"),&rect,DT_SINGLELINE|DT_LEFT);//写字 画图。。。。
 

不知道有没有更好的解决办法?有的话麻烦留言相告,谢了 :)。

 

转者注:在真实DC屏幕操作bitblt前,进行DrawText或者LineTo都可行!

转自:

http://www.cnblogs.com/dahai/archive/2010/06/22/1762945.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值