![]() |
WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so recht...
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich mochte um eine Form einen eigenen Rahmen mit WM_PAINT zeichnen. Ich dachte mir dass das eigentlich eine einfache Sache ist, aber ne... Folgenden Code verwende ich z.Z.:
Delphi-Quellcode:
Das Problem ist das der Rahmen nicht richtig gezeichnet wird bzw. verschwindet
procedure TForm1.WMNCPaint(var _Message: TWMNCPaint);
var aCanvas: TCanvas; r, r2: trect; rn, rn2: hrgn; begin inherited; aCanvas := TCanvas.Create; try aCanvas.Handle := GetWindowDC(Handle); getwindowrect(handle, r); rn := CreateRectRgnIndirect(r); r2 := clientrect; r2.top := 5; rn2 := CreateRectRgnIndirect(r2); CombineRgn(rn, rn, rn2, RGN_XOR); aCanvas.Pen.Color := clLime; aCanvas.Brush.Style := bsFDiagonal {bsSolid}; aCanvas.Brush.Color := clBlack; if not FillRGN(aCanvas.Handle, rn, aCanvas.Brush.Handle) then windows.Beep(880,20); deleteobject(rn); deleteobject(rn2); aCanvas.Brush.Style := bsClear; aCanvas.Pen.Style := psSolid; aCanvas.Rectangle(0, 0, Width, Height); finally ReleaseDC(Handle, aCanvas.Handle); aCanvas.Free; end; end; beim dem Verändern der Grösse des Fensters. Wer kann helfen ? |
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Hi turbopascal,
mit fällt erst mal auf, dass du ein neues Canvas - Object erzeugst. TForm hat doch ein Canvas, auf welches du zeichnen kannst. Und dann überschreibe ich immer die Methode Paint. Ausserdem muss du noch GetClientRect anpassen, damit ein Control den Rahmen nicht verdecken kann. Cu, Frank |
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Liste der Anhänge anzeigen (Anzahl: 1)
Du kanst mit {FormX.}Canvas nur auf das ClientRect eines Fensters zugreifen.
Mir geht es aber um den Rahmen (NonClientArray).
Delphi-Quellcode:
Im Ergebnis soll das dann so aussehen:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin inherited; Params.Style := Params.Style or WS_SIZEBOX {WS_BORDER}; end; |
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Hallo,
ich hab mir eine Funktion geschrieben, die mir den DC gleich richtig anpasst:
Delphi-Quellcode:
Vielleicht klappt's ja damit.
function TMyForm.GetWindowDC: HDC;
var DC: HDC; RC, RW: TRect; begin DC := Windows.GetWindowDC(Handle); Windows.GetClientRect(Handle, RC); GetWindowRect(Handle, RW); MapWindowPoints(0, Handle, RW, 2); OffsetRect(RC, -RW.Left, -RW.Top); ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom); Result := DC; end; Gruß xaromz |
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
@turboPASCAL: Wenn das ganze wie in deinem Bild aussehen soll wäre es doch das einfachste den BorderStyle auf bsNone zu setzen. Anschließend kannst du im OnPaint des Forms den Rahmen zeischnen.
|
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Jupp, dachte ich auch erst. Als ich dann aber ein Control auf alClient setzen wollte musste
ich die Idee wieder verwerfen. Eine Eigene Kompon. zu basteln die einen Border zeichnet, ala Panel, möchte ich nicht. Das währe zu einfach. :mrgreen: |
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Gestatten ? Ein "Push", "pop", "blupp" or "fsStayOnTop". :stupid:
|
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Zitat:
|
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Zitat:
|
Re: WM_NCPAINT - Rahmen selber Zeichnen klappt nicht so rech
Moin Matti,
schau Dir doch mal die Funktion ![]() Bei mir bringt die im WMNCPAINT-Event zwar immer 0 zurück (obwohl die übergebenen Werte eigentlich stimmen sollten), aber vielleicht funktioniert es ja bei Dir. (GetLastError meldet mir auch "Der Vorgang wurde erfolgreich durchgeführt" :gruebel:) Mein Aufruf:
Delphi-Quellcode:
hdc := GetDCEx(self.Handle,msg.RGN,DCX_WINDOW or DCX_INTERSECTRGN);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 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