powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / D6.API.WM_SYSCOMMAND
5 сообщений из 5, страница 1 из 1
D6.API.WM_SYSCOMMAND
    #32126250
?Alexis?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть приложение exe. Есть модули DLL, которые загружает EXE. Модули содержат формы.
Форма рриложения EXE занимает верхнюю часть экрана.
Для того чтобы формы в DLL максимизировались и занимали оставшуюся часть экрана используется следующий код:
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
.....
procedure TBaseUiForm.WMSysCommand(var Message: TWMSysCommand);
var
aRect: TRect;
begin
inherited;
if Message.CmdType = SC_MAXIMIZE then
begin
GetWindowRect(Application.Handle, aRect);
Top := aRect.Bottom;
Height := Screen.Height - aRect.Bottom;
end
else inherited;
end;

где
Application.Handle в DLL = MainForm.Handle из EXE

Формы, по нажатию кнопки "Максимизировать" принимают правильные геометрические размеры (относительно главного окна),
но происходит мигание форм (видно что они сначала максимизируются на полный экран, а потом в указаный размер)
Почему так происходит?

Хочется создать поведение как в IDE Delphi, когда редактор кода максимизируется относительно окна с палитрой компонентов.
...
Рейтинг: 0 / 0
D6.API.WM_SYSCOMMAND
    #32126320
oleg_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй убрать первый inherited;
...
Рейтинг: 0 / 0
D6.API.WM_SYSCOMMAND
    #32126347
?Alexis?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убрал:
вот код
procedure TBaseUiForm.WMSysCommand(var Message: TWMSysCommand);
var
aRect: TRect;
begin
if Message.CmdType = SC_MAXIMIZE then
begin
GetWindowRect(Application.Handle, aRect);
Top := aRect.Bottom;
Height := Screen.Height - aRect.Bottom;
Width := Screen.Width;
Left := 0;
end
else inherited;
end;

Разворачивается как надо. но не устанавливается иконка "Восстановить".
в правом верхнем углу формы.
А также двойной клик по заголовку формы все равно разворачивает ее на весь экран.

Как правильно обрабатывать это сообщение?
...
Рейтинг: 0 / 0
D6.API.WM_SYSCOMMAND
    #32126576
oleg_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
TBaseUIForm = class(TForm)
  ...
  procedure RestrictSize(var msg: TMessage); message WM_GETMINMAXINFO;
end;

procedure TBaseUIForm.RestrictSize(var Msg: TMessage);
var 
   MinMaxInfo: PMinMaxInfo;
   aRect: TRect; 
begin
  GetWindowRect(Application.Handle, aRect); 
  MinMaxInfo := PMinMaxInfo(Msg.lParam);
  MinMaxInfo.ptMaxSize.x := aRect.Right - aRect.Left;
  MinMaxInfo.ptMaxSize.y := Screen.Height - aRect.Bottom;
  MinMaxInfo.ptMaxPosition.x := aRect.Left;
  MinMaxInfo.ptMaxPosition.y := aRect.Bottom;
{ ptMaxSize Размер максимизированного окна.
 ptMaxPosition положение максимизированного окна.}
end;
...
Рейтинг: 0 / 0
D6.API.WM_SYSCOMMAND
    #32126690
?Alexis?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oleg_e
Спасибо. Так и сделал
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / D6.API.WM_SYSCOMMAND
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]