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ř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ří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
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"
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.
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"); }
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í }
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.