Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.042 c
1-1092126263
anarhi
2004-08-10 12:24
2004.08.22
Цвета


1-1092138946
Aleksandr.
2004-08-10 15:55
2004.08.22
Как правильно составить код для неявной передачи типов?


3-1091010344
Рооо
2004-07-28 14:25
2004.08.22
как показать нормально текстовой файл в DBGrid-e ?


14-1091775375
zamkom
2004-08-06 10:56
2004.08.22
Excel


1-1091770949
Loki3D
2004-08-06 09:42
2004.08.22
перенос данных из Grid в MSWord документ