Создание окна в виде бубликаDelphi , Программа и Интерфейс , Формы
Автор: Danillo { **** 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. Программа на Delphi, которая создает круглое окно с заголовком и кнопкой закрытия. Форма окна создается с помощью функции Вот разбивка кода:
Код также определяет несколько констант для цветов заголовка, стиля шрифта и других настроек. Некоторые предложения по улучшению:
В целом, это интересный код, который демонстрирует некоторыеadvanced techniques Delphi для создания custom window shapes и обработки событий мыши. Создание окна в виде бублика. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |