GDI与GDI+ 贴图

      最近在做png贴图,总结一些经验,以供大家参考,且自己日后查看:由于代码是十年前老代码,所有的图片都是bmp图片,最近更换成2560*1440分辨率,竟然高达几百兆,SE提出使用png替换bmp,代码框架都是基于GDI的,基本都是bmp贴图,如果全部改,工作量相当之大,现在产品经理又提出,UI反应以前框架是文字直接是图片上的,现在要做多语言处理,极其不方便,也要改软件实现,我内心那叫一个崩溃。先上一个之前代码中GDI贴图代码:

       CRect Rect;
        BITMAP bm;
        GetClientRect(&Rect);
        VERIFY(m_bmpBK.GetObject(sizeof(BITMAP),&bm));
        CDC MemDC;
        MemDC.CreateCompatibleDC(NULL);
        CBitmap *pOldBitmap = MemDC.SelectObject(&m_bmpBK);      
        pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
        MemDC.SelectObject(pOldBitmap);

这个代码与PNG完全八杆子打不着,那我要怎末实现PNG贴图呢,再上一个PNG贴图的代码:

Graphics graphics( pDC->m_hDC);
Image image(L"walkman.png", FALSE);
graphics.DrawImage(&image, 10,10);

那,是他,是他,就是他,就是这么简单,就是这么easy,初始化关闭GDI+参考这位网友的,https://www.cnblogs.com/syxchina/archive/2010/06/16/2197400.html

然而我要怎么改第一段代码呢,要实现bmp转png,还要在里面添加文字效果呢,关键是我们要有png图片获取到HBITMAP ,那,上代码:

HBITMAP *hBmp;   

Bitmap *pBmp = Bitmap::FromFile(strName.AllocSysString());
    Graphics *pGraph = Graphics::FromImage(pBmp);
    Gdiplus::SolidBrush solidBrush(Gdiplus::Color::White);
    Gdiplus::FontFamily fontFamily(L"宋体");
    Gdiplus::Font      font(&fontFamily, NEW_POS_Y(16), FontStyleRegular, UnitPoint);
    pGraph->DrawString(theApp.m_sTitle3128.GetBuffer(), -1, &font, Gdiplus::PointF(NEW_POS_X(30), NEW_POS_Y(194)), &solidBrush);

    Color bkClr(128, 128, 0);

    pBmp->GetHBITMAP(bkClr, hBmp);
    DeleteObject(pBmp);
    DeleteObject(pGraph);
哇,到这里总算有眉目了,添加了文字,也有了我们需要的HBITMAP ,好了,改吧,改好上线,一切正常,打完收工。

。。。。

N天过去了,怎么会偶尔出现黑屏?我去。。

查啊查,找啊找,什么情况呢?回归我们的主题,这个血案就是我们这段代码的最后DeleteObject,看似正常,回收了资源,但是真正回收了吗?

当一个绘画对象(如笔或画笔)当前被选入一个设备上下文环境时不要删除该对象。当一个调色板画笔被删除时,与该画笔相关的位图并不被删除,该图必须单独地删除。

明白了吧?对了,这就会出现没有释放的现象,呐,改了

delete pBmp;
    pBmp = NULL;
    delete pGraph;
    pGraph = NULL;

完美收工,,,,

欢迎大家留言,共同讨论。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值