2007. január 25., csütörtök

TNCCanvas - write on a form's non-client area


Problem/Question/Abstract:

TNCCanvas - write on a form's non-client area

Answer:

This canvas gives you access to a form's none-client (NC) area and can be used to create a window with a personal frame style:


TNCCanvas = class(TCanvas)
private
  FDeviceContext: HDC;
  FWindowHandle: HWnd;
  function GetWindowRect: TRect;
protected
  procedure CreateHandle; override;
  procedure FreeHandle;
public
  constructor Create(aWindow: hWnd);
  destructor Destroy; override;
  property WindowRect: TRect read GetWindowRect;
end;

{ TNCCanvas - Object }

constructor TNCCanvas.Create(aWindow: hWnd);
begin
  inherited Create;
  FWindowHandle := aWindow;
end;

destructor TNCCanvas.Destroy;
begin
  FreeHandle;
  inherited Destroy;
end;

procedure TNCCanvas.CreateHandle;
begin
  if FWindowHandle = 0 then
    inherited CreateHandle
  else
  begin
    if FDeviceContext = 0 then
      FDeviceContext := GetWindowDC(FWindowHandle);
    Handle := FDeviceContext;
  end;
end;

procedure TNCCanvas.FreeHandle;
begin
  Handle := 0;
  if FDeviceContext <> 0 then
  begin
    ReleaseDC(FWindowHandle, FDeviceContext);
    FDeviceContext := 0;
  end;
end;

function TNCCanvas.GetWindowRect: TRect;
begin
  winProcs.GetWindowRect(FWindowHandle, Result);
  with Result do
  begin
    Right := Pred(Right - Left);
    Bottom := Pred(Bottom - Top);
    Left := 0;
    Top := 0;
  end;
end;

Nincsenek megjegyzések:

Megjegyzés küldése