Mega Code Archive

 
Categories / Delphi / Forms
 

A form like everything you can imagine

Title: A form like everything you can imagine Question: How to create a non-rectangular form? Answer: When youu need a form like a tree or something else what do you do? Windows just has the 'CreateRoundRectRegion()' function that just cuts the edges of your nice form. If you want to do something else, you need to completely draw your region in a HDC (TCanvas) while Windows looks on your hand to learn it. After this, you can set the new region to your form using the 'SetWindowRgn()' function. ---------------------------------------------------------------------------------------------------- And how to do this? Here you will find a simple example that just gives some text and sets the region like it. Expand it by your mind! unit uMainForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus; type TfrmMainForm = class(TForm) btnDoAction: TButton; pmnPopup: TPopupMenu; miDrawText: TMenuItem; miExit: TMenuItem; procedure btnDoActionClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure miExitClick(Sender: TObject); private { Private declarations } HRgn: THandle; public { Public declarations } end; var frmMainForm: TfrmMainForm; implementation {$R *.DFM} procedure TfrmMainForm.btnDoActionClick(Sender: TObject); var s: String; begin DeleteObject(HRgn); s := InputBox('Region Text', 'Please enter some text to set to the region', 'CoolRgn'); BeginPath(Canvas.Handle); with Canvas do begin Font.Name := 'Comic Sans MS'; Font.Size := 64; Font.Style := [fsBold]; TextOut(0, 0, s); end; EndPath(Canvas.Handle); HRgn := PathToRegion(Canvas.Handle); SetWindowRgn(Handle, HRgn, True); btnDoAction.Visible := False; Color := clRed; end; procedure TfrmMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin DeleteObject(HRgn); end; procedure TfrmMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); end; end; procedure TfrmMainForm.miExitClick(Sender: TObject); begin Application.MainForm.Close; end; end.