Doplnění kódu obslužných funkcí

Přehled informací

Přípravná fáze

Než začneme doplňovat kód obslužných funkcí musíme na začátek souboru ZadaniDialog.cpp vložit hlavičkové soubory , abychom mohli využívat v nich deklarované funkce:

  #include "stdafx.h"
  #include "resource.h"
  #include "ZadaniDialog.h"
  #include "reagujiciDialog.h"
  #include <dbents.h>

Dále nám zbývá doplnit kód následujících členských funkcí třídy CZadaniDialog:

Funkce ZobrazBod()

Funkce zobrazí v editovacích polích jednotlivé souřadnice středu kružnice. Souřadnice jsou získány z pomocných proměnných typu CString.

  void CZadaniDialog::ZobrazBod()
  { // zobrazení hodnoty souřadnic bodu, uložených v proměnných
    m_ctrlEditX.SetWindowText(m_strXBod);
        m_ctrlEditX.Convert();
    m_ctrlEditY.SetWindowText(m_strYBod);
        m_ctrlEditY.Convert();
    m_ctrlEditZ.SetWindowText(m_strZBod);
        m_ctrlEditZ.Convert();
  }

Funkce ZobrazPolomer()

Funkce zobrazí v editovacím poli poloměr kružnice. Poloměr je získán z pomocné proměnné typu CString.

  void CZadaniDialog::ZobrazPolomer()
  { // zobrazení hodnoty souřadnic bodu, uložených v proměnných
    m_ctrlEditPolomer.SetWindowText(m_strPolomer);
    m_ctrlEditPolomer.Convert();
  }

Funkce OnInitDialog()

Funkce je vyvolána při inicializaci dialogu. Ve funkci jsou nastaveny rozsahy platných hodnot pro dialogové prvky. V případě překročení rozsahu dojde k jeho opravení na standartní hodnotu. Je-li aplikace vyvolána vícekrát, jsou v ní zobrazeny hodnoty z předešlého vyvolání (hodnoty jsou získány z registrů, kde jsou uloženy). Na konec funkce OnInitDialog jsou zavolány funkce pro zobrazení hodnot v prvcích dialogu (ZobrazBod a ZobrazPolomer).

  BOOL CZadaniDialog::OnInitDialog() 
  { // inicializace dialogu
    SetDialogName("reagujiciDialog:ZadaniDialog");

    CAcUiDialog::OnInitDialog();
    
    // nastavení rozsahu hodnot prvků dialogu
    m_ctrlEditX.SetRange(-1000.0, 1000.0);
    m_ctrlEditY.SetRange(-1000.0, 1000.0);
    m_ctrlEditZ.SetRange(-1000.0, 1000.0);
    m_ctrlEditPolomer.SetRange(0.0, 1000.0);

    // přiřazení titulku dialogu
    SetWindowText("Reagující dialog");

    // získání a zobrazení dat z registrů
    if (!GetDialogData("Polomer", m_strPolomer))
        m_strPolomer = "1.0";
    if (!GetDialogData("BODX", m_strXBod))
        m_strXBod = "0.0";
    if (!GetDialogData("BODY", m_strYBod))
        m_strYBod = "0.0";
    if (!GetDialogData("BODZ", m_strZBod))
        m_strZBod = "0.0";

    ZobrazBod();	// zobrazení hodnot souřadnic
    ZobrazPolomer();	// a poloměru
    
    return TRUE;
  }

Funkce OnButtonBod()

Funkce OnButtonBod je vyvolána při stisknutí tlačítka Zadej Bod. Funkce musí zajistit skrytí dialogu, aby bylo možné pohodlně zadat bod středu kružnice. Skrytí dialogu se uskuteční pomocí tří funkcí:

Je-li funkce vyvolána, je skryt dialog a zavolána funkce pro získání souřadnic bodu. Jsou-li souřadnice zadány v pořádku je dialog znovu ukázán, do pomocných proměnných jsou přiřazeny jednotlivé souřadnice středu a je zavolána funkce pro zobrazení jednotlivých souřadnic v odpovídajících editovacích polích. V opačném případě je příkaz zrušen příkazem CancelEditorCommand().

  void CZadaniDialog::OnButtonBod() 
  {
    // skrytí dialogu a předání řízení editoru AutoCAD
    BeginEditorCommand();
    // deklarace proměnné typu bod
    ads_point bod;
    // získání bodu
    if (acedGetPoint(NULL, "\nZadej bod: ", bod) == RTNORM)
    {
      // je-li bod zadán vpořádku dokonči příkaz v editoru
      CompleteEditorCommand();
      m_strXBod.Format("%g", bod[X]);
      m_strYBod.Format("%g", bod[Y]);
      m_strZBod.Format("%g", bod[Z]);
      ZobrazBod();
    }
    else
    {
      // v opačném případě zruš příkaz
      CancelEditorCommand();
    }
  }

Funkce OnKillfocusEditX()

Funkce je vyvolána při změně v editovacím poli x-ové souřadnice. Funkce nejprve přečte hodnotu z textového pole, následně ji zkontroluje, zda je zadaná hodnota platná. Pokud je zadaná hodnota mimo rozsah, hodnota je opravena na inicializační hodnotu, která je poté znovu zobrazena.

  void CZadaniDialog::OnKillfocusEditX() 
  {
    // získání hodnoty z textového pole
    m_ctrlEditX.Convert();
    m_ctrlEditX.GetWindowText(m_strXBod);
    // kontrola správnosti zadané hodnoty a případná oprava
    if (!m_ctrlEditX.Validate())
    {
      m_strXBod = "1";
      ZobrazBod();
    }
  }

Funkce OnKillfocusEditY()

Funkce je vyvolána při změně v editovacím poli y-ové souřadnice. Funkce nejprve přečte hodnotu z textového pole, následně ji zkontroluje, zda je zadaná hodnota platná. Pokud je zadaná hodnota mimo rozsah, hodnota je opravena na inicializační hodnotu, která je poté znovu zobrazena.

  void CZadaniDialog::OnKillfocusEditY() 
  {
    // získání hodnoty z textového pole
    m_ctrlEditY.Convert();
    m_ctrlEditY.GetWindowText(m_strYBod);
    // kontrola správnosti zadané hodnoty a případná oprava
    if (!m_ctrlEditY.Validate())
    {
      m_strYBod = "1";
      ZobrazBod();
    }
  }

Funkce OnKillfocusEditZ()

Funkce je vyvolána při změně v editovacím poli z-ové souřadnice. Funkce nejprve přečte hodnotu z textového pole, následně ji zkontroluje, zda je zadaná hodnota platná. Pokud je zadaná hodnota mimo rozsah, hodnota je opravena na inicializační hodnotu, která je poté znovu zobrazena.

  void CZadaniDialog::OnKillfocusEditZ() 
  {
    // získání hodnoty z textového pole
    m_ctrlEditZ.Convert();
    m_ctrlEditZ.GetWindowText(m_strZBod);
    // kontrola správnosti zadané hodnoty a případná oprava
    if (!m_ctrlEditZ.Validate())
    {
      m_strZBod = "1";
      ZobrazBod();
    }
  }

Funkce OnKillfocusEditPolomer()

Funkce je vyvolána při změně v editovacím poli Polomer. Funkce nejprve přečte hodnotu z textového pole, následně ji zkontroluje, zda je zadaná hodnota platná. Pokud je zadaná hodnota mimo rozsah, hodnota je opravena na inicializační hodnotu, která je poté znovu zobrazena.

  void CZadaniDialog::OnKillfocusEditPolomer() 
  {
    // získání hodnoty z textového pole
    m_ctrlEditPolomer.Convert();
    m_ctrlEditPolomer.GetWindowText(m_strPolomer);
    // kontrola správnosti zadané hodnoty a případná oprava
    if (!m_ctrlEditPolomer.Validate())
    {
      m_strPolomer = "1";
      ZobrazPolomer();
    }
  }

Funkce OnOk()

Funkce je vyvolání při zmáčknutí tlačítka Vložit. Po jejím vyvolání jsou nejprve hodnoty z editovacích polí uloženy do registů pomocí funkce SetDialogData(). Dále jsou ve funkci vytvořeny tři pomocné proměnné:

Do proměnné střed přiřadíme jednotlivé souřadnice středu z proměnných m_strXBod, m_strYBod, m_strZBod. Hodnoty musíme převést z typu řetězec na typ reálné číslo. Do proměnné polomer převedeme hodnotu poloměru z proměnné m_strPolomer.

Následuje blok kódu, v kterém přidáme do modelového prostoru výkresu novou entitu typu kružnice. Nejprve si vytvoříme nový objekt kružnice. Otestujeme jestli je nový objekt vytvořený.

Dále si musíme vytvořit proměnné pro ukazatele na tabulku bloků, na záznam tabulky bloků a proměnou pro uložení ID objektu kružnice. Poté musíme otevřít tabulku bloků výkresu pro čtení. Pomocí tabulky bloků otevřeme záznam modelový prostor a uložíme si ukazatel na něj. Jakmile máme ukazatel na modelový prostor můžeme zavřít tabulku bloků. Do modelového prostoru přidáme novou kružnici a uložíme si ukazatel na ni. Zavřeme záznam modelový prostor. Zavřeme objekt kružnice.

  void CZadaniDialog::OnOK() 
  {
    CAcUiDialog::OnOK();

    // uložení dat z dialogu do registrů
    SetDialogData("POLOMER", m_strPolomer);
    SetDialogData("BODX", m_strXBod);
    SetDialogData("BODY", m_strYBod);
    SetDialogData("BODZ", m_strZBod);

    double polomer;			// poloměr kružnice
    AcGePoint3d center;		// střed kružnice
    AcGeVector3d normal(0.0, 0.0, 1.0);	// normálový vektor

    acdbDisToF(m_strXBod, 2, ¢er[X]);
        // převedení řetězce z dialogového prvku na číslo
    acdbDisToF(m_strYBod, 2, ¢er[Y]);
        // převedení řetězce z dialogového prvku na číslo
    acdbDisToF(m_strZBod, 2, ¢er[Z]);
        // převedení řetězce z dialogového prvku na číslo
    acdbDisToF(m_strPolomer, 2, &polomer);
        // převedení řetězce z dialogového prvku na číslo

    // vytvoření nové kružnice
    AcDbCircle* pKruh = new AcDbCircle(center, normal, polomer);

    if (!pKruh)
    {
      acedAlert("Málo paměti pro vytvoření kružnice!");
    }

    AcDbBlockTable *pBlockTable;
      // vytvoření ukazatele na objekt AcDbBlockTable
    AcDbBlockTableRecord *pZaznamBlockTable;
      // vytvoření ukazatele na objekt AcDbBlockTableRecord
    AcDbObjectId IDKruh;
      // vytvoření proměnné pro uchování ID Kruhu

    acdbHostApplicationServices()->workingDatabase()
         ->getBlockTable(pBlockTable, AcDb::kForRead);
      // otevření tabulky bloků výkresu pro čtení
      // a předání ukazatele na ní

    pBlockTable->getAt(ACDB_MODEL_SPACE, 
                       pZaznamBlockTable, AcDb::kForWrite);
      // otevření záznamu tabulky bloků výkresu pro zápis 
      // a předání ukazatele na ní
    pBlockTable->close();       // zavření tabulky bloků

    pZaznamBlockTable->appendAcDbEntity(IDKruh, pKruh);
      // přidání entity čára do modelového prostoru

    pZaznamBlockTable->close();
                       // uzavření modelového prostoru
    pKruh->close();    // uzavření objektu čára
  }

Zdrojový kód projektu

Zdrojový kód projektu je možné nahrát v zabaleném souboru reagujiciDialog.zip. Nahraný kód musíte rozbalit a ve vývojovém prostředí Visual C++ otevřít soubor pracovního prostoru nebo projektu (reagujiciDialog.dsw nebo reagujiciDialog.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++.