Переместить форму без рамки

как переместить форму без полей? Пробовал искать в интернете, но ничего. Большое спасибо.


person Giacomo King Patermo    schedule 06.06.2012    source источник
comment
может быть здесь: delphi.about.com/od/windowsshellapi/a/dragnocaption. htm   -  person philnext    schedule 06.06.2012
comment
Дубликат C++Builder: создание TForm с BorderStyle bsNone, который, тем не менее, можно перемещать и изменять размер — этот код для C++Builder, но это все тот же VCL! Переход на Delphi должен быть тривиальным.   -  person David    schedule 07.06.2012


Ответы (2)


Вы можете перетаскивать форму, используя любой содержащийся элемент управления, включая саму себя.

Используя следующий пример, вы можете переместить форму, щелкнув ее холст и перетащив ее. Вы можете сделать то же самое с панелью в форме, поместив тот же код в событие MouseDown панели, что позволит вам создать свою собственную панель псевдозаголовка.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  if Button = mbLeft then
  begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
  end;
end;
person Bruce McGee    schedule 06.06.2012

Если вы имеете в виду перетаскивание окна мышью, вы можете переопределить WM_NCHITTEST обработку сообщений и вернуть HTCAPTION для области перетаскивания. В приведенном ниже примере окно будет перетаскиваться в пределах верхних 30 пикселей:

type
  TForm1 = class(TForm)
  private
  protected
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  end;

..

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
var
  Pt: TPoint;
begin
  Pt := ScreenToClient(SmallPointToPoint(Message.Pos));
  if Pt.Y < 30 then
    Message.Result := HTCAPTION
  else
    inherited;
end;
person Sertac Akyuz    schedule 06.06.2012
comment
@David: В последнее время я немного скептически отношусь к этому подходу, потому что, по сути, вы сообщаете ОС, что вся форма является заголовком окна, что на самом деле может быть семантически неверным. (Ну, в коде Сертака, возможно, первые 30 пикселей являются на самом деле заголовком, но в целом это может быть не так.) - person Andreas Rejbrand; 07.06.2012
comment
@andreas У вас есть конкретная причина отклонить это? Каковы недостатки? Это стандартный подход. - person David Heffernan; 07.06.2012
comment
@David: Нет, никаких конкретных недостатков я не могу придумать. - person Andreas Rejbrand; 07.06.2012
comment
Альтернативой является реализация обработчика OnMouseDown, в котором вы устанавливаете состояние перемещения и сохраняете положение мыши, обработчика OnMouseMove, в котором вы перемещаете форму, и обработчика OnMouseUp, в котором вы очищаете состояние перемещения. Это не так много работы. Например, преимущество заключается в том, что вы сами решаете, на сколько пикселей должна переместиться мышь, прежде чем вы начнете движение. Иногда это может быть желательно. - person bjaastad_e; 07.06.2012
comment
Я пытаюсь использовать этот метод и обнаружил, что не могу закрыть форму с помощью кнопки X. Итак, есть один минус. Я полагаю, я мог бы просто нажать крошечную кнопку и написать код, конечно. - person Craig Stevensson; 16.10.2014
comment
@Craig - сначала вызовите inherited, измените результат, только если это «HTCLIENT». В качестве альтернативы измените область вмешательства, чтобы исключить кнопки. - person Sertac Akyuz; 17.10.2014