为什么WinCE中LoadBitmap加载位图后无法在其上DrawText和画图?
2011-08-10 04:29
323 查看
之前想在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都可行!
转自:
/article/6370220.html
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都可行!
转自:
/article/6370220.html
相关文章推荐
- 为什么WinCE中LoadBitmap加载位图后无法在其上DrawText?
- Horizontalscrollview里添加一个布局,该布局里在添加一个自定义的View,为什么View里用Canvas画图无法显示?
- WinCE中加载位图的方法
- MFC封装接口DLL 对话框无法显示,或者位图加载不上
- Android 设置全屏,画图,加载位图
- Fragment为什么不加载ListView,无法显示listview,,求教
- Horizontalscrollview里添加一个布局,该布局里在添加一个自定义的View,为什么View里用Canvas画图无法显示?
- CBitmapButton位图按钮 WinCE 下无法正常使用
- 双缓冲加载位图 WinCE
- wince&evc下加载BMP位图文件
- 加载位图 LoadBitmap
- Horizontalscrollview里添加一个布局,该布局里在添加一个自定义的View,为什么View里用Canvas画图无法显示?
- 双缓冲加载位图 WinCE
- winform加载时,为什么画图不执行了
- Horizontalscrollview里添加一个布局,该布局里在添加一个自定义的View,为什么View里用Canvas画图无法显示?
- Java技术_Java千百问(0007)_为什么会报"错误: 找不到或无法加载主类 HelloWord.class"
- view中加载位图,且loadbitmap(IDB_BITMAP),有问题怎么解决
- 双缓冲加载位图 WinCE
- java编译通过,为什么运行却提示找不到或无法加载主类?
- WinCE中加载位图的方法