![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SetBounds на весь экран [D6, D7, Win2k, WinXP]
dmk © (2004-08-09 03:05:00)Помогите найти ошибку. Нужно клииентскую область растянуть на
весь экран. Делаю так:
procedure TMainForm.WMGetMinMaxInfo(var msg:TWMGetMinMaxInfo);
begin
inherited;
If FInFullScreen then
begin
with msg.MinMaxInfo^.ptMaxTrackSize do
begin
X := FFullFormSize.Width;
Y := FFullFormSize.Height;
end;
end;
If FNormalScreen then
begin
with msg.MinMaxInfo^.ptMaxTrackSize do
begin
X := (FNormalFormSize.Right - FNormalFormSize.Left);
Y := (FNormalFormSize.Bottom - FNormalFormSize.Top);
end;
end;
end;
//..............................................................
Procedure TMainForm.SetFullScreen;
var
xPos,yPos: Integer;
nW,nH: Integer;
sX,sY: Integer;
begin
//If not FormActivated then exit;
If not FInFullScreen then
begin
//Сохраняем старые размеры и позиции
FNormalFormSize := BoundsRect;
//Уберем панель задач
ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_HIDE);
//Новая позиция по X и Y
xPos := Left - ClientOrigin.X;
yPos := Top - ClientOrigin.Y;
//Новая ширина и высота
sX := GetDeviceCaps(Canvas.handle, HORZRES);
sY := GetDeviceCaps(Canvas.handle, VERTRES);
nW := sX + (Width - ClientWidth);
nH := sY + (Height - ClientHeight);
//Заполняем структуру описывающую
//размеры формы на полный экран
With FFullFormSize do
begin
Left := xPos;
Top := yPos;
Width := nW;
Height := nH;
end;
FInFullScreen := True;
FNormalScreen := False;
SetBounds(xPos, yPos, nW, nH);
end
else
begin
FInFullScreen := False;
FNormalScreen := True;
With FNormalFormSize do
begin
SetBounds(Left, Top, Right, Bottom);
end;
ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_SHOWNORMAL);
FNormalScreen := False;
end;
SetForegroundWindow(Handle);
end;
В итоге после SetBounds позиция развернувшейся формы
не -4 по X как была, а -8. Сразу после SetBounds
выполняется обработка сообщения WM_GETMINMAXINFO.
При разрешении экрана 1280х1024 получаются следующие размеры:
ptMaxTrackSize всегда получается 1288.
Просто максимизированная форма:
Left = -4,
Top = -4,
Right = 1284,
Bottom = 1032.
После максимизации клиентской области получаются эти размеры:
Left = -8,
Top = -4,
Right = 1280,
Bottom = 1032.
Просто задав Left := -4 или 0 форма не реагирует.
Ограничений по размеру не стоит. Дополнительно работает пользовательская функция по обработке стиля окна и все.
Function ClientWindowProc(wnd:HWND; msg:Cardinal; wparam,lparam:Integer):Integer;stdcall;
var
F: Pointer;
begin
F := Pointer(GetWindowLong(wnd,GWL_USERDATA));
case msg of
WM_NCCALCSIZE:
if ( GetWindowLong(wnd,GWL_STYLE) and (WS_HSCROLL or WS_VSCROLL)) <> 0 then
SetWindowLong(wnd,GWL_STYLE, GetWindowLong(wnd,GWL_STYLE)
and not (WS_HSCROLL or WS_VSCROLL));
end;
//....
Result := CallWindowProc(F, Wnd, Msg, WParam, LParam);
end;
//..............................................................................
procedure InitClientProc(ClientHandle:integer);
begin
if ClientHandle <> 0 then
begin
if GetWindowLong(ClientHandle, GWL_USERDATA) <> 0 then Exit; {cannot subclass client window, userdata already in use}
SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong(ClientHandle,
GWL_WNDPROC, integer(@ClientWindowProc)));
end;
end;
Помогите пожалуйста разобраться. Хочется, чтобы после SetBounds
левый верхний угол клиентской области вставал по Х как надо.
Например -4.
Mim1 (2004-08-09 11:14:00) [1]А вы попробуйте использовать movewindow, хотя мне кажется это свойство перационной системы (возврат заголовка окна в клиентскую область).
Dmk (2004-08-09 10:16:00) [2]2 Mim1
Я знаю. Спасибо. Мне непонятно почему у меня позиция в -8 встает.
Попробовал на пустом проекте - все в порядке.
Mim1 (2004-08-09 03:43:00) [3]Развернуть окно на весь экран можно при помощи
BorderStyle := bsNone;
WindowState := wsMaximized;
dmk (2004-08-09 03:08:00) [4]Или левый верхний угол клиентской области относительно
Desktop'а находился в позиции x=0,y=0