![]() |
Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
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:
Man mekrt dass der Rahmen hinterherzuckelt. Nicht wirklich schön. 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. 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:
Rahmen soweit OK, ABER der Inhalt zuckelt nach. Muss ich erst alles in eine Offscreen Bitmap packen und erst per wmpaint anzeigen?
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. Wieso zuckelt bei mir immer etwas hinterher? EDIT: mh könnte was mit dem hier fehlenden DWM zu tun haben... EDIT2: ne doch nicht... |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
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 |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
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? |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
Zitat:
Zitat:
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 |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
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. |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
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 ![]() ändere mal GetDCEx nach GetWindowDC um. gruss |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
Das mach ich doch schon(GetwindowDC). es geht darum das es zittert. Ich weiß nicht warum. DU sieht doch schon, nur dadurch das ich nichts zeichne zittert schon der fensterrand. Das macht keinen Sinn. Wenn du den ersten quelltext ausgeführt hätetst, wüsstest du des schon zittert, nur weil ich NCPaint blocke.
Ich schalte sogar das windowtheme ab(außerdem dwmsetattribute setzt die attribute global und gilt für alle desktopapplikationen. eher unschön) |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
Zitat:
Zitat:
Delphi-Quellcode:
LDC := GetDCEx(Handle, MSG
Ist hier aber nichts von zu sehen. Zitat:
Zitat:
Zitat:
und nicht Systemübergreifend. Wenn ich meine Attribute setze habe ich noch nicht feststellen können das dies irgendeinen einfluss auf andere Anwendungen hat. Wenn es dich nervt das ich versuche zu helfen dann lass ich es besser. gruss |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
Zitat:
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? |
AW: Merkwürdige zitternde Reskalierung einer Form nach abschalten von Zeichnen auf NC
Zitat:
Dein Minimal Beispiel hab ich ausgeführt bei mir zittert da nix weder beim Resitz noch im Stillstand. Sorry kann das nicht nachvollziehen. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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