如何在不同的DC下显示同一位图(保存在内存中的)!!!!!!!!分不够可以再加

su5369 2006-03-31 02:53:42
我用MapX(gis软件)开发
且要利用MapX自带的一个响应函数在地图中显示大量车辆,我把车辆图片用CBitmap保存到dc中:

CDC* m_carDC;
m_carDC.CreateCompatibleDC(NULL);
CBitmap *carBmp = new CBitmap;
carBmp->CreateCompatibleBitmap(&m_carDC,1024,768);//第一个参数添加窗口dc也一样
m_carDC.SelectObject(carBmp);
if(!m_carDC.BitBlt(0, 0,1024 ,768 ,NULL,0,0, WHITENESS))//NULL
return -1;
initCarBmp(&m_carDC);//这个函数将各种车辆绘制到m_carDC中
我没有释放资源,因为这个图我要用到程序关闭
////////////////////////////////////////////////////////////////
MapX提供刷新响应函数的参数中提供了 hOutputDC,hAttributeDC
可以通过以下方法关联DC,在上面绘制都正常
CDC dc;
dc.Attach((HDC)hOutputDC);
dc.SetAttribDC((HDC)hAttributeDC

但是调用 dc.TransparentBlt(0,0,32,32,&m_carDC,0,0,32,32,RGB(255, 255, 255));(//注意m_carDC)
时却只显示一个汽车形的黑色轮廓

我怀疑是mapx提供的dc与我系统初始化保存车辆位图的DC不相同

请问有没有办法解决
或能否将为图保存在内存中,使其能任何类型的dc中调用TransparentBlt、BitBlt都能正常使用









...全文
301 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
su5369 2006-04-15
  • 打赏
  • 举报
回复
现在好使了
有一个dc关联错了
谢谢各位帮助
wawaku 2006-04-09
  • 打赏
  • 举报
回复
问人不如问已,多动手比多动脑好
cai114 2006-04-08
  • 打赏
  • 举报
回复
友情UP
xhzxlqt 2006-04-08
  • 打赏
  • 举报
回复
AthlonxpX86(桃源村)
说的已经非常中的了
xhzxlqt 2006-04-08
  • 打赏
  • 举报
回复
1、建议你花半天时间研究位图格式,对你可能有不小的帮助
2、是否可以考虑使用图标

3:看看你在别的测试程序里可不可以正常显示汽车图片
4:看看你能不能在MapX里显示别的图片
while(1)
if(3&4)
{
那你就找到答案了;
break;
}
else
{
timeout? break:continue;
}
AthlonxpX86 2006-04-03
  • 打赏
  • 举报
回复
设备dc(非内存dc)会动态变化的,所以不要试图用你纪录下的hOutputDC,hAttributeDC来操作设备,否则会出错。每次画图到设备dc时都要得到绘图窗口的dc,都必须先要getdc(HWND hwnd),上面代码中的CClientDC dc(this);就是得到绘图窗口dc,你不能凭空就得到,也不能用上次绘图得到的dc,所以你代码中像下面这样就是错误的,之所以在响应函数中能够成功,是因为它上层重新getdc了,然后通过参数传给你,这时候你的下面这个代码才能运行成功,而你在其他地方用的hOutputDC根本就不是MapX提供给你的dc..........
CDC dc;
dc.Attach((HDC)hOutputDC);
dc.SetAttribDC((HDC)hAttributeDC

你要想在其他地方画图到MapX,就必须有MapX的画图窗口句柄,用getdc得到他的dc
su5369 2006-04-03
  • 打赏
  • 举报
回复
是不是两个dc 与 m_carDC关联的调色板不一样
su5369 2006-04-03
  • 打赏
  • 举报
回复
AthlonxpX86(桃源村) :
位图的内存之间的拷贝,如果用DDB,就需要创建内存DC然后Bitblt

我的程序就是那样写的;
但用在mapx提供的dc上 时
dc.TransparentBlt(0,0,32,32,&m_carDC,0,0,32,32,RGB(255, 255, 255));
贴出来的位图中车辆是黑的(我原来的是彩色位图)
AthlonxpX86 2006-04-03
  • 打赏
  • 举报
回复
我快晕倒了,你这问题在还没解决?我还以为你都解决了
/////
有没有方法将 位图读入到内存中 且不依赖设备
我还搞不清楚你到底想要问什么
你说的设备是什么设备?位图源设备吗?
不从设备中读出位图,你想从什么地方读?BMP?
还是因为你自己读不懂你自己写的代码?
CDC* m_carDC;
//创建内存dc
m_carDC.CreateCompatibleDC(NULL);
//创建一个空的位图
CBitmap *carBmp = new CBitmap;
carBmp->CreateCompatibleBitmap(&m_carDC,1024,768);//第一个参数添加窗口dc也一样
//将创建的位图对象选入你创建的内存dc
m_carDC.SelectObject(carBmp);
//用设备填充你的内存dc,此刻的carBmp位图已经被填充了你要的位图了啊,他就在内存中
initCarBmp(&m_carDC);
读入BMP填充位图可以用LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
或者找现成的dib类读取BMP,返回一个位图句柄。
位图的内存之间的拷贝,如果用DDB,就需要创建内存DC,然后Bitblt,如果用DIB可以得到其内存指针然后memcpy(void * pd,void * ps,图片宽*图片高*8/颜色深度);
su5369 2006-04-03
  • 打赏
  • 举报
回复
好吧
我再等等

这么问吧
有没有方法将 位图读入到内存中 且不依赖设备
wawaku 2006-04-03
  • 打赏
  • 举报
回复
一,删贴会扣信誉五分。
二,可怜了AthlonxpX86(桃源村)的一片苦心。
三,请不要急,解决问题需要一个过程。
su5369 2006-04-03
  • 打赏
  • 举报
回复
版主!!!!

版主!!!!版主!!!!

把我这贴删了吧
没我想要的答案
我问的也模糊
su5369 2006-03-31
  • 打赏
  • 举报
回复
就是怎么将关联不同DC的内存图片
在不同的dc中显示
su5369 2006-03-31
  • 打赏
  • 举报
回复
如果把m_carDC初始化放到 mapx响应函数里做
carBmp->CreateCompatibleBitmap(&dc,1024,768);//这里用mapx提供的dc]
这样显示就正常了

我的图片是彩色的




AthlonxpX86 2006-03-31
  • 打赏
  • 举报
回复
先把m_carDC画到自己的窗口上看看m_carDC是否真的被填充了,然后再考虑往hOutputDC上画
CClientDC dc(this);
BitBlt(dc.GetSafeHdc(),0,0,1024 ,768 ,m_carDC,0,0,SRCCOPY);
不要用透明画法(你的图片不会是黑白2色的吧),
su5369 2006-03-31
  • 打赏
  • 举报
回复
to:AthlonxpX86(桃源村) 谢谢回复
////////////////////////////////////////////////////////////////
我在
if(!m_carDC.BitBlt(0, 0,1024 ,768 ,NULL,0,0, WHITENESS))//NULL
return -1;
之后有一个函数
initCarBmp(&m_carDC);//这个函数将各种车辆绘制到m_carDC中

dc.TransparentBlt(0,0,32,32,&m_carDC,0,0,32,32,RGB(255, 255, 255));//这是将车绘制到mapx提供的dc中

而且mapx没有提供获取hOutputDC的函数,只是那个刷新响应函数的参数中有



AthlonxpX86 2006-03-31
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP])
你的回答是什么意思呢?

这里我一定是要用DDB了,因为图片虽然小但要大量的重复贴图,且要旋转
Dib应该不能用吧

你说错了,用DIB更快一些,DDB要进行与设备相关的操作,所以在访问操作像素时,兼容的做法只能够GetPixel,SetPixel,这个函数要进行各种坐标以及像素格式(调色板之类)计算才能返回点,速度超慢,DIB的直接就可以操作BITMAP缓冲区,没有了设备相关信息进行的像素转换操作,我做的一个屏幕录像软件,一开始用DDB的GetPixel作,速度为两秒一帖,用DIB直接缓冲拷贝,我的赛扬800上拷贝一MPEG4电影播放器屏幕,速度可以达到50fps/s
AthlonxpX86 2006-03-31
  • 打赏
  • 举报
回复
1,创建内存DC不对,m_carDC.CreateCompatibleDC(NULL);这就是你内存dc初始化不对的原因,如果MapX有传递他的dc所对应的窗口的话,要填写窗口类,没有得话就用dc句柄调用API创建内存dc
HDC m_carDC=CreateCompatibleDC(hOutputDC);
2
if(!m_carDC.BitBlt(0, 0,1024 ,768 ,NULL,0,0, WHITENESS))//NULL
return -1;
这个错了,dc是不能自己画自己的,我知道你是想填充背景色,应该这样
m_carDC.FillSolidRect(0,0,1024,768,RGB(255,255,255));

3,我不知道比创建内存dc干什么,他除了初始化了自己,好像在没有干什么
dc.TransparentBlt(0,0,32,32,&m_carDC,0,0,32,32,RGB(255, 255, 255));
这句你想干什么?m_carDC好像没什么东西吧,想把m_carDC中的图像透明画在dc上?
如果你想把hOutputDC中画到m_carDC,应该这样
BitBlt(m_carDC,0,0,1024 ,768 ,hOutputDC,0,0,SRCCOPY);

4,想在自己的窗口中显示hOutputDC中的内容?
这样
在你的窗口类绘画函数下面

CClientDC dc(this);
BitBlt(dc.GetSafeHdc(),0,0,1024 ,768 ,hOutputDC,0,0,SRCCOPY);
//或者刚才拷贝到内存的
BitBlt(dc.GetSafeHdc(),0,0,1024 ,768 ,m_carDC,0,0,SRCCOPY);
su5369 2006-03-31
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP])
你的回答是什么意思呢?

这里我一定是要用DDB了,因为图片虽然小但要大量的重复贴图,且要旋转
Dib应该不能用吧
蒋晟 2006-03-31
  • 打赏
  • 举报
回复
) Use DIB when you want to draw a bitmap, direct memory access to the
pixels.
2) Use DIB section when you want GDI's help in generating the bitmap, direct
memory access to the pixels.
3) Use DDB only when performance is an issue when the same bitmap is drawn
repeatitively.
4) Use palette only when running on 16-color or 256-color systems. Even in
this case, use halftone palette as much as possible.

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧