zoukankan      html  css  js  c++  java
  • 为什么WinCE中LoadBitmap加载位图后无法在其上DrawText?

    之前想在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  

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

  • 相关阅读:
    vuecli3.0 优雅使用svg
    解决vueRouter 跳转相同路由报错
    vue项目中使用 web worker 开启多线程
    项目经常使用的common.js 方法
    vue实现3D词云
    怎么禁止用户点击f12查看数据,查看网页代码,布局样式
    1:vue项目优化总结
    手写一个发布订阅
    vue3.0 reactive 理解
    ifram父子组件传参
  • 原文地址:https://www.cnblogs.com/dahai/p/1762945.html
Copyright © 2011-2022 走看看