Napsání kódu 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(JednoduchyDialogDLL);
  // DLL Entry Point
  extern "C"
  BOOL WINAPI DllMain(HINSTANCE hInstance, 
                      DWORD dwReason, LPVOID /*lpReserved*/)
  {
    if (dwReason == DLL_PROCESS_ATTACH)
    {
      // inicializace MFC rozšíření Extension DLL
      JednoduchyDialogDLL.AttachInstance(hInstance);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
         {
           // ukončení MFC knihoven před ukončením
           JednoduchyDialogDLL.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 (na obrázku jsou uvedeny i jednotlivé ID prvků dialogu):

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í zda 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 jednDialog.cpp a jednDialog.h, v kterých bude uložena definice třídy dialogu. Class Wizard doplní i základní kód pro obsluhu tlačítek, proto v našem prvním příkladě nemusíme dopisovat žádný obslužný kód tlačítek.

Přidání hlavičkového souboru dialogu do hlavního programu

Na začátek souboru, za deklaraci funkcí InitApplication a UnloadApplication, doplníme deklaraci funkce, která bude vytvářet objekt nového dialogu:

  void vytvorDialog();

Doplnění hlavičky funkce definující dialogové okno

Na začátek souboru, za deklaraci funkcí InitApplication a UnloadApplication, doplníme deklaraci funkce, která bude vytvářet objekt nového dialogu:

  void vytvorDialog();

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("Dialogy", "_showDialog", "zobrazDialog",
                            ACRX_CMD_MODAL, vytvorDialog);

    // zobrazení informace jak spustit aplikaci
    ads_printf( "\nAplikaci spustíte příkazem\"zobrazDialog\" .\n" );
  }

Ve funkci použijeme k registraci příkazu funkci addComand. Jak jsme uvedli v předešlém příkladě, vytiskneme při inicializaci funkce, do příkazového řádku informaci, jakým způsobem spustit nahranou aplikaci.

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( "Dialogy" );
  }

Doplnění kódu funkce vytvářející nové dialogové okno

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í:

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

Zdrojový kód procedury

Zdrojový kód projektu je možné nahrát v zabaleném souboru jednoduchyDialog.zip. Nahraný kód musíte rozbalit a ve vývojovém prostředí Visual C++ otevřít soubor pracovního prostoru nebo projektu (vykresleniKruhu.dsw nebo vykresleniKruhu.dsp). Visual C++ poté načte celý projekt.

Doporučujeme Vám vyzkoušet si alespoň tvorbu projektu pomocí pomocníka a napsání několika řádek kódu, abyste poznali vývojové pomůcky prostředí Visual C++.