Главная страницаОбратная связьКарта сайта

Создание окна в виде бублика

Автор: Danillo
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Создание Окна ВВиде Бублика

Зависимости: нет
Автор:       Danillo, dve2@inbox.ru
Copyright:   я
Дата:        16 марта 2003 г.
***************************************************** }

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, Menus, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);

  private
    { Private declarations }
    rTitleBar: THandle;
    Center: TPoint;
    CapY: Integer;
    Circum: Double;
    SB1: TSpeedButton;
    RL, RR: Double;
    procedure TitleBar(Act: Boolean);
    procedure WMNCHITTEST(var Msg: TWMNCHitTest);
      message WM_NCHITTEST;
    procedure WMNCACTIVATE(var Msg: TWMNCACTIVATE);
      message WM_NCACTIVATE;
    procedure WMSetText(var Msg: TWMSetText);
      message WM_SETTEXT;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  TitlColors: array[Boolean] of TColor =
  (clInactiveCaption, clActiveCaption);
  TxtColors: array[Boolean] of TColor =
  (clInactiveCaptionText, clCaptionText);

procedure TForm1.FormCreate(Sender: TObject);
var
  rTemp, rTemp2: THandle;
  Vertices: array[0..2] of TPoint;
  X, Y: INteger;
begin
  Caption := "Oy?ei iaiaei!!!";
  BorderStyle := bsNone; {required}
  if Width > Height then
    Width := Height
  else
    Height := Width; {harder to calc if width <> height}
  Center := Point(Width div 2, Height div 2);
  CapY := GetSystemMetrics(SM_CYCAPTION) + 10;
  rTemp := CreateEllipticRgn(0, 0, Width, Height);
  rTemp2 := CreateEllipticRgn((Width div 4), (Height div 4),
    3 * (Width div 4), 3 * (Height div 4));
  CombineRgn(rTemp, rTemp, rTemp2, RGN_DIFF);
  SetWindowRgn(Handle, rTemp, True);
  DeleteObject(rTemp2);
  rTitleBar := CreateEllipticRgn(4, 4, Width - 4, Height - 4);
  rTemp := CreateEllipticRgn(CapY, CapY, Width - CapY, Height - CapY);
  CombineRgn(rTitleBar, rTitleBar, rTemp, RGN_DIFF);
  Vertices[0] := Point(0, 0);
  Vertices[1] := Point(Width, 0);
  Vertices[2] := Point(Width div 2, Height div 2);
  rTemp := CreatePolygonRgn(Vertices, 3, ALTERNATE);
  CombineRgn(rTitleBar, rTitleBar, rTemp, RGN_AND);
  DeleteObject(rTemp);
  RL := ArcTan(Width / Height);
  RR := -RL + (22 / Center.X);
  X := Center.X - Round((Center.X - 1 - (CapY div 2)) * Sin(RR));
  Y := Center.Y - Round((Center.Y - 1 - (CapY div 2)) * Cos(RR));
  SB1 := TSpeedButton.Create(Self);
  with SB1 do
  begin
    Parent := Self;
    Left := X;
    Top := Y;
    Width := 14;
    Height := 14;
    OnClick := Button1Click;
    Caption := "X";
    Font.Style := [fsBold];
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.WMNCHITTEST(var Msg: TWMNCHitTest);
begin
  inherited;
  with Msg do
    with ScreenToClient(Point(XPos, YPos)) do
      if PtInRegion(rTitleBar, X, Y) and
        (not PtInRect(SB1.BoundsRect, Point(X, Y))) then
        Result := htCaption;
end;

procedure TForm1.WMNCActivate(var Msg: TWMncActivate);
begin
  inherited;
  TitleBar(Msg.Active);
end;

procedure TForm1.WMSetText(var Msg: TWMSetText);
begin
  inherited;
  TitleBar(Active);
end;

procedure TForm1.TitleBar(Act: Boolean);
var
  TF: TLogFont;
  R: Double;
  N, X, Y: Integer;
begin
  if Center.X = 0 then
    Exit;
  with Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := TitlColors[Act];
    PaintRgn(Handle, rTitleBar);
    R := RL;
    Brush.Color := TitlColors[Act];
    Font.Name := "Arial";
    Font.Size := 12;
    Font.Color := TxtColors[Act];
    Font.Style := [fsBold];
    GetObject(Font.Handle, SizeOf(TLogFont), @TF);
    for N := 1 to Length(Caption) do
    begin
      X := Center.X - Round((Center.X - 6) * Sin(R));
      Y := Center.Y - Round((Center.Y - 6) * Cos(R));
      TF.lfEscapement := Round(R * 1800 / pi);
      Font.Handle := CreateFontIndirect(TF);
      TextOut(X, Y, Caption[N]);
      R := R - (((TextWidth(Caption[N])) + 2) / Center.X);
      if R < RR then
        Break;
    end;
    Font.Name := "MS Sans Serif";
    Font.Size := 8;
    Font.Color := clWindowText;
    Font.Style := [];
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  with Canvas do
  begin
    Pen.Color := clBlack;
    Brush.Style := bsClear;
    Pen.Width := 1;
    Pen.Color := clWhite;
    Arc(1, 1, Width - 1, Height - 1, Width, 0, 0, Height);
    Arc((Width div 4) - 1, (Height div 4) - 1,
      3 * (Width div 4) + 1, 3 * (Height div 4) + 1, 0, Height, Width, 0);
    Pen.Color := clBlack;
    Arc(1, 1, Width - 1, Height - 1, 0, Height, Width, 0);
    Arc((Width div 4) - 1, (Height div 4) - 1,
      3 * (Width div 4) + 1, 3 * (Height div 4) + 1, Width, 0, 0, Height);
    TitleBar(Active);
  end;
end;

end.

Обсудить статью на форуме


Если Вас заинтересовала или понравилась информация по разработке на Delph - "Создание окна в виде бублика", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2024 Дискета.info