Текущий архив: 2004.08.22;
Скачать: CL | DM;
Вниз
SetBounds на весь экран Найти похожие ветки
← →
dmk © (2004-08-09 03:05) [0]Помогите найти ошибку. Нужно клииентскую область растянуть на
весь экран. Делаю так: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.
← →
dmk © (2004-08-09 03:08) [1]Или левый верхний угол клиентской области относительно
Desktop"а находился в позиции x=0,y=0
← →
Mim1 © (2004-08-09 03:43) [2]Развернуть окно на весь экран можно при помощи
BorderStyle := bsNone;
WindowState := wsMaximized;
← →
Dmk © (2004-08-09 10:16) [3]2 Mim1
Я знаю. Спасибо. Мне непонятно почему у меня позиция в -8 встает.
Попробовал на пустом проекте - все в порядке.
← →
Mim1 © (2004-08-09 11:14) [4]А вы попробуйте использовать movewindow, хотя мне кажется это свойство перационной системы (возврат заголовка окна в клиентскую область).
Страницы: 1 вся ветка
Текущий архив: 2004.08.22;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.06 c