28. Zprßvy Windows II
  1. 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.

  2. 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.
  3. 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.
  4. 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).

  5. 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).
  6. 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).

  7. 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.
  8. 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:
  9. 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: 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.
28. Zprßvy Windows II