Bitblt的棘手问题!

mxxslh 2009-06-12 09:09:34
我在OnDraw函数中定义一个内存DC:
CDC m_dcCompatible
m_dcCompatible.CreateCompatibleDC(pDC);
CRect rect;
GetClientRect(&rect);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
m_dcCompatible.SelectObject(&bitmap);
m_dcCompatible.BitBlt(0,0,2000,rect.Height(),pDC,0,0,SRCCOPY);
m_dcCompatible.SelectObject(pBrush);
在用内存DC画图后:
CPen tmppen(PS_SOLID, 3, RGB(255, 255, 255));
CPen* poldpen = m_dcCompatible.SelectObject(&tmppen);
m_dcCompatible.MoveTo(100,100);
m_dcCompatible.LineTo(20000, 500);
m_dcCompatible.SelectObject(poldpen);
在用Bitblt粘贴到窗口:
pDC->BitBlt(0,0,20000,rect.Height(),&m_dcCompatible,0,0,SRCCOPY);

但问题是我在内存做的长20000的直线在窗口只有其中的一段,当滑动条向右滑动时不能显示全部的图形?
...全文
50 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tkminigame 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 MXXSLH 的回复:]
引用 2 楼 tkminigame 的回复:
首先不要再OnDraw方法里面生产这种对象。搞清楚OnDraw是在每当更新窗口内容时就会调用。如果生产的对象大,很可能导致程序溢出。
其次,搞清楚CreateCompatibleBitmap生成的对象在哪,可能画到了错误的对象上。
再则,根据硬件不同,生成的图片长宽可能有物理限制,可以查阅相关硬件参数。
还有窗口的CDC是不是设了那么大的设备图像也不知道。总之问题多多。


新手请不要见怪;
我的…
[/Quote]

你能确定确实生成了那么大的内存图吗?系统的窗口生成好像是有限制的,不能无限的大
PanNB 2009-06-15
  • 打赏
  • 举报
回复
看看windows 图形编程的书吧
liutiaoer 2009-06-13
  • 打赏
  • 举报
回复
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
改成bitmap.CreateCompatibleBitmap(pDC,20000,rect.Height());

hhwei1985 2009-06-13
  • 打赏
  • 举报
回复
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
说明你的内存DC里的BMP只有窗口那么大,改成bitmap.CreateCompatibleBitmap(pDC,20000,rect.Height())试试;
mxxslh 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tkminigame 的回复:]
首先不要再OnDraw方法里面生产这种对象。搞清楚OnDraw是在每当更新窗口内容时就会调用。如果生产的对象大,很可能导致程序溢出。
其次,搞清楚CreateCompatibleBitmap生成的对象在哪,可能画到了错误的对象上。
再则,根据硬件不同,生成的图片长宽可能有物理限制,可以查阅相关硬件参数。
还有窗口的CDC是不是设了那么大的设备图像也不知道。总之问题多多。
[/Quote]
新手请不要见怪;
我的程序是先有数据在内存作图,然后在显示在窗口的同时可以左右滚动得查看图形;
首先、内存作图的过程我写在了另外的函数中,如果第一次作图在OnDraw中调用这个函数;
其次、我用bitmap.CreateCompatibleBitmap(pDC,Bit_Width,rect.Height())给内存DC初始化;
这样我的程序是不是可以运行呢?
tkminigame 2009-06-12
  • 打赏
  • 举报
回复
首先不要再OnDraw方法里面生产这种对象。搞清楚OnDraw是在每当更新窗口内容时就会调用。如果生产的对象大,很可能导致程序溢出。
其次,搞清楚CreateCompatibleBitmap生成的对象在哪,可能画到了错误的对象上。
再则,根据硬件不同,生成的图片长宽可能有物理限制,可以查阅相关硬件参数。
还有窗口的CDC是不是设了那么大的设备图像也不知道。总之问题多多。
lambochan 2009-06-12
  • 打赏
  • 举报
回复
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
你的内存DC里的BMP根本就没那么大,所以画的线条超出这个bmp以外的就溢出.

19,464

社区成员

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

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