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

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

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

  Alt 4. Mai 2013, 00:50
Hi,
ARbeite momentan mit dem NonClient-Area von Forms, um darauf rumzuzeichnen, und dem Rahmen komplett selbst zu machen.
Jetzt ist aber folgendes:
SObald ich selber auf dem NC-Areal rummale, zittert die form merkwürdig beim Rescalieren, als ob irgendwas hinterherhinken würde.
Das ganze lässt sich bereits dadurch provozieren, das man die PaintNC message block. Dann belibt der NC schwarz und zuckelt beim Skalierne.

Ich möchte den Rahmen einer form selber zeichnen, ohne das dabei irgendwas irgendwo rumzuckelt als würde es hinterherhinken

Hier mal der Beispielcode fürs Zittern:
Delphi-Quellcode:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure PaintNC(var MSG: TWMNCPaint); message WM_NCPAINT;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.PaintNC(var MSG: TWMNCPaint);
begin

end;

{$R *.dfm}

end.
Man mekrt dass der Rahmen hinterherzuckelt. Nicht wirklich schön.

Dan mal folgendes(STellt euer fenster auf BorderStyle bsNone, schlet zu sehen weil zuerst weiß aber das Fenster hat hier trotzdem einen Rahmen )

Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure EraseBKGN(var MSG: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure NCHitTest(var MSG: TWMNCHitTest); message WM_NCHITTEST;
    procedure NCCalcSize(var MSG: TWMNCCalcSize); message WM_NCCALCSIZE;
    procedure PaintNC(var MSG: TWMNCPaint); message WM_NCPAINT;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

const
  DCX_USERSTYLE = $10000;

procedure TForm1.EraseBKGN(var MSG: TWMEraseBkgnd);
var
  LDC: HDC;
  LBrush: HBRUSH;
begin
  LDC := GetDC(Handle);
  LBrush := CreateSolidBrush(clBlue);
  try
    FillRect(LDC, Rect(0, 0, Width, Height), LBrush);
  finally
    DeleteObject(LBrush);
    ReleaseDC(Handle, LDC);
  end;
end;

procedure TForm1.NCCalcSize(var MSG: TWMNCCalcSize);
begin
  if MSG.CalcValidRects then
  begin
    MSG.CalcSize_Params.rgrc0.Left := MSG.CalcSize_Params.rgrc0.Left +10;
    MSG.CalcSize_Params.rgrc0.Right := MSG.CalcSize_Params.rgrc0.Right - 10;
    MSG.CalcSize_Params.rgrc0.Top := MSG.CalcSize_Params.rgrc0.Top +10;
    MSG.CalcSize_Params.rgrc0.Bottom := MSG.CalcSize_Params.rgrc0.Bottom -10;
  end;
end;

procedure TForm1.NCHitTest(var MSG: TWMNCHitTest);
var
  LPos: TPoint;
begin
  MSG.Result := HTCAPTION;
  LPos.X := MSG.Pos.x - Left;
  LPos.Y := MSG.Pos.y - Top;
  if (LPos.Y > 10) and (LPos.Y < Height-10) and (LPos.X <= 10) then
  begin
    MSG.Result := HTLEFT;
  end
  else
  begin
    if (LPos.Y <= 10) then
    begin
      MSG.Result := HTTOP;
    end
    else
    begin
      if (LPos.X > Width-10) then
      begin
        MSG.Result := HTRIGHT;
      end;
    end;
  end;
end;

procedure TForm1.PaintNC(var MSG: TWMNCPaint);
var
  LDC: HDC;
  LBrush: HBRUSH;
begin
  LDC := GetDCEx(Handle, MSG.RGN, DCX_WINDOW or DCX_INTERSECTRGN or DCX_USERSTYLE);
  LBrush := CreateSolidBrush(clRed);
  try
    FillRgn(LDC, MSG.RGN, LBrush);
// FillRect(LDC, Rect(10, 10, Width-10, Height-10), LBrush);
  finally
    DeleteObject(LBrush);
    ReleaseDC(Handle, LDC);
    MSG.Result := 0;
  end;
end;

{$R *.dfm}

end.
Rahmen soweit OK, ABER der Inhalt zuckelt nach. Muss ich erst alles in eine Offscreen Bitmap packen und erst per wmpaint anzeigen?
Wieso zuckelt bei mir immer etwas hinterher?

EDIT: mh könnte was mit dem hier fehlenden DWM zu tun haben...
EDIT2: ne doch nicht...
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch ( 4. Mai 2013 um 01:09 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 4. Mai 2013, 12:50
Die frage wäre warum behandelst du denn dein "Rescalieren" nicht auch?
Davon ab fehlt auch noch die hälfte.
IsZoomed = API umlegen auf VCL

Schnipsel gelöscht..
War nicht erwünscht.

gruss

Geändert von EWeiss ( 5. Mai 2013 um 12:11 Uhr)
  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 4. Mai 2013, 13:36
Mh, übersehe ich da gerade was?
Ich sehe gerade nur einen vervollständigten (NC)Hittest(Der war in dem beispiel absichtlich unvollständig, fürs wesentliche).
Und das reskalieren behandeln? Nun laut den werten habe ich immer die aktuellen breiten/höhen. Aber das zeichnen zuckelt nach bzw was muss ich sonst noch behadeln? Muss das cliprect von DC angepasst werden?
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

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

  Alt 4. Mai 2013, 13:40
Mh, übersehe ich da gerade was?
Und das reskalieren behandeln? Nun laut den werten habe ich immer die aktuellen breiten/höhen. Aber das zeichnen zuckelt nach bzw was muss ich sonst noch behadeln? Muss das cliprect von DC angepasst werden?
Zitat:
absichtlich unvollständig


Du zeichnest etwas auf das NC beim resitz? Warum?
Sollte das nicht erst dann geschehen wenn dieser vorgang abgeschlossen ist?

Zumindest behandle ich das so.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

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

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

  Alt 4. Mai 2013, 14:10
NEIN....Beim resizen hole ich mir die aktuellen werte(im NCSize event setze ich in meinem richtigen projekt auch eigene größen für den Client-Bereich etc).
Aber im NCPaint event zuckelts hinterher. Ich verstehe es nicht. Mehr als die größen kann ich mir nicht holen.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

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

  Alt 4. Mai 2013, 14:37
NCPaint schlägt fehl wenn du Aero aktiviert hast.. (Meine vermutung) da du auf einen nicht Clientbezogenen bereich versuchst zu Rendern.
Falls du es eingeschaltet hast mache es mal testweise aus und prüfe dann mal ob immer noch ein zittern stattfindet.
Wenn nicht dann hilft dir nur Unterer Ratschlag.

Was du versuchen könntest wäre mit DwmSetWindowAttribute die DWMNCRENDERINGPOLICY einzuschalten.
Etwas anderes fällt mir ansonsten jetzt auch nicht ein.

Schau mal hier DwmSetWindowAttribute

ändere mal GetDCEx nach GetWindowDC um.

gruss

Geändert von EWeiss ( 4. Mai 2013 um 14:45 Uhr)
  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 17:53 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