Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rahmen um Controls zeichnen (https://www.delphipraxis.net/35386-rahmen-um-controls-zeichnen.html)

perle 6. Dez 2004 14:50


Rahmen um Controls zeichnen
 
hallo zusammen, bin mir jetzt nicht ganz sicher, ob das hier reingehört oder nach Multimedia, ich versuchs einfach mal hier.

Bei Assarbads EDA oder Motzi's X-Spy

Ich will einen Rahmen um das aktuelle Fenster unter der Maus zeichnen. Soweit alles kein Problem, also das bekommen des Handles und das zeichnen selber bekomme ich auch hin.

Allerdings bleiben an manchen Stellen häßliche Überbleibsel der Rahmen, wo sie nicht mehr hingehören(also von fenstern wo vorher der Rahmen drum gezeichnet wurde)

wie macht ihr das, das diese "Reste" bei euch nicht bleiben? Reicht es aus, ein WM_PAINT an das letzte Fenster zu schicken? Ich hatte sowas mal probiert, da hatte es nicht geklappt, ich weiß aber auch nicht, ob ich da nicht vielleicht was falsch gemacht habe.

QuickAndDirty 6. Dez 2004 16:10

Re: Rahmen um Controls zeichnen
 
Also
Zitat:

Bei Assarbads EDA oder Motzi's X-Spy
was ist das?

Ich finde nichts schweres daran Rahmen um eine control zu zeichnen und
die Artefakte zu entfernen. hast du da irgendeine besondere art und weise wie
du das haben willst?
Wozu brauchst du die Rahmen vielleicht verstehe ichs dann.
meinst du zum markieren oder zum anzeigen von zusammenhängen?

Wo Zeichnest du den Rahmen denn hin aufs 'DISPLAY' Device ?

perle 6. Dez 2004 16:58

Re: Rahmen um Controls zeichnen
 
ich zeichne folgendermaßen:


Delphi-Quellcode:
procedure TWindowHandle.DrawRect(toChildWnd: Boolean = False);                              // Ref# 007

  procedure FrameWindow(Wnd: HWnd);
  var
    Rect: TRect;
    DC: hDC;
    OldPen, Pen: hPen;
    OldBrush, Brush: hBrush;
    X2, Y2: Integer;
  begin
    { Get the target window's rect and DC }
    GetWindowRect(Wnd, Rect);
    DC := GetWindowDC(Wnd);
    { Set ROP appropriately for highlighting }
    SetROP2(DC, R2_NOT);
    { Select brush and pen }
    Pen := CreatePen(PS_InsideFrame, 4, RGB(255,0,0));
    OldPen := SelectObject(DC, Pen);
    Brush := GetStockObject(Null_Brush);
    OldBrush := SelectObject(DC, Brush);
    { Set dimensions of highlight }
    X2 := Rect.Right - Rect.Left;
    Y2 := Rect.Bottom - Rect.Top;
    { Draw highlight box }
    Rectangle(DC, 0, 0, X2, Y2);
    { Clean up }
    SelectObject(DC, OldBrush);
    SelectObject(DC, OldPen);
    ReleaseDC(Wnd, DC);
    { Do NOT delete the brush, because it was a stock object }
    DeleteObject(Pen);
  end;

var
  hNewWnd : HWND;
begin
  hNewWnd := 0;
  case toChildWnd of
    TRUE : hNewWnd := FHandle;
    FALSE: hNewWnd := FMainHandle;
  end;
  { To avoid flickering, remove the old frame ONLY if moved to new window }
  if hNewWnd <> hOldWnd then
  begin
    if hOldWnd <> 0 then
      FrameWindow(hOldWnd);
    if hNewWnd <> 0 then
      FrameWindow(hNewWnd);
    hOldWnd := hNewWnd;
  end;

end;
diese prozedur rufe ich in einem Timer immer wieder mit einem Neuen handle auf

QuickAndDirty 7. Dez 2004 10:12

Re: Rahmen um Controls zeichnen
 
Buffer zunächst das Fenster.
Baue Das erwünschte Bild in einem 3. Bitmap zusammen.
Das heist kopiere dir die Stellenaus dem buffer die du brauchst
und male oder kopiere die ForderGrund Dinge Drauf , bzw tue es eben nicht.
Dann copierst du alles aus der Verbindungs bitmap in das Fenster

Geht mit BitBlT so hab ich mal (als kleiner Bub ) flackerfreie Sprites programmiert,
müsste aber auf alles passen. :-D

Wie du es machst ist ja letzten endes egal hauptsache du Bufferst den alten innhalt
und stellst ihn bei Bedarf wieder her.

Assarbad 26. Dez 2004 15:24

Re: Rahmen um Controls zeichnen
 
@perle: EDA ist OpenSource ;) ... also einfach reinschauen.

Kleiner Tip an die andern: man muß da nix puffern. Der Trick ist, daß fremde Control nach dessen Verlassen anzuweisen sich neu zu zeichnen. Dies geschieht über die normalen Windows-Mechanismen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 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