Дело-то вот в чем: Главным окном программы дельфийской является не главная форма, а окно TApplication, которое имеет нулевые размеры, поэтому его не видно. Именно для него показывается иконка на панели задач. Когда пользователь нажимает кнопку минимизации на главной форме, команда минимизации передается этому окну, и сворачивается именно оно, а для остальных просто делается hide. А так как окно TApplication имеет нулевые размеры, то и анимации никакой не видно.
А чтобы этого избежать, необходимо:
В исходном тесте модуля проекта после вызова Application.Initialize выполнить вызов
// В исходном тесте модуля проекта после вызова Application.Initialize
SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or
В исходном тексте модуля главной формы перекрыть следующие методы –
// // В классе формы
// Интерфейс
protected
procedure CreateParams(var
procedure
// Реализация
procedure
begin
inherited
p.WndParent := 0;
end
procedure
begin
m.Result := DefWindowProc(Handle, m.Msg, m.wParam, m.lParam);
end
Вместо SetWindowLong в MDI-приложениях лучше использовать
ShowWindow(Application.Handle, SW_HIDE);
Перемещение формы не за заголовок III
Ситников Митрий советует:
В следующем примере показано как можно передвигать форму если пользователь "захватил" Client-пространство:
unit
interface
uses
type
Button1: TButton;
procedure
procedure
private
{ Private declarations }
public
{ Public declarations }
end
var
Form1: TForm1;
MX: integer;
MY: integer;
implementation
{$R *.DFM}
procedure
begin
Close;
end
procedure
begin
if
MX:=X;
MY:=Y;
end else begin
Left:=Left+X-MX;
Top:=Top+Y-MY;
end
end
end
Перемещение формы не за заголовок IV
Как мне переместить форму, не имеющую заголовка?
Выберите элемент управления (или саму форму) и напишите это в его (ее) обработчике события OnMouseDown (данный пример дан только для формы):
procedure
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, SC_MOVE+2, 0);
end
Классно! Намного проще метода NCHitTest, который я предлагал. Хотя многое из того, чтобы вы мне написали, я не понял. Для чего нужно прибавлять 2 к параметру SC_MOVE? В справке по API об этом ничего не сказано.
Ну хорошо, есть недокументированный способ сообщить Windows о необходимости перемещения окна таким же способом, что и с помощью заголовка (это может вызвать неадекватную реакцию системы, не делайте этого!). Другим способом перемещения окна является перекрытие WMNCHITTEST и возвращения им значения HTCAPTION. Тем не менее, обычно я предпочитаю пользоваться методом SC_MOVE+2, поскольку он не требует создания потомков, а только создание обработчика OnMouseDown. Отчасти аналогично, вы можете добавлять константы SC_SIZE к WM_SYSCOMMAND для получения размера окна подобно тому, как если бы вы потянули его за бордюрчик. В основном мы добавляем код hittest – 9. В следующем классе определена панель, которая сама изменяет свои размеры при щелчке в ее нижнем правом углу, и сама перемещается, если вы щелкнули по ней где-то еще.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT