GDI+で高速な描画
GDI+を利用してお絵かきツールのようなものを作成しようと思っています。
しかしdrawImage()での画面への描画が非常に遅いようで、描いてみると線がカクカクしてしまいます。
アンチエイリアスやアルファブレンドが必要なのでGDI+を利用したいのですが、どうにか高速に描画させる方法はないでしょうか?
下記は現在のソースの一部です。
static Bitmap *offscreenBitmap //描画処理はこっちに
static Graphics *offscreen;
static Graphics *onscreen; //画面表示用
static RECT rect; //クライアント領域
static POINTS posPts,pts; //一つ前と現在のマウス座標
static BOOL bLButtonDown;
Pen nomalPen(Color(100,0,0,0), 1); //描画用ペン
switch(msg){
case WM_CREATE:
GetClientRect(hWnd,&rect);
offscreenBitmap = new Bitmap(rect.right, rect.bottom); //ビットマップ生成
offscreen = new Graphics(offscreenBitmap);
offscreen->SetCompositingMode(Gdiplus::CompositingModeSourceOver);
offscreen->SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);//アンチエイリアス有効化
offscreen->Clear(Color(255,255,255)); //初期化
onscreen = new Graphics(hWnd); //ウインドウ表示用
onscreen->SetCompositingMode(CompositingModeSourceCopy);
break;
case WM_LBTTONDOWN:
bLButtonDown = TRUE;
posPts=MAKEPOINTS(lp)
break;
case WM_MOVE:
pts=MAKEPOINTS(lp)
if(bLButtonDown){
offscreen->DrawLine(&nomalPen, posPts.x, posPts.y, pts.x, pts.y);//線描画
posPts.x=pts.x;
posPts.y=pts.y;
}
InvalidateRect(hWnd,&rect,0);//ウインドウを更新
break;
case WM_PAINT:
onscreen->DrawImage(offscreenBitmap,0,0);//画面に書き出し
break;
}
お礼
じつは描画プログラムで、マウスの現在位置を示す、クロスヘアカーソル(画面一杯の十字カーソル)を作成していました。 VB6の時代は、DrawMode=XORPenで手軽にやっていたのですが、2番目のリンクがとても参考になりました。 VB6の時代は、BitBltの扱いがとても面倒だったのですが、GDI+では逆に、BitBlt(CopyfromScreen)の扱いがとても楽になっている事に気づけました。 ありがとうございます。