Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заставить все окна изменить свои размеры.....


demonyator ©   (2003-06-15 02:15:00) 

<subj>... в соответствии с новыми параметрами рабочей области. Вот код, который я использую для установки новых параметров раб. области:

var R:TRECT
begin
r.Left:=0;
r.Top:=0;
r.Right:=Screen.Width;
r.Bottom:=Screen.Height-50;
( SPI_SETWORKAREA,0,@r,0)

<subj>... в соответствии с новыми параметрами рабочей области. Вот код, который я использую для установки новых параметров раб. области:

var R:TRECT
begin
r.Left:=0;
r.Top:=0;
r.Right:=Screen.Width;
r.Bottom:=Screen.Height-50;
SystemParametersInfo(SPI_SETWORKAREA,0,@r,0);
end;

Всё работает нормально, но хотелось бы чтобы все окна подравнялись под новые параметры, как это происходит после изменения размеров панели задач.


DVM   (2003-06-18 16:45:00) [1]

Вот так будет правильнее:

procedure SetWorkArea(rc:TRect);
var
Wnd:THandle;
WP : WINDOWPLACEMENT;
begin
SystemParametersInfo(SPI_SETWORKAREA,0,@rc,SPIF_SENDCHANGE);
SystemParametersInfo(SPI_GETWORKAREA,0,@rc,SPIF_SENDCHANGE);
WP.length := SizeOf( WINDOWPLACEMENT );
Wnd := GetWindow(Form1.Handle, gw_HWndFirst);
while Wnd <> 0 do

begin
GetWindowPlacement( wnd, @WP );
if WP.showCmd = SW_SHOWMAXIMIZED then
begin
SetWindowPos(wnd,0,rc.Left,rc.Top,rc.Right-rc.Left,rc.Bottom-rc.Top, {SWP_NOSIZE or }SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_FRAMECHANGED);

end;
( Wnd, gw_hWndNext)

Вот так будет правильнее:

procedure SetWorkArea(rc:TRect);
var
Wnd:THandle;
WP : WINDOWPLACEMENT;
begin
SystemParametersInfo(SPI_SETWORKAREA,0,@rc,SPIF_SENDCHANGE);
SystemParametersInfo(SPI_GETWORKAREA,0,@rc,SPIF_SENDCHANGE);
WP.length := SizeOf( WINDOWPLACEMENT );
Wnd := GetWindow(Form1.Handle, gw_HWndFirst);
while Wnd <> 0 do

begin
GetWindowPlacement( wnd, @WP );
if WP.showCmd = SW_SHOWMAXIMIZED then
begin
SetWindowPos(wnd,0,rc.Left,rc.Top,rc.Right-rc.Left,rc.Bottom-rc.Top, {SWP_NOSIZE or }SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_FRAMECHANGED);

end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
end;

Правда этот код не учитывает, что на экране могут оказаться какие-нибудь AppBar-ы, но без эксплорера они тоже теряют часть функциональности, которую тоже надо им восстанавливать.


DVM   (2003-06-18 15:50:00) [2]

WM_WINDOWPOSCHANGING посылается окнам. Вобщем, я сделал.
Вот черновой вариант:

procedure SetWorkArea(rc:TRect);
var
Wnd:THandle;
begin
SystemParametersInfo(SPI_SETWORKAREA,0,@rc,SPIF_SENDCHANGE);
SystemParametersInfo(SPI_GETWORKAREA,0,@rc,SPIF_SENDCHANGE);
Wnd := GetWindow(Form1.Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
SetWindowPos(wnd,0,0,0,0,0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_FRAMECHANGED);
Wnd := GetWindow(Wnd, gw_hWndNext);
( Sender: TObject)

WM_WINDOWPOSCHANGING посылается окнам. Вобщем, я сделал.
Вот черновой вариант:

procedure SetWorkArea(rc:TRect);
var
Wnd:THandle;
begin
SystemParametersInfo(SPI_SETWORKAREA,0,@rc,SPIF_SENDCHANGE);
SystemParametersInfo(SPI_GETWORKAREA,0,@rc,SPIF_SENDCHANGE);
Wnd := GetWindow(Form1.Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
SetWindowPos(wnd,0,0,0,0,0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_FRAMECHANGED);
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var rc:TRect;
begin
rc.Left:=100;
rc.Top:=0;
rc.Right:=Screen.Width;
rc.Bottom:=screen.Height-100;
SetWorkArea(rc);
end;


Diamond Cat   (2003-06-18 02:01:00) [3]

когдато я такое проходил, и проходил это следующим образом, с помощью winsight32 посмотрел какое сообщение получает мое окно при изменении позиции\размера панели задачь (не помню сейчас какое ) и потом с помощью sendmessage(hwnd_broadcast... рассылал его когда мне надо


demonyator   (2003-06-16 23:41:00) [4]

Это не есть хорошо... как раз без любимого explorer и необходимо это делать. Но есть одна особенность... если SystemParametersInfo(SPI_SETWORKAREA,0,@r,0) повесить на таймер и посылать постоянно, то после минимизации/максимизации окна будут принимать изменения.


DVM   (2003-06-15 16:24:00) [5]

Да хрен его знает. Просто не будет и все. Я не знаю точно, это внутренняя кухня эксплорера. Если нет эксплорера это свойство теряют все подобные окна (панель офиса, все AppBar-ы). Хотелось бы самому узнать как с этим бороться.


jonni   (2003-06-15 16:19:00) [6]

chto ne budet rabotat"???
i pochemu?/


DVM   (2003-06-15 15:02:00) [7]

В отсутствии эксплорера это все равно не будет работать.


jonni   (2003-06-15 05:00:00) [8]

voobsche v dokumentacie k spi_setworkarea est" takoy parameter spi_sendchanges chto to tipa etogo tochno seychas ne pomnyu

SystemParametersInfo(SPI_SETWORKAREA,0,@r,spi_sendchanges);
budet chto to tipa takogo.......

a voobsche esli tebe nado sozdat" chto to tipa okoshko kotoroe vsegda potesnit vse okna (kak taskbar) ti sozdavay real"niy bar
togda winda vse za tebya sdelaet (podvinet okna itd)


Наверх

Титульная страница Поиск, карта сайта Написать письмо