Форум: "WinAPI";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
ВнизКак заставить все окна изменить свои размеры..... Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c