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

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
Benutzerbild von Memnarch
Memnarch

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

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

  Alt 5. Mai 2013, 11:49
Zitat:
Ich habe deinen Quelltext nicht ausgeführt!
Das ist dann etwas ungünstig. Das zweite beispiel ist extra so konstruiert, dass es den effekt mit einer minimalen konfiguration Zeigt. Der source oben ist NICHT aus meinem projekt. Lediglich eine hierfür gemachte konstruktion die sich an meinen Problemen entlanghangelt.
Im Source nutze ich bereits GetWindowDC. Das hat aber(außer das es schöner aufzurufen ist) keinen Unterschied erbracht.

Ich verstehe nicht, warum ich beim zeichnen anscheinend nicht korrekt Zeichne, und stattdessen hast du mir anfangs den HitTest kompletiert(was egal war). Das hat mich zugegeben angefressen. Es geht nur ums grafische.

Deswegen auch das zweite minimalistische Beispiel, welches das Problem(Verhalten) veranschaulichen sollte.

Also mit Skalieren ist Resizen gemeint.

EDIT: Bisher konnte ich zwar immernoch nicht rausfinden, woran es liegt. Allerdings sind mir inzwischen nen halbes dutzend Applikationen mit dem selben problem aufgefallen(i.e. Steam, Skype). Mh "schummelt" windows beim zeichnen? Weis es eher7mehr als die apllikation beim zeichnen?
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch ( 5. Mai 2013 um 11:59 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

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

  Alt 5. Mai 2013, 12:09
Zitat:
Also mit Skalieren ist Resizen gemeint.
Habe ich schon verstanden.

Dein Minimal Beispiel hab ich ausgeführt bei mir zittert da nix weder beim Resitz noch im Stillstand.
Sorry kann das nicht nachvollziehen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

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

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
 
#4

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

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:54 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