AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WM_NCCALCSIZE provozieren (Aufteilung NC - Client - Area hat sich geändert)
Thema durchsuchen
Ansicht
Themen-Optionen

WM_NCCALCSIZE provozieren (Aufteilung NC - Client - Area hat sich geändert)

Ein Thema von RSE · begonnen am 13. Jul 2010 · letzter Beitrag vom 13. Jul 2010
Antwort Antwort
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

WM_NCCALCSIZE provozieren (Aufteilung NC - Client - Area hat sich geändert)

  Alt 13. Jul 2010, 08:44
Hallo,

ich habe ein eigenes Control, welches einen eingeschränkten Clientbereich hat. Das Ausmaß der Einschränkung ist vom Caption abhängig. Wenn sich das Caption ändert, muss ich also eine WM_NCCALCSIZE Message provozieren. Ich habe bisher folgenden Code:
Delphi-Quellcode:
    ...
    procedure SetHTMLCaptionHeight(const AValue: Integer); // löst alles aus

    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
    property HTMLCaptionHeight: Integer read FHTMLCaptionHeight write SetHTMLCaptionHeight;
    ...

procedure TCustomChoiceGroup.SetHTMLCaptionHeight(const AValue: Integer);
begin
  if FHTMLCaptionHeight = AValue then
    Exit;
  FHTMLCaptionHeight := AValue; // Höhe des neuen NC-Bereichs
  // hier Win über notwendiges Resize informieren... wie?
end;

procedure TCustomChoiceGroup.WMNCCalcSize(var Message: TWMNCCalcSize);
begin // das muss nach SetHTMLCaptionHeight aufgerufen werden
  with Message.CalcSize_Params^ do
    Inc(rgrc[0].Top,FHTMLCaptionHeight); // Einschränkung des ClientRect
  inherited;
end;

procedure TCustomChoiceGroup.WMNCPaint(var Message: TWMNCPaint);
var
  DC: HDC;
  c: TCanvas;
begin // TCustomChoiceGroup.Canvas ist nur für den Client-Bereich
  c := TCanvas.Create;
  try
    DC := GetWindowDC(Handle);
    try
      c.Handle := DC;
      c.Brush.Color := Color;
      c.FillRect(Rect(0,0,Width,FHTMLCaptionHeight));
      HTMLDraw(c,Rect(0,0,Width,FHTMLCaptionHeight),HTMLCaption,False);
    finally
      ReleaseDC(Handle, DC);
    end;
  finally
    c.free;
  end;
  Message.Result := 0;
end;
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#2

AW: WM_NCCALCSIZE provozieren (Aufteilung NC - Client - Area hat sich geändert)

  Alt 13. Jul 2010, 13:14
Ich habe die Lösung gefunden:
Delphi-Quellcode:
    procedure SetHTMLCaptionHeight(const AValue: Integer);
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;

procedure TCustomChoiceGroup.SetHTMLCaptionHeight(const AValue: Integer);
begin
  if HTMLCaptionHeight = AValue then
    Exit;
  FHTMLCaptionHeight := AValue;
  if not (csLoading in ComponentState) then // sonst ist Handle noch nicht gültig
    SetWindowPos(Handle,0,0,0,0,0, // das löst WM_NCCALCSIZE und WM_NCPAINT aus
                 SWP_FRAMECHANGED or SWP_NOCOPYBITS or SWP_NOMOVE or
                 SWP_NOOWNERZORDER or SWP_NOSENDCHANGING or SWP_NOSIZE or
                 SWP_NOZORDER);
end;

procedure TCustomChoiceGroup.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
  Inc(Message.CalcSize_Params^.rgrc[0].Top,HTMLCaptionHeight);
  inherited;
end;

procedure TCustomChoiceGroup.WMNCPaint(var Message: TWMNCPaint);
var
  DC: HDC;
  c: TCanvas;
  r: TRect;
begin
  c := TCanvas.Create;
  try
    DC := GetWindowDC(Handle);
    try
      c.Handle := DC;
      c.Brush.Color := Color;
      r := c.ClipRect;
      r.Bottom := HTMLCaptionHeight;
      c.FillRect(r);
      HTMLDraw(c,r,HTMLCaption,False);
    finally
      ReleaseDC(Handle,DC);
    end;
  finally
    c.free;
  end;
  Message.Result := 0;
end;
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  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 14:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz