Программирование - это просто
Advertisement
Главная arrow Уроки программирования arrow Delphi: Маленькие хитрости arrow Delphi. Маленькие хитрости: Прозрачная форма (CreateRectRgn, CombineRgn, SetWindowRgn).
26.10.2021 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Delphi. Маленькие хитрости: Прозрачная форма (CreateRectRgn, CombineRgn, SetWindowRgn). Печать E-mail
Автор megabax   
28.12.2010 г.
New Page 1

Delphi. Маленькие хитрости: Прозрачная форма (CreateRectRgn, CombineRgn, SetWindowRgn).

Ниже приведен текст примера прозрачной формы:

unit UnitClass;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TfrmGlass = class(TForm)

    Button1: TButton;

    Button2: TButton;

  private

    { Private declarations }

  protected

    procedure RebuildWindowRgn;

    procedure Resize; override;

  public

    { Public declarations }

    constructor Create(AOwner: TComponent); override;

  end;

 

var

  frmGlass: TfrmGlass;

 

implementation

 

{$R *.dfm}

 

{ Прозрачная форма }

constructor TfrmGlass.Create(AOwner: TComponent);

begin

  inherited;

  // убираем сколлбары, чтобы не мешались

  // при изменении размеров формы

  HorzScrollBar.Visible:= False;

  VertScrollBar.Visible:= False;

  // строим новый регион

  RebuildWindowRgn;

end;

 

procedure TfrmGlass.Resize;

begin

  inherited;

  // строим новый регион

  RebuildWindowRgn;

end;

 

procedure TfrmGlass.RebuildWindowRgn;

var

  FullRgn, Rgn: THandle;

  ClientX, ClientY, I: Integer;

begin

  // определяем относительные координаты клиенской части

  ClientX:= (Width - ClientWidth) div 2;

  ClientY:= Height - ClientHeight - ClientX;

  // создаем регион для всей формы

  FullRgn:= CreateRectRgn(0, 0, Width, Height);

  // создаем регион для клиентской части формы

  // и вычитаем его из FullRgn

  Rgn:= CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth, ClientY + ClientHeight);

  CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);

  // теперь добавляем к FullRgn регионы каждого контрольного элемента

  for I:= 0 to ControlCount -1 do

    with Controls[I] do begin

      Rgn:= CreateRectRgn(ClientX + Left, ClientY + Top, ClientX + Left + Width, ClientY + Top + Height);

      CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);

    end;

  // устанавливаем новый регион окна

  SetWindowRgn(Handle, FullRgn, True);

end;

 

end.

 

И вот как это будет выглядеть:

 

Delphi. Маленькие хитрости: Прозрачная форма (CreateRectRgn, CombineRgn, SetWindowRgn).

 

Теперь немного о принципе работы. При помощи функции CreateRectRgn создаем новые области окна и объединяем их таким образом, что бы все окно, кроме заголовка оказалось прозрачным.  Данная функция является функцией WinApi и имеет следующий синтаксис:

HRGN CreateRectRgn (

    int nLeftRect , // x-координата верхнего левого угла области
    int nTopRect , // y-координата верхнего левого угла области
    int nRightRect , // x-координата правого нижнего угла области
    int nBottomRect  // y-координата правого нижнего угла области
  ); 

 

Параметры:

nLeftRect - определяет x-координату верхнего левого угла области.
nTopRect - определяет y -координату верхнего левого угла области.
nRightRect - определяет x-координату правого нижнего угла области.
nBottomRect - определяет y- координату правого нижнего угла области.

Возвращаемые значения

В случае успеха возвращается дескриптор области.
В случае неудачи возвращается NULL.

Комментарии

В область не входят ее правая и нижняя границы.

Для объединения полученных регионов используем функцию CombineRgn:

Функция CombineRgn объединяет две области и сохраняет результат в третьей. Две области объединяются согласно указанному режиму объединения.

 

int CombineRgn (

    HRGN hrgnDest , // дескриптор результирующей области
    HRGN hrgnSrc 1 , // дескриптор исходной области
    HRGN hrgnSrc 2 , // дескриптор исходной области
    int fnCombineMode  // режим объединения областей
   );


Параметры

hrgnDest - идентифицирует новую область с размерами, определяемыми двумя исходными областями (область должна существовать до вызова функции CombineRgn ).
hrgnSrc 1 - идентифицирует первую из двух исходных областей.
hrgnSrc 2  - идентифицирует вторую из двух исходных областей.
fnCombineMode - определяет режим объединения двух областей. Может принимать одно из следующих значений:

Значение Пояснение
RGN_AND Создается пересечение двух областей.
RGN_COPY Создается копия области, идентифицируемой значением параметра hrgnSrc 1 .
RGN_DIFF Объединяются те части области, идентифицируемой значением параметра hrgnSrc 1 , которые не являются частями области, идентифицируемой значением параметра hrgnSrc 2 .
RGN_OR Создается объединение двух областей.
RGN_XOR Создается объединение двух областей, за исключением любых пересекающихся участков.

 

Возвращаемые значения

Возвращаемое значение показывает сложность результирующей области и может принимать одно из следующих значений:

Значение Пояснение
COMPLEXREGION Область состоит более чем из одного прямоугольника
ERROR Произошла ошибка
NULLREGION Пустая область
SIMPLEREGION Область является одиночным прямоугольником

Комментарии

Области могут совпадать друг с другом. Например, значение параметра hrgnSrc 1 может быть равно значению параметра hrgnDest .

После получения результатирующего региона мы применяем его к нашему окну. Давайте так же посмотрим описание этой функции:

Вызов этой функции приводит к тому, что окно приобретает заданную форму, согласно указанному региону.

int SetWindowRgn(
   HRGN hRgn,
   BOOL bRedraw
);

Параметры

hRgn
Хендл региона, который необходимо установить.

bRedraw
Если этот флаг установлен в TRUE, то после установки региона окно будет перерисовано.

Результат

Будет возвращено не нулевое значение, если функция выполнена успешно, в случае сбоя выполнения, возвращается 0.

Примечание

Функция использует координаты относительно левого верхнего угла окна, а не его клиентской области.

После успешного вызова SetWindowRgn, система начинает оперировать с регионом, указанным в параметре hRgn. Система не делает себе копии этого региона. Поэтому, после установки региона, не выполняйте с ним никаких операции. Например, удалять его не надо, система сама удалит регион, когда он перестанет быть нужным.


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями  в  программного продукта "Microsoft Windows", авторское право на который принадлежит Microsoft.. 


 

 

Последнее обновление ( 16.11.2011 г. )
 
« След.   Пред. »
 
© 2021 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги