Vytvoření kostry programu

Přehled informací

Postup tvorby aplikace

Pomocník nám vygeneroval kostru aplikace. V kostře aplikace je již inicializovaná podpora knihovny MFC:

  // definice prostého rozšíření modulu objektu
  AC_IMPLEMENT_EXTENSION_MODULE(ReagujiciDialogDLL);
  // DLL Entry Point
  extern "C"
  BOOL WINAPI DllMain(HINSTANCE hInstance,
                      DWORD dwReason, LPVOID /*lpReserved*/)
  {
    if (dwReason == DLL_PROCESS_ATTACH)
    {
      // inicializace rozšíření Extension DLL
      ReagujiciDialogDLL.AttachInstance(hInstance);
      InitAcUiDLL();
    } 
    else if (dwReason == DLL_PROCESS_DETACH) 
         {
           // ukončení knihoven před ukončením
           ReagujiciDialogDLL.DetachInstance();
         }
    return TRUE;    // ok
  }

Také je již připravena vstupní funkce pro AutoCAD acrxEntryPoint:

  // ObjectARX EntryPoint
  extern "C" AcRx::AppRetCode 
  acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
  {
    switch (msg) {
      case AcRx::kInitAppMsg:
        // odemknutí aplikace, aby ji bylo možné odstranit z paměti
        acrxDynamicLinker->unlockApplication(pkt);
        acrxDynamicLinker->registerAppMDIAware(pkt);
        InitApplication();    // volání funkce inicializace
        break;
      case AcRx::kUnloadAppMsg:
        UnloadApplication();  // volání funkce odstranění
        break;
    }
    return AcRx::kRetOK;
  }

Do aplikace tedy stačí doplnit pouze:

Vytvoření nového dialogového okna pomocí App Studia

Vytvořte nový dialogový prvek pomocí App Studia. Pokud neznáte postup prostudujte si lekci Tvorba uživatelského rozhraní. Nový prvek by měl vypadat přibližně následujícím způsobem:

ID označení a typ jednotlivých prvků:

Ostatní označení prvků dialogu není důležité (v programu ho nevyužíváme). Po dokončení tvorby dialogového okna nad ním dvakrát klikněte myší, zobrazí se okno Adding a Class pomocníka tříd (viz obrázek).

V okně jsme dotazování jestli požadujeme vytvořit novou třídu pro dialog. V dialogovém okně Adding a Class zatrhněte: "Create a new class" a zmáčkneme tlačítko OK. Otevře se druhé okno pomocníka.

Do okna zadejte:

Class Wizard vytvoří soubor se jménem ZadaniDialog.cpp a ZadaniDialog.h, v kterých bude uložena definice třídy dialogu. Otevře se okno MFC Class Wizard, které prozatím zavřeme.

Vytvoření hlavičkového souboru reagujiciDialog.h

Vytvoříme soubor, který bude obsahovat deklarace funkcí, které budeme používat v naší aplikaci. Zatím zde dopíšeme pouze deklaraci funkce vytvorDialg(). Soubor přidáme do projektu následujícím postupem:

  #include "resource.h" // přidání hlavičkového souboru zdrojů
  void vytvorDialog();  // deklarace hlavičky funkce 
                        // pro vytvoření dialogu

Vložení hlavičkových souborů do souboru reagujiciDialog.cpp

Na začátek souboru reagujiciDialog.cpp musíme vložit hlavičkové soubory , abychom mohli využívat v nich deklarované funkce:

  #include "AcExtensionModule.h"
  #include "ZadaniDialog.h"
  #include "reagujiciDialog.h"

Doplnění kódu inicializační funkce

Každá aplikace nahraná do AutoCADu musí registrovat příkazy, které definuje, v AutoCADu. Pokud bychom příkazy neregistrovali, nedali by se v AutoCADu vyvolat. Registrace příkazů se uvádí v části funkce acrxEntryPoint vyvolané zprávou kInitAppMsg poslanou AutoCADem do aplikace ObjectARX. V našem příkladě je při inicializaci vyvolaná funkce InitApplication(). Doplníme tedy do ní kód pro inicializaci nového příkazu v AutoCADu:

  // inicializace aplikace, zaregistrování
  void InitApplication()
  {
    // zaregistrování nového příkazu
    acedRegCmds->addCommand("Skupina_dialog", 
                    "createDialog", 
                    "zadejHodnoty", 
                    ACRX_CMD_MODAL, 
                    vytvorDialog,
                    NULL,
                    -1,
                    ReagujiciDialogDLL.ModuleResourceInstance());
    
    // vypsání informaci jak spustit aplikaci
    ads_printf( "\nAplikaci spustíte příkazem\"zadejHodnoty\".\n" );		
  }

Ve funkci použijeme k registraci příkazu funkci addComand. Nakonec funkce je příkaz pro vytisknutí informací o způsobu spuštění programu.

Doplnění kódu části zavolané při ukončení programu

Aplikace ObjectARX, musí po dokončení své činnosti (při odstranění z AutoCADu) odstranit všechny příkazy a třídy, které během své činnosti v AutoCADu vytvořila. Naše aplikace přidala do AutoCADu pouze nový příkaz, proto stačí odstranit pouze tento příkaz, případně celou skupinu příkazů. K tomuto účelu slouží funkce pro odstranění skupiny příkazů removeGroup. Do aplikace doplníme následující kód funkce UnloadApplication():

  // uvolnění aplikace, odregistrování
  void UnloadApplication()
  {
    // odstranění skupiny příkazů
    acedRegCmds->removeGroup("Skupina_dialog");  
  }

Doplnění kódu funkce vytvářející dialog

Kód funkce vytvorDialog() nejprve vytvoří lokální kopii instance CAcModuleResourceOverride (přepíná mezi aktuálním a modulovým prostředkem. Když je vytvořen nový objekt, je nastaven nový prostředek zdroje. Po odstranění je přepnuto opět na původní zdroj). Dále vytvoří nový objekt pomocí konstruktoru dialogu. Nakonec funkce zobrazí dialgové okno jako modální:

  // Vyvolání dialogu
  void vytvorDialog()
  {
    // Při nahrání prostředku z této aplikace ARX
    // vytvoří se lokální instance CAcModuleResourceOverride
    CAcModuleResourceOverride resOverride;
    // vytvářený dialog bude typu modalní dialog
    CZadaniDialog dlg(CWnd::FromHandle(adsw_acadMainWnd()));
                      // vytvoření nového dialogu
    dlg.DoModal();    // nahraje a zobrazí dialog jako modální
  }

Odzkoušení kostry aplikace

V tuto chvíli máme vytvořenou kostru nové aplikace. Aplikaci můžeme zkusit přeložit (ve VC++) a spustit (v AutoCADu). Po spuštění se nám zobrazí prázdný dialog. Dialog bude reagovat pouze na tlačítka Vložit a Cancel. Tlačítko Vložit nevloží žádný obrazec pouze zavře, stejně jako tlačítko Cancel, dialog.