Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.034 c
1-1091801436
Леонид Федьков
2004-08-06 18:10
2004.08.22
Передача HTML-страницы в TWebBrowser через TOleStream


14-1091719602
Cerberus
2004-08-05 19:26
2004.08.22
Хочяу в орешник


1-1091623105
cvg
2004-08-04 16:38
2004.08.22
Длина массива записей -- как???


14-1090929147
Soft
2004-07-27 15:52
2004.08.22
Скорость света постепенно увеличивается.


1-1091818035
Alex870
2004-08-06 22:47
2004.08.22
TreeView и ImageList





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский