AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Selektionsrahmen zeichnen ohne Überreste nach Scrollen
Thema durchsuchen
Ansicht
Themen-Optionen

Selektionsrahmen zeichnen ohne Überreste nach Scrollen

Ein Thema von ULIK · begonnen am 1. Jul 2009
Antwort Antwort
Benutzerbild von ULIK
ULIK
Online

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#1

Selektionsrahmen zeichnen ohne Überreste nach Scrollen

  Alt 1. Jul 2009, 13:25
Hallo,

ich habe ein Problem mit Zeichnen auf dem Canvas und scrollen: in einer Paintbox, die in einer Scrollbox eingebettet ist, will ich einen bestimmen Bereich mit der Maus selektieren. Dabei soll der aktuelle Bereich immer mittels eines Rahmens angezeigt werden. Das funktioniert auch ganz gut, solange man nicht über die Ränder der Scrollbox kommt. Dann soll nämlich automatisch gescrollt werden. Tut das Programm auch, aber dabei bleiben jetzt Teile des Selektionsrahmens stehen.
Im Anhang ist eine Demoversion, die das Problem zeigt.

hier mal der wichtigste Code:
Delphi-Quellcode:
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FActive := True;
  
  FStartPoint := Point(x,y);
  FEndPoint := FStartPoint;

  // Zeichenmode Selektionsrahmen setzen
  PaintBox1.Canvas.Pen.Style := psDashDot;
  PaintBox1.Canvas.Pen.Mode := pmNotXor;
  PaintBox1.Canvas.Brush.Style := bsClear;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if FActive then
  begin
    // alter Rahmen zum Löschen erneut zeichnen
    PaintBox1.Canvas.Rectangle(rect(FStartPoint, FEndPoint));

    // neuer Endpunkt
    FEndPoint := Point(X,Y);

    // neuer Rahmen
    PaintBox1.Canvas.Rectangle(rect(FStartPoint, FEndPoint));

    // vertikales scrollen
    if (Y > ScrollBox1.VertScrollBar.Position + ScrollBox1.ClientHeight) then
     ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position + 4;

    if (Y < ScrollBox1.VertScrollBar.Position) then
     ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - 4;

    // Horizontales scrollen
    if (X > ScrollBox1.HorzScrollBar.Position + ScrollBox1.ClientWidth) then
     ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position + 4;

    if (X < ScrollBox1.HorzScrollBar.Position) then
     ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position - 4;

  end;
end;
Hat jemand eine Idee, wie man das umgehen kann? Ich hab es schon damit versucht, das Zeichnen des Selektionsrahmens in den OnPaint der Paintbox zu verschieben und im MouseMove nur ein Invalidate der Paintbox aufzurufen. Das geht zwar dann, ist aber leider für die echte Anwendung nicht möglich, da hier das Zeichnen sehr zeitintensiv ist und durch das dann erfolgende häufige Zeichnen die Anwendung de facto nicht mehr zu bedienen ist.


vielen Dank,
Uli
Angehängte Dateien
Dateityp: zip testselframe_130.zip (1,6 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz