头一次使用GDI+就遇到系列问题
大家好
我最近作一个小项目,头一次用到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上没有给出例子。只有存储在文件中的例子。
如果可以,也望赐教。
谢谢。
重粒子