无论用户设置如何,如何创建没有任何框架的窗口?

时间:2011-10-25 18:08:51

标签: windows delphi delphi-2007

我需要编写一个应用程序,在应用程序的两个实例中显示两个不同的图片。这些图片必须看起来好像是并排放在同一窗口的画布上,但由于内部原因,它必须是两个不同的应用程序而不是单个应用程序。无论用户的Windows设置是什么,有没有办法关闭窗口框架?我仍然想保留标题栏和关闭/最小化/最大化按钮。

如果两个(或多个)窗口看起来像用户一样做出反应,则会获得奖励积分。

一个Delphi的例子会很好但是我可以做一些关于使用Win32 API设置哪些标志或其他东西的提示(请不要使用dotNET)。

2 个答案:

答案 0 :(得分:4)

由于标题栏的窗口始终有边框,因此您的下一个选项是创建一个无边框窗口,然后自己在窗口顶部绘制标题栏。这也意味着处理鼠标消息。从wm_NCHitTest开始。要创建无边框窗口,请覆盖表单的CreateParams方法并设置Style字段,以便没有边框。

答案 1 :(得分:1)

这会创建一个没有边框或底边框的表单:

type
  TForm1 = class(TForm)
  private
    FBorderWidth: Integer;
    FTitleHeight: Integer;
    procedure AppRestored(Sender: TObject);
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
  protected
    procedure Resize; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.AppRestored(Sender: TObject);
begin
  Repaint;
end;

procedure TForm1.Resize;
begin
  inherited Resize;
  if FBorderWidth = 0 then
  begin
    FBorderWidth := (Width - ClientWidth) div 2;
    FTitleHeight := Height - ClientHeight - FBorderWidth;
    Application.OnRestore := AppRestored;
  end;
  Invalidate;
end;

procedure TForm1.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
  inherited;
  with Message.CalcSize_Params^ do
  begin
    Dec(rgrc[0].Left, FBorderWidth);
    Inc(rgrc[0].Right, FBorderWidth);
    Inc(rgrc[0].Bottom, FBorderWidth);
  end;
end;

procedure TForm1.WMNCPaint(var Message: TWMNCPaint);
begin
  DeleteObject(Message.RGN);
  Message.RGN := CreateRectRgn(Left, Top, Left + Width, Top + FTitleHeight);
  inherited;
end;

Form with only a title border