Привожу код, который может оказаться полезным. Он позволяет в обычной или MDI-форме создать графический tile-фон или градиентную заливку.

 

(Tile - "секция, плитка" - непрерывное заполнение определенной области немасштабируемым изображением слева-направо сверху вниз - В.О.)

 

 

Автор: Lutfi Baran

 

Пример демонстрирует вывод теста случайным образом на форме под определённым углом. Добавляем в форму компонент TButton и в событие OnClick следующий код:

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

logfont: TLogFont;

font: Thandle;

count: integer;

begin

LogFont.lfheight := 20;

logfont.lfwidth := 20;

logfont.lfweight := 750;

LogFont.lfEscapement := -200;

logfont.lfcharset := 1;

logfont.lfoutprecision := out_tt_precis;

logfont.lfquality := draft_quality;

logfont.lfpitchandfamily := FF_Modern;

font := createfontindirect(logfont);

Selectobject(Form1.canvas.handle, font);

SetTextColor(Form1.canvas.handle, rgb(0, 0, 200));

SetBKmode(Form1.canvas.handle, transparent);

for count := 1 to 100 do

begin

   canvas.textout(Random(form1.width), Random(form1.height), 'Hello');

   SetTextColor(form1.canvas.handle, rgb(Random(255), Random(255), Random

     (255)));

end;

Deleteobject(font);

end;

 

 

 

Code:

protected

procedure CreateParams(var Params: TCreateParams); override;

 

//...

 

procedure TForm.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

if Assigned(Application.MainForm) then

begin

   Params.WndParent := GetDesktopWindow;

   Params.Style := WS_CHILD;

end;

end;

 

 

Переопределите в подклассе TForm оконную процедуру WinProc класса. В примере оконная процедура переопределяется для того чтобы реагировать на сообщение WM_CANCELMODE, показывающее, что выполняется messagebox или какой-либо еще диалог.

Code:

type

TForm1 = class(TForm)

   Button1: TButton;

   procedure WndProc(var Message: TMessage); override;

   procedure Button1Click(Sender: TObject);

private

{Private declarations}

public

{Public declarations}

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.WndProc(var Message: TMessage);

begin

if Message.Msg = WM_CANCELMODE then

   begin

     Form1.Caption := 'A dialog or message box has popped up';

   end

else

   inherited // <- остальное сделает родительская процедура

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage('Test Message');

end;

 

  

Перехватывать сообщение WM_SYSCOMMAND. Если это сообщение говорит о

минимизации или максимизации формы - пищит динамик.

Code:

type

TForm1 = class(TForm)

private

{Private declarations}

   procedure WMSysCommand(var Msg: TWMSysCommand);

     message WM_SYSCOMMAND;

public

{Public declarations}

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.WMSysCommand;

begin

if (Msg.CmdType = SC_MINIMIZE) or (Msg.CmdType = SC_MAXIMIZE) then

   MessageBeep(0)

else

   inherited;

end;

 

 

How i can create a form and this form stay in another icon in task bar ? (Looks like a new aplication).

Как я могу создать форму, и эта форма пребывания в другой значок в панель задач ? (Выглядит как новый применение).

 

In private clause:

Code:

type

TForm1 = class(TForm)

private

   { Private declarations }

   procedure CreateParams(var Params: TCreateParams); override;

 

Code:

type

  //...

private

   { Private declarations }

   procedure WMNCACTIVATE(var M: TWMNCACTIVATE); message WM_NCACTIVATE;

end;

 

 

implementation

 

//...

 

procedure TForm1.WMNCACTIVATE(var M: TWMNCACTIVATE);

begin

inherited;

if M.Active then

   caption:='Form active'

else caption:='Form not active' ;

end;

 

  

Code:

uses

Windows;

 

procedure PlaceMyMouse(Sender: TForm; X, Y: word);

var

MyPoint: TPoint;

begin

MyPoint := Sender.ClientToScreen(Point(X, Y));

SetCursorPos(MyPoint.X, MyPoint.Y);

end;

 

 

Для этого можно воспользоваться API функцией GetCapture().

Code:

procedure TForm1.FormDeactivate(Sender: TObject);

begin

ReleaseCapture;

end;

 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

If GetCapture = 0 then

   SetCapture(Form1.Handle);

if PtInRect(Rect(Form1.Left,

                  Form1.Top,

                  Form1.Left + Form1.Width,

                  Form1.Top + Form1.Height),

                  ClientToScreen(Point(x, y))) then

Form1.Caption := 'Мышка на форме' else

Form1.Caption := 'Мышка за пределами формы';

end;

 

 Взято из https://forum.sources.ru

 

In FormShow:

Code:

var

RecS, RecL: TRect;

begin

RecS := Rect(Screen.Width, Screen.Height, Screen.Width, Screen.Height);

RecL := ThisForm.BoundsRect;

DrawAnimatedRects(GetDesktopWindow, IDANI_CAPTION, RecS, RecL);

{ ... }

end;

 

 

 

Необходимо объявить обработчик события для WM_GETMINMAXINFO:

 

Code:

...

private

{©Drkb v.3(2007): www.drkb.ru}

 

procedure WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo);

message WM_GETMINMAXINFO;

 

 

А вот как выглядит сам обработчик:

 

procedure TForm1.WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo);

begin

Message.MinMaxInfo^.ptMinTrackSize := Point(Width, Height);

Message.MinMaxInfo^.ptMaxTrackSize := Point(Width, Height);

end;

 

Взято из https://forum.sources.ru

 

Примечание от Vit:

 

Начиная с Дельфи 5 появилось удобное свойство Constrains - специально для ограничесния минимальных и максимальных размеров...