Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.008 c
2-1260985904
serko
2009-12-16 20:51
2010.02.21
Появляются пробелы в полях...


2-1261080452
TComponent
2009-12-17 23:07
2010.02.21
Устойчивый фокус на TreeView


2-1260189361
Б
2009-12-07 15:36
2010.02.21
Окно по центру экрана.


2-1261482684
rusned_7_
2009-12-22 14:51
2010.02.21
Проблема с Frame


15-1260396353
Petr V. Abramov
2009-12-10 01:05
2010.02.21
есть ли паровоз?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский