Как создать окно без рамки независимо от пользовательских настроек? - PullRequest
1 голос
/ 25 октября 2011

Мне нужно написать приложение, которое отображает две разные картинки в двух экземплярах приложения. Эти рисунки должны выглядеть так, как будто они помещены рядом на холст одного и того же окна, но по внутренним причинам это должны быть два разных приложения, а не одно. Есть ли способ отключить оконную раму независимо от настроек Windows пользователя? Я все еще хочу сохранить строку заголовка и кнопки закрытия / сворачивания / увеличения.

Бонусные баллы, если два (или несколько) окна выглядят и реагируют на пользователя как одно окно.

Был бы неплох пример Delphi, но я, вероятно, могу сделать подсказку о том, какие флаги или что-либо устанавливать с помощью Win32 API (без dotNET, пожалуйста).

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Поскольку окна со строками заголовка всегда имеют границы, следующий вариант - создать окно без полей, а затем нарисовать строку заголовка в верхней части окна. Это также означает обработку сообщений мыши. Начните с wm_NCHitTest. Чтобы создать окно без полей, переопределите метод CreateParams вашей формы и установите поле Style, чтобы не было границ.

1 голос
/ 26 октября 2011

Это создает форму без боковых или нижних границ:

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

...