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...