之前想在WinCE中背景图片上DrawText,可是不成功,代码如下:
1 CPaintDC dc( this ); // device context for painting
2
3 CRect rect ;
4 CBitmap bBitmap ; // 加载背景图片
5 CBitmap * pOldBitmap;
6 CDC displayDC; // 加载背景图片的内存DC
7 CFont font;
8
9 rect.left = 80 ;
10 rect.right = 180 ;
11 rect.top = 15 ;
12 rect.bottom = 47 ;
13 font.CreateFont( 30 , 12 , 0 , 0 , FW_BOLD, FALSE, FALSE, 0 , ANSI_CHARSET,
14 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
15 DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T( " Arial " ) );
16
17 bBitmap.LoadBitmap(IDB_BITMAP1); // 加载背景图片
18
19 displayDC.CreateCompatibleDC( & dc); // 创建兼容DC
20
21 pOldBitmap = displayDC.SelectObject( & bBitmap); // 选入背景图片
22
23 displayDC.SetBkMode(TRANSPARENT); // 透明背景
24 displayDC.SetTextColor(RGB( 255 , 255 , 255 ));
25 displayDC.SelectObject( & font);
26
27 displayDC.DrawText(_T( " Temp " ), & rect,DT_SINGLELINE | DT_LEFT); // 写字 画图。。。。
28
29 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了。代码如下:
1 tempDC.CreateCompatibleDC(pDC);
2 DisplayDC.CreateCompatibleDC(pDC);
3
4 pOldBitmap = tempDC.SelectObject( & bBitmap); // 选入背景位图
5 bDrawbmp.CreateCompatibleBitmap(pDC, 800 , 480 ); // 创建屏幕DC兼容位图才能在其上写字
6 pOldDrawbmp = DisplayDC.SelectObject( & bDrawbmp); // 选入兼容位图
7 DisplayDC.BitBlt( 0 , 0 , 800 , 480 , & tempDC, 0 , 0 ,SRCCOPY); // 将tempDC中的位图拷到DisplayDC中
8
9 DisplayDC.SetBkMode(TRANSPARENT); // 透明背景
10 DisplayDC.SetTextColor(WHITE);
11 DisplayDC.DrawText(_T( " Temp " ), & rect,DT_SINGLELINE | DT_LEFT); // 写字 画图。。。。
12
不知道有没有更好的解决办法?有的话麻烦留言相告,谢了 :)。