头一次使用GDI+就遇到系列问题

Baryon 2004-06-09 08:37:05
大家好

我最近作一个小项目,头一次用到GDI+就遇到一个难题。希望您能在百忙之中不吝指教。

我要做的东西类似MS Paint,不同的是背景是一幅图片(背景可以随时变更),在前景作画,背景和前景可以分别保存。
我使用了两个Bitmap,背景是图片,前景使用alpha=0的Brush初始化,以做到透明的效果。
Graphics graphics(m_pBitmap);
SolidBrush brush(Color(0,255,255,255));
graphics.FillRectangle(&brush, 0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());


作画的时候通过处理WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE消息,利用
Graphics graphics(m_pBitmap);
graphics.DrawLine(...);
来画线。

在处理WM_PAINT的时候,做了以下处理
void CDemoView::DoPaint(CDCHandle dc, RECT& rcClip)
{
// draw rect only
CRect clipBox(rcClip);

Graphics graphics(dc.m_hDC);

Rect clipRect( clipBox.left,
clipBox.top,
clipBox.Width(),
clipBox.Height() );

graphics.SetClip( clipRect );

if( !m_bHavedBGCached )
{
if ( m_pCachedBGBitmap )
{
delete m_pCachedBGBitmap;
m_pCachedBGBitmap = NULL;
}
m_pCachedBGBitmap=new CachedBitmap(m_pBackgroundBitmap, &graphics);
m_bHavedBGCached = TRUE;
}
//Draw Background
graphics.DrawCachedBitmap(m_pCachedBGBitmap, 0, 0);

//Draw
ImageAttributes imAtr;
imAtr.SetColorKey(Color(255,255,255),Color(255,255,255),ColorAdjustTypeBitmap);

graphics.DrawImage(m_pBitmap, clipRect, 0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight(), UnitPixel, &imAtr);

graphics.ReleaseHDC(dc.m_hDC);
}

我的问题是:
问题1,描画的速度很慢,有明显的停顿感,不像MS Paint那样流畅。
问题2,我不知道如何使用一个完全透明的Pen来覆盖已经描画的前景,以达到橡皮的效果。我只好使用了白色Pen来做这个工作,然后在OnPaint里使白色成为透明色。这一步明显降低了速度。

我参照的例子是:
http://www.codeproject.com/vcpp/gdiplus/doodle.asp
Doodle - a basic paint package in GDI+
Using GDI+ to create a paint program with soft brushes and loading/saving images.
这个程序就有明显的描画停顿感。

你可以告诉我为了提高速度正确的做法是怎样的吗?我在news group上看了一些关于GDI+速度的讨论,一些明显不合理的说法是购买新的机器和图形卡。
有一个人提出了乐观的观点
http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&selm=3d04d2f8%240%248147%24ba620e4c%40news.skynet.be

- Use 32 bpp for the backbuffer format.
- Set graphic quality as needed (antialias on/off, etc...).
- Prefer no clipping and creating a small backbuffer to GDI+ clipping.
- Try to do when you can, your own "fast clipping" (if you got a bouding box
for your object, use it, instead of asking GDI(+) to draw a polygon). (will
provide a REAL speedup)
- Mix GDI/GDI+ when needed, if you don't need GDI+ stuff, fallback on GDI
(for instance, to draw the sheet of paper, the rule, ...).

问题4,感觉这些都是有价值的观点,希望能得到你的点评。我是头一次使用GDI+,满头雾水。


问题5,另外我还有一个问题是关于Recording Metafiles的。MSDN上说:The recorded commands can be stored in memory。
可是具体怎样存储在memory里呢?msdn上没有给出例子。只有存储在文件中的例子。
如果可以,也望赐教。

谢谢。
重粒子
...全文
238 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cyclone2050 2004-07-06
Baryon(重粒子)

什么时候贴解决方案,我等着呢。我遇到的情况和你一样
  • 打赏
  • 举报
回复
Baryon 2004-06-15
我的问题部分解决了。等我回头贴出来解决方案。
现在我只能说,GDI+非常强大。
  • 打赏
  • 举报
回复
酒红绿叶 2004-06-11
GDI+的速度是有点慢,你可以用GDI,内存等都自己处理,麻烦些,可是速度会有所提高!
  • 打赏
  • 举报
回复
wuzhiwen 2004-06-11
问题一:提高速度,按MSDN里的来说,可以用CbufferBitmap,还有可以用双缓存,前面一个我试过,效果并不明显,可以是我做的太简单了,第二个我没试过
问题二,如果是还做橡皮擦效果的话,我建议你还是用GDI来做,这样效果会高很多的有例子的
问题四,这些确实是不错的,如果你的要求很高的话呢,建议不要选择GDI+,我现在就因为选择GDI+,头痛啊
问题五,我没有试过
  • 打赏
  • 举报
回复
Baryon 2004-06-09
up
  • 打赏
  • 举报
回复
相关推荐
发帖
图形处理/算法
加入

1.9w+

社区成员

VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
申请成为版主
帖子事件
创建了帖子
2004-06-09 08:37
社区公告
暂无公告