Форум: "Начинающим";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
ВнизИзменение стиля и позиции окна при разных видеорежимах. Найти похожие ветки
← →
Б (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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c