Ta en titt på oppgavelinjen. Se området der klokka ligger? Er det noen andre ikoner der? Stedet kalles Windows System Tray. Vil du plassere din Delphi programmets ikon der? Vil du at det ikonet skal være animert - eller gjenspeile statusen for applikasjonen din?
Dette vil være nyttig for programmer som blir stående i lange perioder uten brukerinteraksjon (bakgrunnsoppgaver du vanligvis kjører på PC-en hele dagen).
Det du kan gjøre er å få Delphi-applikasjonene dine til å se ut som om de minimerer til skuffen (i stedet for til Oppgavelinje, helt til Win Start-knappen) ved å plassere et ikon i magasinet og samtidig lage skjema (er) usynlig.
La oss brette det
Heldigvis er det ganske enkelt å lage et program som kjører i systemstatusfeltet - bare en (API) -funksjon, Shell_NotifyIcon, er nødvendig for å utføre oppgaven.
Funksjonen er definert i ShellAPI-enhet og krever to parametere. Den første er et flagg som indikerer om ikonet blir lagt til, endret eller fjernet, og det andre er en peker til en TNotifyIconData-struktur som inneholder informasjonen om ikonet. Det inkluderer håndtaket på ikonet som skal vises, teksten som skal vises som et verktøytips når musen er over ikonet, håndtaket av vinduet som vil motta meldingene til ikonet, og meldingstypen ikonet vil sende til dette vindu.
Først, i hovedformens private seksjon, legger du streken:
TrayIconData: TNotifyIconData;
type
TMainForm = klasse(TForm)
fremgangsmåte FormCreate (avsender: TObject);
privat
TrayIconData: TNotifyIconData;
{Private erklæringer}offentlig{Offentlige erklæringer}slutt;
Deretter i hovedformen onCreate initialiserer TrayIconData-datastrukturen og kaller funksjonen Shell_NotifyIcon:
med TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = Håndtak;
uID: = 0;
uFlags: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = Søknad. Ikon. Håndtak;
StrPCopy (szTip, applikasjon. Tittel);
slutt;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);
Wnd-parameteren i TrayIconData-strukturen peker til vinduet som mottar varslingsmeldinger tilknyttet et ikon.
HIcon viser til ikonet vi vil legge til i skuffen - i dette tilfellet brukes hovedikonet for applikasjoner.
SzTip har Tooltip-teksten som skal vises for ikonet - i vårt tilfelle applikasjonens tittel. SzTip kan inneholde opptil 64 tegn.
Parameteren uFlags er satt til å fortelle ikonet å behandle applikasjonsmeldinger, bruke programmets ikon og dets tips. De uCallbackMessage peker til den applikasjonsdefinerte meldingsidentifikatoren. Systemet bruker den spesifiserte identifikatoren for varslingsmeldinger som det sender til vinduet som er identifisert av Wnd når det oppstår en musebegivenhet i ikonets avgrensende rektangel. Denne parameteren er satt til WM_ICONTRAY konstant definert i grensesnittdelen av skjemaenheten og tilsvarer: WM_USER + 1;
Du legger til ikonet i skuffen ved å kalle Shell_NotifyIcon API-funksjonen. Den første parameteren "NIM_ADD" legger til et ikon til skuffområdet. De to andre mulige verdiene, NIM_DELETE og NIM_MODIFY, brukes til å slette eller endre et ikon i skuffen - vi får se hvordan senere i denne artikkelen. Den andre parameteren vi sender til Shell_NotifyIcon er den initialiserte TrayIconData-strukturen.
Ta en
Hvis du kjører prosjektet ditt nå, vil du se et ikon nær klokken i skuffen. Legg merke til tre ting.
1) For det første skjer det ingenting når du klikker (eller gjør noe annet med musen) på ikonet som er plassert i skuffen - vi har ikke opprettet en prosedyre (meldingsbehandler) ennå.
2) For det andre er det en knapp på oppgavelinjen (vi vil tydeligvis ikke ha den der).
3) For det tredje: Når du lukker applikasjonen, forblir ikonet i skuffen.
Ta to
La oss løse dette bakover. For å få ikonet fjernet fra skuffen når du avslutter applikasjonen, må du ringe Shell_NotifyIcon igjen, men med NIM_DELETE som den første parameteren. Dette gjør du i OnDestroy arrangementshåndterer for hovedskjemaet.
fremgangsmåte TMainForm. FormDestroy (avsender: TObject);
begynne
Shell_NotifyIcon (NIM_DELETE, @TrayIconData);
slutt;
For å skjule applikasjonen (programmets knapp) fra oppgavelinjen bruker vi et enkelt triks. Legg til følgende linje i prosjektkildekoden: Program. ShowMainForm: = Falske; før søknaden. CreateForm (TMainForm, MainForm); F.eks. La det se slik ut:
...
begynne
Applikasjon. Initial;
Applikasjon. ShowMainForm: = Falske;
Applikasjon. CreateForm (TMainForm, MainForm);
Applikasjon. Løpe;
slutt.
Og til slutt, for å få magasin-ikonet ditt til å svare på hendelser i mus, må vi lage en prosedyre for håndtering av meldinger. Først erklærer vi en prosedyre for håndtering av meldinger i den offentlige delen av skjemaerklæringen: prosedyre TrayMessage (var Msg: TMessage); melding WM_ICONTRAY; For det andre ser definisjonen av denne prosedyren ut:
fremgangsmåte TMainForm. TrayMessage (Var Msg: TMessage);
begincase Msg.lParam av
WM_LBUTTONDOWN:
begynne
ShowMessage ('Venstre knapp klikket
la oss vise formen! ');
MainForm. Forestilling;
slutt;
WM_RBUTTONDOWN:
begynne
ShowMessage ('Høyreklikk klikket
la oss gjemme skjemaet! ');
MainForm. Gjemme seg;
slutt;
slutt;
slutt;
Denne prosedyren er utviklet for å håndtere bare vår melding, WM_ICONTRAY. Det tar LParam-verdien fra meldingsstrukturen som kan gi oss musens tilstand ved aktivering av prosedyren. For enkelhets skyld håndterer vi bare venstre mus nede (WM_LBUTTONDOWN) og høyre mus nede (WM_RBUTTONDOWN). Når venstre museknapp er nede på ikonet viser vi hovedformen, når du trykker på høyre knapp skjuler vi den. Selvfølgelig er det andre musinmatingsmeldinger du kan håndtere i prosedyren, som, knapp opp, knapp dobbeltklikk osv.
Det er det. Fort og lett. Deretter ser du hvordan du animerer ikonet i skuffen og hvordan du kan få det ikonet til å gjenspeile statusen til applikasjonen din. Enda mer vil du se hvordan du viser en hurtigmeny nær ikonet.