Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Помещение VCL компонентов в область заголовка

01.01.2007

Здесь есть хитрость:

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

Нижеприведенный проект включает в себя 2 формы и выпадающий список (combobox). После запуска программы список появляется в области заголовка главной формы. Два ключевых вопроса: 1) организация перехвата сообщения WM_MOVE главной формы; и 2) возвращение фокуса в главную форму после того, как пользователь нажмет на каком-либо элементе управления, способным иметь фокус (например, TComboBox, TButton и др.)

Я использую 32-битную Delphi 2.0 под Win95, тем не менее данный код должен работать с любой версией Delphi.

Вот исходный код главной формы:

unit Unit1;
 
interface
 
uses
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 
Dialogs, StdCtrls;
 
type
  TForm1
= class(TForm)
    procedure
FormResize(Sender: TObject);
    procedure
FormShow(Sender: TObject);
    procedure
FormHide(Sender: TObject);
 
private
   
{ Private declarations }
 
public
   
{ Public declarations }
    procedure
WMMove(var Msg: TWMMove); message WM_MOVE;
 
end;
 
var
  Form1
: TForm1;
 
implementation
 
uses Unit2
;
 
{$R *.DFM}
 
procedure TForm1
.FormResize(Sender: TObject);
begin
 
with Form2 do
 
begin
   
{Заменим мои магические числа реальной информацией SystemMetrics}
   
Width := Form1.Width - 120;
   
Top := Form1.Top + GetSystemMetrics(SM_CYFRAME);
   
Left := ((Form1.Left + Form1.Width) - Width) - 60;
 
end;
end;
 
procedure TForm1
.FormShow(Sender: TObject);
begin
  Form2
.Show;
end;
 
procedure TForm1
.FormHide(Sender: TObject);
begin
  Form2
.Hide;
end;
 
procedure TForm1
.WMMove(var Msg: TWMMove);
begin
  inherited
;
 
if (Visible) then
   
FormResize(Self);
end;
 
end.

Вот исходный код для псевдо-заголовка. Данная форма может содержать любые элементы управления VCL, которые вы хотите установить в области заголовка главной формы. По существу, это - независимый диалог со следующими свойствами:

Caption='' {NULL строка}
Height={высота области заголовка}
Width={высота всех компонентов на форме}
BorderIcons=[] {пусто}
BorderStyle=bsNone
FormStyle=fsStayOnTop

И, наконец, исходный код для Form2:

unit Unit2;
 
interface
 
uses
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 
Dialogs, StdCtrls;
 
type
  TForm2
= class(TForm)
    ComboBox1
: TComboBox;
    procedure
FormCreate(Sender: TObject);
    procedure ComboBox1Change
(Sender: TObject);
    procedure
FormResize(Sender: TObject);
 
private
   
{ Private declarations }
 
public
   
{ Public declarations }
 
end;
 
var
  Form2
: TForm2;
 
implementation
 
uses Unit1
;
 
{$R *.DFM}
 
procedure TForm2
.FormCreate(Sender: TObject);
begin
 
Height := ComboBox1.Height - 1;
 
Width := ComboBox1.Width - 1;
end;
 
procedure TForm2
.ComboBox1Change(Sender: TObject);
begin
  Form1
.SetFocus;
end;
 
procedure TForm2
.FormResize(Sender: TObject);
begin
  ComboBox1
.Width := Width;
end;
 
end.

Файл проекта (.DPR) довольно простой:

program Project1;
 
uses
 
Forms,
  Unit1
in 'Unit1.pas' {Form1},
  Unit2
in 'Unit2.pas' {Form2};
 
{$R *.RES}
 
begin
 
Application.Initialize;
 
Application.CreateForm(TForm1, Form1);
 
Application.CreateForm(TForm2, Form2);
 
Application.Run;
end.

Это все!

Хотя некоторые авторы книг утверждают:

"Вы не можете установить компоненты Delphi в заголовок окна, точнее, не существует никакого способа установить их там."

Зато существует иллюзия...

Взято с https://delphiworld.narod.ru