-
V dalÜφ aplikaci se budeme zab²vat umφst∞nφm a ovlßdßnφm aktivnφ ikony
na pruhu ·loh (pruh ve spodnφ Φßsti pracovnφ plochy Windows). Op∞t se jednß
o ji₧ hotovou aplikaci. Stßhn∞te si ji a p°elo₧te
ji. D°φve ne₧ ji vyzkouÜφte popφÜeme si jejφ k≤d.
Pro prßci s informaΦnφ oblastφ pruhu ·loh se pou₧φvajφ nßsledujφcφ
funkce a struktura Windows API (jsou definovßny v shellapi.h). Funkce
Shell_NotifyIcon
zasφlß zprßvu systΘmu. Pomocφ tΘto zprßvy je mo₧no p°idßvat, modifikovat
nebo ruÜit ikony v pruhu ·loh. Funkce vracφ true p°i ·sp∞ÜnΘm provedenφ
a false v opaΦnΘm p°φpad∞. Funkce mß dva parametry. Prvnφ parametr
je identifikßtor zasφlanΘ zprßvy. Tento parametr m∙₧e nab²t n∞kterΘ z nßsledujφcφch
hodnot: NIM_ADD (p°idßvß ikonu do informaΦnφ oblasti pruhu ·loh),
NIM_DELETE
(zruÜφ ikonu v informaΦnφ oblasti pruhu ·loh) a NIM_MODIFY (provede
modifikaci ikony v informaΦnφ oblasti pruhu ·loh). Druh² parametr je adresa
struktury typu NOTIFYICONDATA. Tato struktura je definovßna takto:
typedef struct _NOTIFYICONDATA
{ // nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA,
*PNOTIFYICONDATA;
Struktura obsahuje informace, kterΘ systΘm pot°ebuje p°i provßd∞nφ
zprßv informaΦnφ oblasti pruhu ·loh. Slo₧ky struktury majφ nßsledujφcφ
v²znam: cbSize (velikost struktury NOTIFYICONDATA), hWnd
(madlo okna, kterΘ bude dostßvat informaΦnφ zprßvy spojenΘ s danou ikonou
informaΦnφ oblasti pruhu ·loh), uID (aplikacφ definovan² identifikßtor
ikony pruhu ·loh), uFlags (pole p°φznak∙, kterΘ indikujφ platnost
hodnot dalÜφch polo₧ek tΘto struktury; jednß se o kombinaci hodnot NIF_ICON,
NIF_MESSAGE
a NIF_TIP - urΦujφ platnost polo₧ek hIcon,
uCallbackMessage
a szTip), uCallbackMessage (aplikacφ definovan² identifikßtor
zprßvy; systΘm pou₧φvß tento identifikßtor pro informaΦnφ zprßvy, kterΘ
zasφlß oknu specifikovanΘmu hodnotou polo₧ky hWnd, kdykoliv nastane
uvnit° hraniΦnφho obdΘlnφku ikony udßlost myÜi), hIcon (madlo p°idßvanΘ,
modifikovanΘ nebo ruÜenΘ ikony pruhu ·loh) a szTip (informaΦnφ text,
kter² bude zobrazen pro ikonu pruhu ·loh).
V naÜφ aplikaci je definovßna soukromß metoda TrayMessage p°ebφrajφcφ
identifikßtor zasφlanΘ zprßvy (NIM_ADD, NIM_DELETE nebo NIM_MODIFY).
Tato metoda zjednoduÜuje prßci s ikonami informaΦnφho pruhu ·loh a mß tento
tvar:
bool __fastcall TForm1::TrayMessage(DWORD
dwMessage)
{
NOTIFYICONDATA
tnd;
PSTR
pszTip;
pszTip
= TipText();
tnd.cbSize
= sizeof(NOTIFYICONDATA);
tnd.hWnd
= Handle;
tnd.uID
= IDC_MYICON;
tnd.uFlags
= NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnd.uCallbackMessage
= MYWM_NOTIFY;
if (dwMessage
== NIM_MODIFY) {
tnd.hIcon = IconHandle();
if (pszTip) lstrcpyn(tnd.szTip, pszTip, sizeof(tnd.szTip));
else tnd.szTip[0] = '\0';
}
else
{
tnd.hIcon = NULL;
tnd.szTip[0] = '\0';
}
return
(Shell_NotifyIcon(dwMessage, &tnd));
}
NaÜe metoda naplnφ strukturu NOTIFYICONDATA a volß funkci Shell_NotifyIcon.
Pro napln∞nφ slo₧ek struktury jsou volßny dalÜφ soukromΘ metody. Nap°.
pro zjiÜt∞nφ informaΦnφho textu ikony je pou₧ita metoda TipText
(na zßklad∞ oznaΦenΘho voliΦe je pou₧it text z p°φsluÜnΘho editaΦnφho ovladaΦe):
PSTR __fastcall TForm1::TipText(void)
{
if (RadioButton1->Checked)
return (Edit1->Text.c_str());
else return
(Edit2->Text.c_str());
}
Pro zjiÜt∞nφ madla ikony se pou₧φvß metoda:
HANDLE __fastcall
TForm1::IconHandle(void)
{
if (RadioButton1->Checked)
return (Image1->Picture->Icon->Handle);
else return
(Image2->Picture->Icon->Handle);
}
V hlaviΦkovΘm souboru formulß°e jsou definovßny dv∞ konstanty (identifikßtor
zprßvy a identifikßtor ikony) a prom∞nnß g_hinst:
#define MYWM_NOTIFY
(WM_APP+100)
#define IDC_MYICON
1006
extern HINSTANCE
g_hinst;
Obsluha OnDestroy formulß°e je tvo°ena p°φkazem:
TrayMessage(NIM_DELETE);
Obsluha kliknutφ na znaΦce Place on tray je tvo°ena p°φkazy:
if (CheckBox1->Checked)
{
TrayMessage(NIM_ADD);
TrayMessage(NIM_MODIFY);
}
else TrayMessage(NIM_DELETE);
Button1->Enabled
= CheckBox1->Checked;
Obsluha kliknutφ na obou voliΦφch je tvo°ena p°φkazy:
if (!CheckBox1->Checked)
return;
TrayMessage(NIM_MODIFY);
Obsluha OnKeyUp obou editaΦnφch ovladaΦ∙ je tvo°ena:
if (!CheckBox1->Checked)
return;
TrayMessage(NIM_MODIFY);
Obsluhu stisku tlaΦφtka tvo°φ p°φkaz:
Hide();
Aplikace mß takΘ mφstnφ nabφdku s volbami: Properties, Toggle
State a Shutdown. Obsluhu volby Properties tvo°φ p°φkaz:
Show();
obsluhu Toggle State tvo°φ:
ToggleState();
a obsluhu Shutdown:
Close();
Formulß° mß dalÜφ soukromou metodu ToggleState:
void __fastcall TForm1::ToggleState(void)
{
if (RadioButton1->Checked)
{
RadioButton1->Checked = false;
RadioButton2->Checked = true;
}
else
{
RadioButton2->Checked = false;
RadioButton1->Checked = true;
}
TrayMessage(NIM_MODIFY);
}
N∞kterΘ metody vy₧adujφ madlo naÜφ aplikace. Ulo₧φme je tedy do prom∞nnΘ
g_hinst.
Toto je provedeno ve zdrojovΘm souboru aplikace. Nßsleduje v²pis celΘho
tohoto souboru:
#include <vcl.h>
#pragma hdrstop
HINSTANCE g_hinst;
USEFORM("traymain.cpp",
Form1);
USERES("trayicon.res");
WINAPI WinMain(HINSTANCE,
HINSTANCE hInstance, LPSTR, int)
{
Application->Initialize();
g_hinst = hInstance;
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
return 0;
}
Vlastnφ zobrazenφ ikony je provßd∞no funkcφ IconDrawItem. Tato
funkce mß nßsledujφcφ obsah:
LRESULT IconDrawItem(LPDRAWITEMSTRUCT
lpdi)
{
HICON hIcon;
hIcon = (HICON)LoadImage(g_hinst,
MAKEINTRESOURCE(lpdi->CtlID),
IMAGE_ICON, 16, 16, 0);
if (!hIcon)
return(FALSE);
DrawIconEx(lpdi->hDC,
lpdi->rcItem.left, lpdi->rcItem.top, hIcon,
16, 16, 0, NULL, DI_NORMAL);
return(TRUE);
}
NaÜe aplikace takΘ obsahuje mapovßnφ zprßv:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DRAWITEM,TMessage,DrawItem)
MESSAGE_HANDLER(MYWM_NOTIFY,TMessage,MyNotify)
END_MESSAGE_MAP(TForm)
Zb²vajφ jeÜt∞ dalÜφ dv∞ soukromΘ metody formulß°e a to DrawItem
(mapovßna na zprßvu WM_DRAWITEM) a MyNotify (mapovßna na
zprßvu kliknutφ na naÜφ ikon∞). Obsah t∞chto metod je:
void __fastcall TForm1::DrawItem(TMessage&
Msg)
{
IconDrawItem((LPDRAWITEMSTRUCT)Msg.LParam);
TForm::Dispatch(&Msg);
}
void __fastcall TForm1::MyNotify(TMessage&
Msg)
{
POINT MousePos;
switch(Msg.LParam)
{
case WM_RBUTTONUP:
if (GetCursorPos(&MousePos))
{
PopupMenu1->PopupComponent = Form1;
SetForegroundWindow(Handle);
PopupMenu1->Popup(MousePos.x, MousePos.y);
}
else Show();
break;
case WM_LBUTTONUP:
ToggleState();
break;
default:
break;
}
TForm::Dispatch(&Msg);
}
Tφm je popis tΘto aplikace dokonΦen. Pokuste se pochopit, jak aplikace
pracuje.
-
DalÜφ aplikacφ, kterou se budeme zab²vat je op∞t hotovß aplikace. Stßhn∞te
si ji. Tato aplikace se sklßdß ze samotnΘho formulß°e (neobsahuje ₧ßdnou
komponentu). Formulß° mß t°i obsluhy udßlostφ (OnActivate, OnPaint
a OnMouseMove) a jeho konstruktor obsahuje n∞kolik p°φkaz∙. VÜechny
pot°ebnΘ komponenty jsou vytvo°eny v obsluze OnActivate formulß°e.
Je zde takΘ mapovßna funkce SetCursor na zprßvu WM_SETCURSOR.
V konstruktoru formulß°e je p°i°azena funkce IdleLoop udßlosti OnIdle
aplikace (Φinnost provßd∞nß v dob∞ neΦinnosti aplikace; v naÜem p°φpad∞
se vlastn∞ Φinnost aplikace provßdφ v dob∞ neΦinnosti aplikace). Aplikaci
vyzkouÜejte a podφvejte se, jak je naprogramovßna.
-
Po vytvo°enφ a odlad∞nφ aplikace, aplikaci m∙₧eme Üφ°it,
tj. p°edßvat ji dalÜφm u₧ivatel∙m k pou₧φvßnφ. Spustiteln² soubor aplikace
m∙₧e po₧adovat dalÜφ soubory (DLL, soubory balφΦk∙ a nßpov∞dn² soubor aplikace).
Registry Windows mohou obsahovat polo₧ky pro aplikaci (nap°. umφst∞nφ po₧adovan²ch
soubor∙). Proces kopφrovßnφ aplikaΦnφch soubor∙ na poΦφtaΦ a provedenφ
po₧adovanΘho nastavenφ registr∙ m∙₧e b²t automatizovßno instalaΦnφm programem
(nap°. pomocφ InstallShield Express).
Jednoduchß aplikace C++ Builderu, kterß se sklßdß pouze
z jednoho souboru (EXE) se na cφlovΘm poΦφtaΦi instaluje snadno. Spustiteln²
soubor pouze p°ekopφrujeme do poΦφtaΦe. Slo₧it∞jÜφ aplikace sklßdajφcφ
se z mnoha soubor∙ po₧adujφ podstatn∞ slo₧it∞jÜφ instalaΦnφ procedury.
Tyto aplikace vy₧adujφ instalaΦnφ programy. K vytvß°enφ instalaΦnφch program∙
je mo₧no pou₧φt nap°. nßstroj InstallShield Express. InstalaΦnφ programy
vytvo°enΘ tφmto nßstrojem provßd∞jφ r∙znΘ ·lohy nutnΘ k instalaci aplikacφ
C++ Builderu, vΦetn∞ kopφrovßnφ spustiteln²ch a dalÜφch pot°ebn²ch soubor∙
na cφlov² poΦφtaΦ, nastavenφ registr∙ Windows a instalovßnφ BDE pro databßzovΘ
aplikace.
Mimo spustitelnΘho souboru, m∙₧e b²t nutno distribuovat
n∞kolik dalÜφch soubor∙. Pokud aplikace pou₧φvß b∞hovΘ balφΦky, pak soubory
t∞chto balφΦk∙ je nutno distribuovat s aplikacφ. S balφΦky zachßzφme stejn∞
jako s DLL, p°ekopφrujeme soubory a nastavφme nutnΘ polo₧ky v registrech
Windows. SystΘmovΘ b∞hovΘ balφΦky je vhodnΘ instalovat do adresß°e Windows\System
(vφce aplikacφ m∙₧e sdφlet stejnΘ balφΦky). Nßmi vytvo°enΘ balφΦky je vhodnΘ
instalovat do stejnΘho adresß°e jako aplikaci. Je nutno distribuovat pouze
soubory BPL balφΦk∙.
JistΘ komponenty C++ Builderu jsou ovladaΦe ActiveX.
Obal t∞chto komponent je sestaven do spustitelnΘho souboru aplikace (nebo
do b∞hov²ch balφΦk∙), ale soubory OCX t∞chto komponent musφ b²t takΘ distribuovßny
s aplikacφ. Jednß se o komponenty: ChartFX, VisualSpeller,
Formula
One, FirstImpression, Graph Custom a InternetovskΘ ovladaΦe
firmy NetMasters.
N∞kterΘ komponenty ze strßnky Win32 Palety komponent
pracujφ spolehliv∞ a₧ s verzφ 4.70 COMCTL32.DLL. Jednß se nap°. o vlastnosti
DisabledImages,
Flat,
HotImages
a Images komponenty
ToolBar. U dalÜφch komponent jsou to
n∞kterΘ jinΘ vlastnosti. Komponenty
TCoolBar a TDateTimePicker
p°ed verzφ 4.70 COMCTL32.DLL nepracovaly v∙bec.
S aplikacφ je takΘ vhodnΘ Üφ°it soubor nßpov∞dy (pokud
existuje).
-
Aplikace p°istupujφcφ k databßzφm po₧adujφ slo₧it∞jÜφ instalaci.
P°φstup k databßzi je Φasto zpracovßvßn samostatn²m modulem p°φstupu k
databßzi (sklßdß se ze soubor∙, kterΘ nemohou b²t sestaveny do spustitelnΘho
souboru aplikace). DatovΘ soubory musφ b²t dostupnΘ z aplikace. VφcevrstvovΘ
databßzovΘ aplikace vy₧adujφ specializovanou instalaci (soubory jsou obvykle
umφst∞ny na vφce poΦφtaΦφch).
P°φstup k databßzi pro aplikaci je provßd∞n r∙zn²mi moduly
p°φstupu k databßzi. Aplikace m∙₧e pou₧φt BDE nebo moduly p°φstupu k databßzi
dalÜφch firem. Verze Client/Server C++ Builderu takΘ umo₧≥uje p°irozen²
p°φstup k databßzov²m systΘm∙m SQL.
Pro databßzovΘ aplikace, instalaΦnφ program musφ provΘst
instalaci dalÜφch pot°ebn²ch soubor∙ a nastavit pot°ebnΘ registry. TotΘ₧
platφ i pro InternetovskΘ aplikace.
-
P°irozenΘ prost°edφ Windows je ovlivn∞no n∞kolika faktory
zßvisejφcφmi na u₧ivatelsk²ch preferencφch a konfiguraci. Jednß se p°edevÜφm
o:
-
RozliÜenφ obrazovky a pou₧itelnost barev,
-
Pou₧itß pφsma,
-
Verze Windows.
Velikost pracovnφ plochy Windows a poΦet dostupn²ch barev
jsou konfigurovatelnΘ a zßvisφ na instalovanΘm hardware. Tyto atributy
se takΘ mohou liÜit na poΦφtaΦi v²vojß°e a poΦφtaΦi u₧ivatele. Vzhled aplikace
(okno, objekt a velikost pφsma) pro konfigurace poΦφtaΦe s r∙zn²m rozliÜenφm
obrazovky m∙₧e b²t zpracovßno n∞kolika zp∙soby:
-
Aplikaci navrhneme pro nejmenÜφ rozliÜenφ obrazovky (obvykle
640x480) a nespecifikujeme ₧ßdnΘ akce k dynamickΘmu zv∞tÜenφ objekt∙ pro
poΦφtaΦ s v∞tÜφm rozliÜenφm (objekty p°i vyÜÜφm rozliÜenφ jsou menÜφ).
-
Nßvrh provedeme pro libovolnΘ rozliÜenφ a za b∞hu dynamicky
zm∞nφme velikost vÜech formulß°∙ a objekt∙ podle zm∞ny rozliÜenφ (je takΘ
mo₧no m∞nit pouze velikost formulß°e).
ProblΘmy pou₧itΘho pφsma je nutno °eÜit tak, ₧e p°edpoklßdßme
standardnφ pφsma na vÜech poΦφtaΦφch a p°i pou₧itφ nestandardnφho pφsma,
tato pφsma distribuujeme s aplikacφ.
Kdy₧ pou₧φvßme funkce Windows API nebo zp°φstup≥ujeme
oblasti operaΦnφho systΘmu, pak je mo₧nΘ, ₧e n∞kterΘ funkce nemusφ b²t
dostupnΘ na poΦφtaΦφch s jinou verzφ operaΦnφho systΘmu. Nap°. Slu₧by jsou
pou₧itelnΘ pouze pro operaΦnφ systΘm Windows NT. Verzφ operaΦnφho systΘmu
se takΘ p°i Üφ°enφ naÜich program∙ musφme zab²vat. Je nutno alespo≥ specifikovat
po₧adavky na operaΦnφ systΘm, p°φpadn∞ nedovolit instalaΦnφmu programu
instalaci na poΦφtaΦ s nevyhovujφcφm systΘmem.