2012-04-11 8 views
3

無効にすることなく描画できるGDIPlusのデモコードはすべてあります。だからTScrollbox上でMouseMoveでTImageを使用して描画するとき、GDIPlus APIで長方形を無効にする方法はありますか?GDIPlusでInvalidateRectを行う方法

function NormalizeRect (R: TRect): TRect; 
begin 

    // This routine normalizes a rectangle. It makes sure that the Left,Top 
    // coords are always above and to the left of the Bottom,Right coords. 

    with R do 
    begin 

    if Left > Right then 
     if Top > Bottom then 
     Result := Rect (Right, Bottom, Left, Top) 
     else 
     Result := Rect (Right, Top, Left, Bottom) 
    else if Top > Bottom then 
     Result := Rect (Left, Bottom, Right, Top) 
    else 
     Result := Rect (Left, Top, Right, Bottom); 

    end; 

end; 

procedure TFormMain.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    if Line1.Down then 
    begin 
    GPPointStart := MakePoint (X, Y); 
    end; 
end; 

procedure TFormMain.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); 
var 
    graphics: TGPGraphics; 
    pen: TGPPen; 
    SolidBrush: TGPSolidBrush; 
    rgbTriple: windows.RGBTRIPLE; 
    iRect: TRect; 
begin 
    if Line1.Down then 
    begin 
    if ssLeft in Shift then 
    begin 
     iRect := NormalizeRect (Rect (X, Y, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height)); 
     InvalidateRect (ScrollBox1.Handle, @iRect, TRUE); 
     graphics := TGPGraphics.Create (Image1.Picture.Bitmap.Canvas.Handle); 
     graphics.Flush (FlushIntentionFlush); 
     GPPointEnd := MakePoint (X, Y); 
     rgbTriple := ColorToRGBTriple (ColorBox1.Selected); 
     pen := TGPPen.Create (MakeColor (StrToInt (Alpha1.Text), rgbTriple.rgbtRed, rgbTriple.rgbtGreen, rgbTriple.rgbtBlue) 
     ); 
     pen.SetWidth (StrToInt (Size1.Text)); 
     graphics.DrawLine (pen, GPPointStart.X, GPPointStart.Y, GPPointEnd.X, GPPointEnd.Y); 
     graphics.Free; 
     Image1.Refresh; 
    end; 
    end; 
end; 

これは、次のようになります。デルファイ2010にhttp://www.progdigy.comからGDIPlusのライブラリを使用して enter image description here

答えて

6

InvalidateRectコマンドは、GDI +とは何の関係もありません。 ウィンドウの特定の部分が無効であり、再描画する必要があることをOSに指示するコマンドです。 OSが次にそのウィンドウを再描画することを決定すると、プログラムはどのくらいのウィンドウにペインティングが必要かをOSに尋ねることができます。

あなたのコードはInvalidateRectを呼び出しています。そして、それはウィンドウの同じ部分にペイントしています。しかし、ウィンドウはまだ無効になっていますので、OSはwm_Paintメッセージを次回処理すると、その領域を後で再描画するようにプログラムに依頼します。

私はあなたのイメージが異なって見えると思いますが、スクロールボックスを無効にすることとは何の関係もありません。キャラクターの目をクリックしたように見え、マウスを右にドラッグすると時計回りになります。

マウスを動かすたびに、元のパイントから現在のマウス位置に新しい行を描画します。現在表示されているビットマップに線を直接描画し、イメージコントロールに描画を依頼します。これは、ビットマップに従います。ビットマップは、別の行を追加したビットマップです。

は、私はあなたがそうでなければunsullied画像の上に表示されるように黒い線をもたらすために、各マウスの動きのためだった起こることを意図したものと思います。 InvalidateRectはそれを助けません。前の行の位置に元のイメージを再描画し、新しい行を描画する必要があります。 InvalidateRectは、以前のグラフィック操作を元に戻すのには役立ちません。ウィンドウのある部分をいつか再描画する必要があることをOSに伝えます。無効化されたピクセルの色をに再描画する必要があるとは限りません。それはwm_Paintのためです。

+0

答えをありがとう。私はあなたが私に言っていることを理解していますが、それを修正する方法はまだ分かりません。それ以上の助言? – Bill

+0

ビットマップに描画する代わりに、スクロールボックスに描画します。そのため、ビットマップは変更されません。古い行領域を無効にします。画像を古い線の上に塗りつぶすために更新します。次に、新しい行を描画します。より多くの助けが必要な場合は、あなたが本当にやろうとしていることについて新しい質問をしてください。 –

+0

@Rob、*ビットマップに描画する代わりにスクロールボックス*に描画すると、 'TScrollBox'にはペイントできるキャンバスがありません。コンテンツのスクロールを考慮すると、それは良い考えではありません。私はあなたがイメージを描く代わりにビットマップに描くのではなく、あなたが*を意味すると思います*あなたはありませんか? – TLama

関連する問題