МЕНЮатюра в Delphi

А вот и третья возможность пошкодить в своей программе. Теперь жерт­вой наших экспериментов падёт системное меню формы. Как вы помните, оно появляется при нажатии правой кнопки мыши на заголовке формы. Об этом мы там и напишем (Caption= Нажмите правую кнопку мышки на за­головке)

Delphi

Чтобы на форме не оставалось пустот, установите её свойство AutoSizeв True.

Поместите на форму метку Labell- для вывода смехотворных сообщений. Её свойства:


Left = 0, Top = 0
Caption = ’                                   ’
Font.Height = -32, Font.Style = [fsBold]

Пригодится нам и таймер Timer1 - для смены этих «мессажей»:

Enabled= FalseInterval= 3000

Чтобы добавить новые пункты в системное (и не только) меню, восполь­зуемся функцией WindowsAPIAppendMenu, а «отлавливать» нажатие но­вых пунктов меню будем, обрабатывая уже известное нам сообщение Win­dowsWM_SYSCOMMAND. Поэтому объявим процедуры WMSysCommand, OnMyMenuи OnMyMenu2 в описании типа формы, а также ты SC_MyMenuItemи SC_MyMenuItem2, нужные при вызове функции Ap­pendMenu(значения 0.. WM_USER-1зарезервированы для системных со­общений).


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml = class(TForm)
Labell: TLabel;
Timerl: TTimer;
procedure FormCreate(Sender: TObject); procedure OnMyMenu; procedure OnMyMenu2;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
public
{ Public declarations } end;
var
Forml: TForml; implementation {$R *.DFM} const
SC_MyMenuItem = WM_USER + 1;
SC MyMenuItem2 = WM USER + 2;
Дописать новые пункты в меню удобнее всего при запуске программы. Сначала проведём горизонтальную разделительную черту (сепаратор), а затем добавим пару команд (подобным образом можно добавить и ещё не­сколько):
//СОЗДАТЬ ФОРМУ
procedure TForm1.FormCreate(Sender: TObject);
begin
//добавляем новые пункты в системное меню приложения: AppendMenu(GetSystemMenu(Handle, FALSE), MF_SEPARATOR, 0,                 ’’);
AppendMenu(GetSystemMenu(Handle, FALSE), MF_STRING,
SC_MyMenuItem, ’Рекламная пауза');
AppendMenu(GetSystemMenu(Handle, FALSE), MF_STRING, SC_MyMenuItem2, ’Это конец!’);
end;
Если значение параметра uCmdTypeв сообщении WM_SYSCOMMANDравно одной из наших констант, значит, выбран «наш» пункт системного меню:
//ОБРАБОТКА НАЖАТИЯ СИСТЕМНЫХ КНОПОК
procedureTForm1.WMSysCommand(varMsg: TWMSysCommand);
begin
// перехват события выбора новых пунктов меню: ifMsg.CmdType= SC_MyMenuItemthenOnMyMenuelseifMsg.CmdType = SC_MyMenuItem2 thenOnMyMenu2 elseinherited;
end;
 

Если выбран пункт меню со строкой Рекламная пауза, то мы выводим на метке красную «рекламную» надпись и запускаем таймер:


//ВЫПОЛНИТЬ КОМАНДУ МЕНЮ 1 procedure TForm1.OnMyMenu;
Begin
Label1.Font.Color:= clRed;
Label1.Caption:= ’Тут могла бы быть ваша реклама!’; Timer1.Enabled:= True;
End;

А если «щёлкнута» строчка Это конец!, то подтверждаем догадку пользо­вателя:


//ВЫПОЛНИТЬ КОМАНДУ МЕНЮ 2 procedure TForm1.OnMyMenu2;
Begin
Label1.Font.Color:= clRed; Label1.Caption:= Вы правы!’; Timer1.Enabled:= True;
End;

Через 3 секунды программа попадёт в процедуру Timer1Timer, где при­ложение будет закрыто, если исполняется вторая команда меню, иначе надписи будут последовательно сменять друг друга:


//ТАЙМЕР
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Label1.Caption= Вы правы!’ then Close; if Label1.Font.Color= clRed then begin Label1.Font.Color:= clBlue;
Label1.Caption:= А её тут нет!’; end else begin
Label1.Font.Color:= clBlack;
Label1.Caption:= Пока!’;
Timer1.enabled:=false;
end;
end;

Следуя вашим указаниям на заголовке формы, отчаянный пользователь откроет системное меню, а в нём - при известном любопытстве - выберет один из ваших пунктов 

 delphi

 

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: