Einzelnen Beitrag anzeigen

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, 12: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