最近在做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;
完美收工,,,,
欢迎大家留言,共同讨论。