AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
Thema durchsuchen
Ansicht
Themen-Optionen

Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC

Ein Thema von Memnarch · begonnen am 4. Mai 2013 · letzter Beitrag vom 13. Feb 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#11

AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC

  Alt 5. Mai 2013, 15:11
Mh Okay.
Danke fürs testen. Muss ich dann mal weiter gucken.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#12

AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC

  Alt 13. Feb 2014, 19:32
So, ich hoffe es ist mir erlaubt diesen Thread einmal aus der Versenkung zu holen.
Ich habe das Problem mit dem Zittern nämlich lösen können, und möchte es gerne für die Nachwelt dokumentieren.

Also nochmal kurz:
Wenn mein selbsgezeichneter Fensterrahmen reskaliert wurde, laggte dieser etwas hinterher. Ich konnte mir da nie einen Reim drauf machen. Jetzt weiß ich woran es lag und wer schuld ist.

Wer ist Schuld? Microsoft
Was genau? DWM (Desktop Window Manager, stichwort Composition)

Das zuckeln tritt unter Windows7-Systemen auf(nicht bei allen, unter anderem wohl auch Treiberabhängig), undzwar aus folgendem Grund:
Nur weil etwas per GDI gezeichnet wird, landet es nicht auch unbedingt sofort im Backbuffer für den DWM. Das bedeutet, dass dieser mitunter 1-2Frame alte Daten verarbeitet. Der updated den Backbuffer nämlich nur, wenn auch genug Pixeldaten vorhanden sind.

Also ist die Lösung, dem DWM das ganze einfach nochmals ins Gesicht zu hauen, als ob alle Pixel(oder sehr viele) neu/geändert wären.

Wie bekomm ich das nun hin?
Nicht ganz cpu-sparend, aber simpel:
Ich erstelle für meine Form einen TDirect2DCanvas. Und bevor ich im NCPaint oder WMPaint etwas mach(en lasse), rufe ich BeginDraw und danach EndDraw auf.

Dies sorgt dafür, dass die gesamte Formoberfläche rübergeschupst wird, und die Form rendert korrekt. Hiermal ein vergleichsvideo:
http://www.youtube.com/watch?v=vyQYidyRS_c

Über folgenden Entwickler aus dem FL-STudio Team(ebenfalls in Delphi Woot woot^^) bin ich auf diesen Hack gekommen:
http://stackoverflow.com/questions/1...-in-win7-8-gdi

Kurzfassung
Delphi-Quellcode:
unit Styles.Forms;

interface

uses
  Classes, Types, Windows, Messages, Forms, Graphics, Direct2D;

type
  TForm = class(Forms.TForm)
  private
    FCanvas2D: TDirect2DCanvas;
    procedure PaintNC(var MSG: TWMNCPaint); message WM_NCPAINT;
    procedure WMPaint(var MSG: TWMPaint); message WM_PAINT;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

uses
  uxTheme, Styles, Math;

{ TForm }

constructor TForm.Create(AOwner: TComponent);
begin
  inherited;
  FCanvas2D := TDirect2DCanvas.Create(Handle);
end;

procedure TForm.PaintNC(var MSG: TWMNCPaint);
begin
  FCanvas2D.BeginDraw();
   //paint NonClient-Stuff here
  FCanvas2D.EndDraw;
end;

procedure TForm.WMPaint(var MSG: TWMPaint);
begin
  FCanvas2D.BeginDraw();
  //we need to fill it with our background color as a Direct2D surface is black by default
  FCanvas2D.Brush.Color := Color;
  FCanvas2D.FillRect(Rect(0, 0, Width, Height));
  inherited;
  FCanvas2D.EndDraw;
end;

end.
Grüße
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20: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