Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Как заставить все окна изменить свои размеры.....   Найти похожие ветки 

 
demonyator ©   (2003-06-15 02:15) [0]

<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;

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


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

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)


 
DVM ©   (2003-06-15 15:02) [2]

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


 
jonni ©   (2003-06-15 16:19) [3]

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


 
DVM ©   (2003-06-15 16:24) [4]

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


 
demonyator ©   (2003-06-16 23:41) [5]

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


 
Diamond Cat ©   (2003-06-18 02:01) [6]

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


 
DVM ©   (2003-06-18 15:50) [7]

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;


 
DVM ©   (2003-06-18 16:45) [8]

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

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-ы, но без эксплорера они тоже теряют часть функциональности, которую тоже надо им восстанавливать.



Страницы: 1 вся ветка

Текущий архив: 2003.08.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
3-68233
Wistler
2003-07-25 17:21
2003.08.21
Добавление кортежа в MS SQL


3-68241
nmx
2003-07-25 21:06
2003.08.21
как создать псевдодим для таблицы загруженной в ClientDataSet?


3-68175
KSergey
2003-07-28 17:48
2003.08.21
Выход из формы по Default-кнопке и сохранене данных..


4-68587
Alien
2003-06-18 17:02
2003.08.21
Как определить по Handle окно было взято или процесс?


7-68568
Алексей Глеб
2003-06-08 19:04
2003.08.21
Интерфейс