Kurz IDE Visual C++ (3.)


V tΘto lekci najdete nßvod, jak vytvo°it aplikaci pro kurz DirectDraw a najdete zde popis okna obsahujφcφ ClassView, ResourceView a FileView.

3.1. Projekt pro DirectDraw

Nejd°φve si vytvo°φme standardnφ aplikaci podle MFC AppWizardu. Z menu File vyberte New. V dialogu zvolte nßsledujφcφ polo₧ky:



Na dalÜφm dialogu zvolte volbu Single Document a odÜkrtn∞te polφΦko Document/View architecture support takto:



Na dialogu Φ. 2 a 3 nechte vÜe tak jak je. Na dalÜφm, ΦtvrtΘm, dialogu odÜkrtn∞te vÜechny polφΦka takto:



Zbytek Wizardu odklikejte a dokonΦete projekt.

Rozbalte ClassView a uvidφte vÜechny vytvo°enΘ t°φdy:



Nynφ ka₧dou t°φdu n∞jak²m zp∙sobem upravφme tak, aby vyhovovala naÜim po₧adavk∙m.

  • CAboutDlg
    Poklepejte v ClassView na tuto t°φdu. V pravΘm okn∞ se otev°e soubor, kde je umφst∞na jak deklarace tak i implementace. Sma₧te obojφ: deklaraci i implementaci. T°φda by vßm m∞la ·pln∞ zmizet z ClassView.

  • CChildView
    P°epn∞te na kartu FileView:



    OznaΦte soubory ChildView.cpp a ChildView.h a sma₧te je. T°φda CChildView vßm zmizφ z ClassView.

  • CDirectDrawApp
    Nejprve poklepejte na jmΘno t°φdy a vyma₧te z deklarace t°φdy CDirectDrawApp tento °ßdek:
    afx_msg void OnAppAbout();

    Pak poklepejte na funkci InitInstance(). Tφm se dostanete do souboru DirectDraw.cpp. Najd∞te Message map na zaΦßtku souboru a vyma₧te nßsledujφcφ °ßdek:
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

    Dßle p°idejte Φlenskou funkci WinInit() a virtußlnφ funkci Run().
    Klin∞te prav²m tlaΦφtkem na jmΘno t°φdy CDirectDrawApp. Rozbalφ se vßm nßsledujφcφ menu:



    Za prvΘ vyberte polo₧ku Add member function.... Nßsledujφcφ dialog vypl≥te zhruba takto:



    za druhΘ vyberte polo₧ku Add virtual function.... Na dialogu oznaΦte funkci Run() a stiskn∞te tlaΦφtko Add and edit.



    Tφm jste p°idali dv∞ ΦlenskΘ funkce Run() a WinInit(). Nynφ napiÜte t∞lo funkce WinInit():

    HRESULT CDirectDrawApp::WinInit()
    {
      WNDCLASSEX wc;
      CBrush brBack;
      HWND hWnd = NULL;
      brBack.CreateSolidBrush(RGB(0, 0, 0));
       // Register the Window Class
      wc.cbSize = sizeof(WNDCLASSEX);
      wc.lpszClassName = "DD Class";
      wc.lpfnWndProc = MainWndProc;
      wc.style = CS_VREDRAW | CS_HREDRAW;
      wc.hInstance = m_hInstance;
      wc.hIcon = LoadIcon(IDI_DD);
      wc.hCursor = NULL;
      wc.hbrBackground = brBack;
      wc.lpszMenuName = NULL;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hIconSm = LoadIcon(IDI_DD);
      //register window class
      if( RegisterClassEx( &wc ) != 0 ) {
        m_pMainWnd = new CFrameWnd;
        if(m_pMainWnd->CreateEx(0, "DD Class", "DirectDraw", WS_POPUP,
                                    CRect(0, 0, 800, 600), NULL, NULL)) {
          m_pMainWnd->ShowWindow(SW_SHOW);
          m_pMainWnd->UpdateWindow();
        }
        else {
          return 1;
        }
      }
      else {
        return 1;
      }

      return 0;
    }

    Funkce vracφ hodnotu 0, pokud je ·sp∞Ünß, v opaΦnΘm p°φpad∞ vrßtφ 1. Musφte p°idat ikonu do zdroj∙ vaÜeho projektu. Identifikßtor ikony bude IDI_DD a je celkem jedno, jak bude ikona vypadat, proto₧e nebude vid∞t. StaΦφ, kdy₧ p°ejmenujete stßvajφcφ ikonu IDR_MAINFRAME.

    DalÜφ velice d∙le₧itou v∞cφ je deklarace procedury okna. Tato procedura musφ b²t deklarovßna v hlaviΦkovΘm souboru DirectDraw.h takto:
      LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );

    PotΘ p°idejete t∞lo funkce do implementaΦnφho souboru DirectDraw.cpp. T∞lo prozatφm bude vypadat nßsledovn∞:
    LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }


    Dßle upravφme funkci InitInstance(). U₧ nechceme ₧ßdnΘ okno t°φdy CMainFrame, ale vlastnφ, kterΘ jsme vytvo°ili ve funkci WinInit(), tak₧e upravte funkci takto:

    BOOL CDirectDrawApp::InitInstance()
    {
      if(0 == WinInit()) {

        return TRUE;
      }

      return FALSE;
    }

    Nakonec sma₧te °ßdek:
    #include "MainFrm.h"
    ze souboru DirectDraw.cpp.

  • CMainFrame
    Odstra≥te hlaviΦkov² i implemntaΦnφ soubor tΘto t°φdy z FileView. Op∞t tato t°φda zmizφ z ClassView.

Otev°ete si Pr∙zkumnφka, najd∞te adresß° vaÜeho projektu a sma₧te nßsledujφcφ soubory: MainFrm.h, MainFrm.cpp, ChildView.h a ChildView.cpp. Nynφ spus¥t∞ ClassWizard z menu View. Okno ClassWizardu vypadß takto:



Vyberte t°φdu CAboutDlg z menu Class name. CW vßs upozornφ, ₧e t°φda neexistuje. Stiskn∞te OK a v nßsledujφcφm dialogu stiskn∞te tlaΦφtko Remove. Tak donutφme CW, aby si t°φdu vymazal ze svΘ databßze.



Tento postup prove∩te pro zb²vajφcφ odstran∞nΘ t°φdy CMainFrame a CChildView. A₧ vßm v menu zbyde pouze t°φda CDirectDrawApp stiskn∞te OK.

ClassView by m∞lo vypadat n∞jak takto:



A₧ do te∩ jsme pouze mazali, od te∩ u₧ budeme jen p°idßvat.

Vlo₧te t°φdu CControl. Z menu Insert zvolte New class.... Objevφ se vßm nßsledujφcφ dialog.



V ClassView se objevφ novß t°φda CControl. Do tΘto t°φdy p°idejte Φlenskou funkci DDInit(). Funkce mß nßsledujφcφ prototyp:
HRESULT DDInit(HWND hWnd);

Modifikujte tuto funkci dle nßvodu z druhΘho kurzu.

Vra¥me se ke t°φd∞ CDirectDrawApp. Do hlaviΦkovΘho souboru tΘto t°φdy vlo₧te hlaviΦkov² soubor control.h a vlo₧te Φlenskou prom∞nnou m_theControl typu CControl. Funkci InitInstance() pak upravte tak, aby volala funkci DDInit() t°φdy CControl a inicializovala systΘm DirectDraw.

Tak a to je vÜe. Pokud vÜechny ·pravy provedete sprßvn∞ a p°idßte k≤d z druhΘho kurzu, aplikace p∙jde spustit. Po spuÜt∞nφ se p°epne rozliÜenφ, ale bude vid∞t pouze bφlß plocha okna. Vytvo°en² projekt si m∙₧ete stßhnout v sekci Downloads.

3.2. ClassView, ResourceView a FileView

Jak u₧ nßzev napovφdß, jednß se o jakΘsi pohledy na vßÜ projekt. Ka₧d² pohled se programßtorovi hodφ na n∞co jinΘho.

  • ClassView pohlφ₧φ na vßÜ projekt ze strany objektovΘho programovßnφ, proto₧e vidφte t°φdy, ΦlenskΘ funkce a atributy jednotliv²ch t°φd. Tento pohled se hodφ pro p°φstup k jednotliv²m funkcφm.

  • ResourceView pohlφ₧φ na projekt z pohledu zdroj∙ tzn. ikon, kurzor∙ nebo bitmap. D∙le₧itΘ je, ₧e tento pohled je mo₧n² jen v projektech MFC. Zde m∙₧ete p°idßvat r∙znΘ zdroje pro vßÜ projekt. Tyto zdroje budou ulo₧eny v budoucφm .exe souboru, tak₧e pokud to p°e₧enete, bude i vßÜ program p°ehnan∞ velk². Nap°φklad bitmapy je lepÜφ naΦφtat z externφch soubor∙, proto₧e b²vajφ v∞tÜφ.

  • FileView je Φasto pou₧φvan²m pohledem, proto₧e vßm umo₧nφ p°φstup k jednotliv²m soubor∙m projektu. FileView je prakticky rozd∞len na n∞kolik adresß°∙ podle typu souboru. Pokud chcete p°idat nebo vyjmout soubor z projektu, m∙₧ete to ud∞lat prßv∞ pomocφ FileView. Ostatnφ pohledy na zm∞ny ve FileView okam₧it∞ reagujφ.

Nynφ si jednotlivΘ pohledy rozebereme trochu podrobn∞ji.
3.2.1. ClassView

ClassView vypadß n∞jak takto:



Vidφte t°φdy CControl a CDirectDrawApp a jejich ΦlenskΘ funkce a prom∞nnΘ. V adresß°i Globals jsou globßlnφ prvky projektu (funkce i prom∞nnΘ).

U pohled∙ Φasto pou₧φvßme kontextovΘ menu. I ClassView mß svΘ kontextovΘ menu, kterΘ pou₧φvßme pro upravu t°φd. V₧dy upravujete tu t°φdu, na kterou jste klepli prav²m tlaΦφtkem.
KontextovΘ menu vypadß takto:



  • Go to definition - p°ejde na deklaraci t°φdy tzn. ke klφΦovΘmu slovu class v hlaviΦkovΘm souboru t°φdy. Stejnou funkci provedete poklepanφm na jmΘno t°φdy.

  • Add member Function... - p°idß Φlenskou funkci do t°φdy. Zobrazφ se tento dialog:



    Vyplnφte nßvratovou hodnotu (Function type), jmΘno (Function declaration) a p°φstupovΘ prßva funkce (Access). Dßle m∙₧ete zvolit, zda-li je danß funkce virtualnφ (virtual) Φi statickß (static). Po stisknutφ tlaΦφtka OK se do deklarace t°φdy p°idß deklarace funkce a v implementaΦnφm souboru se vytvo°φ prßzdnΘ t∞lo funkce.

  • Add member Variable... - p°idß Φlenskou prom∞nnou. Princip je stejn² jako u funkce.

  • Add virtual Function... - p°idß virtußlnφ funkci t°φdy MFC. Pokud je t°φda odvozenß od n∞jakΘ MFC t°φdy m∞la by mφt tato t°φda k dispozici tuto volbu pro p°idßnφ virtußlnφch funkcφ, kterΘ lze takto p°etφ₧it.

  • Add Window Message Handler... - p°idß obslu₧nou funkci pro smyΦku zprßv. Op∞t je tato polo₧ka p°φstupnß jek pokud pracujete s MFC t°φdou. Funkce je p°idßna do t°φdy (do specißlnφho bloku v deklaraci t°φdy), dßle je p°idßn odkaz v Map∞ zprßv (Message map) a samoz°ejm∞ vytvo°φ t∞lo funkce, kterΘ v∞tÜinou obsahuje jeden Φi dva °ßdky.

    Ostatnφ polo₧ky jsou pro nßs celkem nepodstatnΘ.
Pokud vyvolßte kontextovΘ menu u funkce Φi prom∞nnΘ, zjistφte, ₧e nenφ ·pln∞ stejnΘ jako u t°φdy. Nap°φklad funkci takto m∙₧ete smazat, pak je deklarace funkce smazßna a t∞lo funkce je zakomentovßno.
3.2.2. ResourceView

ResourceView vypadß n∞jak takto:



Vidφte vÜechny zdroje, kterΘ pou₧φvß vßÜ projekt prakticky rozt°φd∞nΘ podle typu (nap°. ikony, bitmapy nebo kurzory). ResourceView umo₧≥uje importovat existujicφ soubory nebo vytvß°et vlastnφ. Pokud p°idßvßte n∞jaky standardnφ typ jako t°eba soubor .bmp, ResourceView ho automaticky vlo₧φ to adresß°e Bitmap. Pokud se pokusφte importovat nestandarnφ zdroj jak²m je i zvukov² soubor .wav, budete po₧ßdßni o vytvo°enφ zcela novΘho adresß°e. V ResourceView mu₧ete zdroje upravovat, ale jen omezen∞, proto₧e nap°φklad internφ bitmapov² editor nedokß₧e zobrazit bitmapu, kterΘ mß vφce jak 256 barev.

Ka₧dΘmu zdroji p°i°azujete unikßtnφ (pouze ve vaÜem projektu) ID Φili identifikßtor, kter² je pak pou₧φvßn v programu. VÜechny id jsou definovßny v souboru resource.h a informace o samotn²ch zdrojφch je ulo₧ena v souboru s p°φponou .rc.

Jak u₧ bylo zmφn∞no v²Üe, ResourceView je dostupn² pouze z projekt∙ MFC, jinak se zdroje musφ vklßdat zvenΦφ a ruΦn∞. Toto je dalÜφ v²hoda MFC. Na druhou stranu vßm tento systΘm m∙₧e p°inΘst °adu nep°φjemnostφ, proto₧e tak m∙₧ete snadno a rychle vytvo°it v²sledn² program velik² a tφm i pomal². DoporuΦuji vklßdat do zdroj∙ pouze soubory malΘ jako jsou ikony nebo kurzory a zdroje, kterΘ jinak vlo₧it nejdou anebo jdou, ale s mnohem v∞tÜφm usilφm. Rozhodn∞ bitmapy naΦφtejte z externφch soubor∙.

3.2.3. FileView

FileView vypadß n∞jak takto:



Vidφte adresß° Header Files, kter² obsahuje hlaviΦkovΘ soubory vaÜeho projektu. Dßle vidφte adresß° Source Files, kter² obsahuje implementaΦnφ soubory s p°φponou .cpp. Adresß° Resource Files obsahuje soubory, kterΘ souvisφ se zdroji (nap°φklad obsahuje soubor *.rc, kter² byl popsßn v²Üe).

P°es FileView m∙₧ete vklßdat konkrΘtnφ soubory do vaÜeho projektu. M∙₧ete je samoz°ejm∞ mazat Φi editovat.

T°φdy, zdroje a soubory m∙₧ete vklßdat i p°es menu. T°φdu vlo₧φte p°φkazem New Class... z menu Insert. Stejn∞ tak vlo₧φte i zdroj p°φkazem Resource... z menu Insert. Soubory do projektu vklßdßte p°es menu Project a Add to project. Zde m∙₧ete vlo₧it bu∩to ΦistΘ soubory (New...) anebo soubory vytvo°enΘ p°edem(Files...).

Ji°φ Formßnek