Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.21;
Скачать: CL | DM;

Вниз

Изменение стиля и позиции окна при разных видеорежимах.   Найти похожие ветки 

 
Б   (2009-12-11 07:33) [0]

Здрасти!

Имеется окно,(созданное не VCL) которое рендериться OpenGL.
Может быть 2 режима работы: полноэкранный и оконный.
Менять разрешение экрана умею.
А вот как потом обратно возвратить окну нужный стиль?
(Полноэкранный - нет рамки, оконный - есть рамка с кнопками минимизации и закрытия)
Как подогнать окно под новое полноэкранный режим?


 
Б   (2009-12-11 16:47) [1]


> А вот как потом обратно возвратить окну нужный стиль?


Как изменить стиль нашёл:
SetWindowLong(FWnd, GWL_STYLE, Style);
Подогнать окно под полноэкранный режим не могу.


 
clickmaker ©   (2009-12-11 16:56) [2]

> Полноэкранный - нет рамки

WS_BORDER или WS_CAPTION


 
clickmaker ©   (2009-12-11 17:01) [3]

либо вообще WS_OVERLAPPEDWINDOW. В смысле убрать из стилей


 
Б   (2009-12-11 17:01) [4]

Какие задавать стили я разобрался.
Теперь как подогнать окно в полноэкранном режиме осталось.


 If FFull then Style:= WS_POPUP;
 else            Style:= WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX;

 SetWindowLong(FWnd, GWL_STYLE,    Style);
 SetWindowLong(FWnd, GWL_EXSTYLE, WS_EX_TOPMOST * BYTE(FFull));



 
clickmaker ©   (2009-12-11 17:02) [5]

> как подогнать окно в полноэкранном режиме

что тогда значит "подогнать"?


 
Б   (2009-12-11 17:05) [6]


> что тогда значит "подогнать"?


Чтобы клиентская часть окна была полностью равна размерам экрана.
Кажется я понял, что нужно сделать.


 
Б   (2009-12-11 17:09) [7]

Странно.
Когда переключашся в полноэкранный режим, окно становится не видимым.
Исцеляется просто: ShowWindow(FWnd, SW_SHOW);
Решил я этой строчкой пренебреч и исправил так:


SetWindowLong(FWnd, GWL_STYLE,   Style or WS_VISIBLE);


Т.е. замена ShowWindow. С окно в полноэкранном - нормально.
А в оконном рамка исчезает. Почему?


 
Б   (2009-12-11 17:22) [8]


> Кажется я понял, что нужно сделать.


SetClienyRect - нет такой функции.


 
Б   (2009-12-18 00:10) [9]

Решение тут:
http://delphimaster.net/view/2-1261068749/


 
Игорь Шевченко ©   (2009-12-18 00:13) [10]

{
  Модуль: FullScreenUnit

  Описание: Поддержка разворота клиентской части окна во весь экран.
            Источник: статья Пола Дилация в MSDN Magazine № 6(12) 2002 г.

  Особенности использования: Окно, клиентская часть которого должна быть
                             развернута во весь экран, должно обрабатывать
                             сообщение WM_GETMINMAXINFO и устанавливать
                             свой максимальный размер больше, чем размер
                             экрана.

  Авторы: Пол Дилация (С++, MFC), Игорь Шевченко (Delphi)

  Дата создания: 09.01.2003

  История изменений:
}
unit FullScreenUnit;

interface
uses
 Windows, Controls;

type
 TFullScreenHandler = class
 private
   FRestoreRect : TRect;
   function GetInFullScreenMode : Boolean;
   function GetMaxSize : SIZE;
 public
   { Развернуть клиентскую область окна во весь экран }
   procedure Maximize (AWinControl : TWinControl);
   { Восстановить клиентскую область окна }
   procedure Restore (AWinControl : TWinControl);
   { Развернута ли клиентская область окна во весь экран }
   property InFullScreenMode : Boolean read GetInFullScreenMode;
   { Максимально возможный размер окна, такой, чтобы клиентская область
     уместилась во весь экран. }
   property MaxSize : SIZE read GetMaxSize;
 end;

var
 FullScreenHandler : TFullScreenHandler;

implementation
uses
 Forms; { Для Screen }

function TFullScreenHandler.GetInFullScreenMode : Boolean;
begin
 Result := not IsRectEmpty(FRestoreRect);
end;

function TFullScreenHandler.GetMaxSize : SIZE;
var
 ARect : TRect;
begin
{
 При большом желании обращение к свойствам переменной Screen можно заменить
 на вызовы функции GetSystemMetrics(SM_CXSCREEN) и
 GetSystemMetrics(SM_CYSCREEN).
}
 SetRect(ARect, 0, 0, Screen.Width, Screen.Height);
 InflateRect(ARect, 10, 50); //Любые числа, лишь бы превышали размер
                             //неклиентской области окон
 Result.cx := ARect.Right - ARect.Left;
 Result.cy := ARect.Bottom - ARect.Top;
end;

procedure TFullScreenHandler.Maximize (AWinControl : TWinControl);
var
 RcClient, RcNewWindow : TRect;
begin
 RcClient := AWinControl.ClientRect;
{ Перевод координат клиентской области окна в экранные }
 MapWindowPoints(AWinControl.Handle, HWND_DESKTOP, RcClient, 2);
{ Сохраним размеры окна для восстановления }
 GetWindowRect(AWinControl.Handle, FRestoreRect);
{
 При большом желании обращение к свойствам переменной Screen можно заменить
 на вызовы функции GetSystemMetrics(SM_CXSCREEN) и
 GetSystemMetrics(SM_CYSCREEN).
}
 SetRect(RcNewWindow, 0, 0, Screen.Width, Screen.Height);
 with RcNewWindow do begin
   Inc(Left, FRestoreRect.Left - RcClient.Left);
   Inc(Top, FRestoreRect.Top - RcClient.Top);
   Inc(Right, FRestoreRect.Right - RcClient.Right);
   Inc(Bottom, FRestoreRect.Bottom - RcClient.Bottom);
   SetWindowPos (AWinControl.Handle, 0, Left, Top, Right - Left, Bottom - Top,
                 SWP_NOZORDER);
 end;
end;

procedure TFullScreenHandler.Restore (AWinControl : TWinControl);
begin
 with FRestoreRect do
   SetWindowPos (AWinControl.Handle, 0, Left, Top, Right - Left, Bottom - Top,
                 SWP_NOZORDER);
 SetRectEmpty(FRestoreRect);
end;

initialization
 FullScreenHandler := TFullScreenHandler.Create();
finalization
 FullScreenHandler.Free();
end.


использование

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, ExtCtrls;

type
 TfMain = class(TForm)
   MainMenu: TMainMenu;
   View1: TMenuItem;
   miFullScreen: TMenuItem;
   Image: TImage;
   miHelp: TMenuItem;
   About: TMenuItem;
   procedure miFullScreenClick(Sender: TObject);
   procedure ImageDblClick(Sender: TObject);
   procedure AboutClick(Sender: TObject);
 private
   procedure WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo);
                                                    message WM_GETMINMAXINFO;
 end;

var
 fMain: TfMain;

implementation
uses
 FullScreenUnit, About;

{$R *.dfm}

procedure TfMain.miFullScreenClick(Sender: TObject);
begin
 if NOT FullScreenHandler.InFullScreenMode then
   FullScreenHandler.Maximize(Self)
 else
   FullScreenHandler.Restore(Self);
 miFullScreen.Checked := FullScreenHandler.InFullScreenMode;
end;

procedure TfMain.WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo);
var
 Sz : SIZE;
begin
 Sz := FullScreenHandler.MaxSize;
 with Message.MinMaxInfo^ do begin
   ptMaxSize := TPoint(Sz);
   ptMaxTrackSize := TPoint(Sz);
 end;
end;

procedure TfMain.ImageDblClick(Sender: TObject);
begin
 miFullScreenClick(miFullScreen);
end;

procedure TfMain.AboutClick(Sender: TObject);
begin
 with TfAbout.Create(Application) do
   try
     ShowModal();
   finally
     Free();
   end;
end;

end.


 
Б   (2009-12-18 00:22) [11]

Большое спасибо за модуль. ;)



Страницы: 1 вся ветка

Текущий архив: 2010.02.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
2-1261143805
TStas
2009-12-18 16:43
2010.02.21
Ошибка создания MDI формы


2-1261380806
JohnKorsh
2009-12-21 10:33
2010.02.21
Вопрос по компоненту UDPServer (INDY).


15-1260394219
Юрий
2009-12-10 00:30
2010.02.21
С днем рождения ! 10 декабря 2009 четверг


3-1234936713
тимохов
2009-02-18 08:58
2010.02.21
Как обновлять TAdoTable в одной форме, при изменении в другой?


11-1190008553
Nikfel
2007-09-17 09:55
2010.02.21
Как добавить изображение в TKolPopupMenu.