![]() |
Rechteck an (unter) Maus-Position malen
Hallo #,
der angehängte Code soll folgendes machen. Beim Bewegen der Maus soll an der Maus-Position etwas (hier ein Rechteck) gemalt werden. Um beim Bewegen den originalen Form-Zustand wiederherzustellen, habe ich mir beim Programmstart dem Client-Bereich des Forms in ein Bitmap geladen. Vor dem Neuzeichnen wird der alte Form-Zustand wieder in seinen alten Platz geschrieben. Problem: es funktioniert nicht richtig. Nehme statt // XXX das // YYY, geht es, aber die Performance ist mieser. Ich mache doch gar nix verkehrt ;( Oder ? Was komisch ist, setzte ich Form.Color z.B. auf clBlue und speichere das Bitmap nach dem Sichern ins Bitmap ab, ist es trotzdem weiss ! Hülfe ! Danke Heiko PS: Das ganze soll in ein großes System eingebaut werden, ist also nur der Test.
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ieview, imageenview; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormActivate(Sender: TObject); private { Private-Deklarationen } procedure DrawRect(theCanvas: TCanvas; X, Y: Integer); public { Public-Deklarationen } end; var Form2: TForm2; OldX, OldY: integer; bmRestore: TBitmap; const C_Width = 40; C_Height = 20; implementation {$R *.dfm} procedure TForm2.DrawRect(theCanvas: TCanvas; X, Y: Integer); var Poly: array of TPoint; begin SetLength(Poly, 5); Poly[0].X:= X; Poly[0].Y:= Y; Poly[1].X:= X+40; Poly[1].Y:= Y; Poly[2].X:= X+40; Poly[2].Y:= Y+20; Poly[3].X:= X; Poly[3].Y:= Y+20; Poly[4].X:= X; Poly[4].Y:= Y; SetPolyFillMode(theCanvas.Handle, ALTERNATE); theCanvas.Brush.Color:= clBlue; with theCanvas do begin Polygon(Poly); end; SetLength(Poly, 0); Poly:= NIL; end; procedure TForm2.FormActivate(Sender: TObject); begin BitBlt(bmRestore.Handle, 0, 0, ClientWidth, ClientHeight, Self.Canvas.Handle, 0, 0, SRCCOPY); end; procedure TForm2.FormCreate(Sender: TObject); begin OldX:= -1; OldY:= -1; Self.Canvas.Pen.Color := clBlue; Self.Canvas.Pen.Width := 1; bmRestore:= TBitmap.Create; bmRestore.Width := ClientWidth; bmRestore.Height := ClientHeight; bmRestore.PixelFormat := pf24bit; // bmRestore.PixelFormat := pf24bit; end; procedure TForm2.FormDestroy(Sender: TObject); begin bmRestore.Free; end; procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_RETURN then begin BitBlt(Self.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, bmRestore.Canvas.Handle, 0, 0, SRCCOPY); end; end; procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if OldX<>-1 then begin { Wiederherstellen des ursprünglichen Inhaltes } // XXX BitBlt(Self.Canvas.Handle, OldX, OldY, C_Width, C_Height, bmRestore.Canvas.Handle, OldX, OldY, SRCCOPY); // YYY // BitBlt(Self.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, // bmRestore.Canvas.Handle, 0, 0, SRCCOPY); end; // Invalidate; DrawRect(Self.Canvas, X, Y); OldX := X; OldY := Y; Exit; end; end. |
AW: Rechteck an (unter) Maus-Position malen
ohne Zwischenspeicherung und wiederherstellung:
Delphi-Quellcode:
procedure TForm5.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin invalidate; end; procedure TForm5.FormPaint(Sender: TObject); var p:Tpoint; begin p := ScreenToClient(Mouse.CursorPos); Canvas.rectangle(p.X - 5, p.Y - 5, p.X + 5, p.Y + 5); end; |
AW: Rechteck an (unter) Maus-Position malen
Zum Verständnis: Bringt folgendes das gewünschte Ergebnis?
Tausch mal
Delphi-Quellcode:
mit
// Invalidate;
Delphi-Quellcode:
aus.
Self.Repaint;
Aber falls noch mehr dazukommt würde ich eher mit einem ![]() |
AW: Rechteck an (unter) Maus-Position malen
Hallo,
Invalidate zwingt aber das Form, sich komplett zu malen, genau das will ich vermeiden. OffScreenBitmap-Suche war erfolglos (der Link auf Luckies ist tot). Heiko |
AW: Rechteck an (unter) Maus-Position malen
ein eigener Mauscursor würde Dir nicht den gewünschen Effekt bringen?
|
AW: Rechteck an (unter) Maus-Position malen
Hallo,
eigener Mauszeiger bringt nichts, TRechteck war nur als Bsp gedacht. Aber: OffScreenBitmap Ich dussel, so etwa habe ich es ja gedacht. Die Frage ist nur, wenn es 24bit-Bilder sind, ob das normale BitBlt dass dann kann. Muss ich mal sehen. Danke #Update# Mit dem OffScreenBitmap scheint es zu gehen, ist ja praktisch ein DoubleBuffered nachgebaut. Jetzt mal sehen, was die schicke Komponente sagt, wo ich das benutzen muss. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz