home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / dynamix / dynamix.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-12  |  8.3 KB  |  303 lines

  1. /* ************************************ **
  2.  * Name: dynamix.cpp
  3.  *       Beispiel für dynamische (zur
  4.  *       laufzeit erzeugte) Dialogboxen.
  5.  *       Zum compilieren des Beispieles:
  6.  *       1. anlegen eines neuen Projektes
  7.  *          mit c++ Lauzeitsupport und
  8.  *          windows 3.1 exe template
  9.  *       2. hinzufügen der folgenden files
  10.  *          - dynamix.def
  11.  *          - pre.cpp
  12.  *          - dynamix.cpp
  13.  *          - dynamix.rc
  14.  *          Dabei sollte pre.cpp "to top
  15.  *          of list" angegeben werden.
  16.  *       3. ändern der compileroptionen
  17.  *          auf "large model"; weiterhin
  18.  *          "use precompiled headers"
  19.  *          anwählen und als zu verwenden-
  20.  *          des headerfile "afxcoll.h"
  21.  *          angeben.
  22.  * Update:  12-Dec-1992 tw
  23. /* ************************************ */
  24.  
  25. #include <afxwin.h>    // mfc
  26. #include <afxcoll.h>   // mfc collections
  27.  
  28. #include "dialog.h"    // dialog
  29. #include "dynamix.h"   // klassen
  30.  
  31. // **************[ Anwendung ]************
  32.  
  33. // Die instanzierung dieser Klasse startet
  34. // die gesamte Anwendung
  35. theApp theApp;
  36.  
  37. // ///////////////////////////////////////
  38. // Name:    theApp::InitInstance()
  39. //       Initialisieren der Instance. dazu
  40. //       wird einfach nur ein neues Window
  41. //       ( in diesem Fall eine dialogbox)
  42. //       erzeugt.
  43. // Update:  12-Dec-1992    tw
  44. // ///////////////////////////////////////
  45. BOOL
  46. theApp::InitInstance()
  47. {
  48.    // dialogbox allozieren
  49.    m_pMainWnd = new MainWindow();
  50.  
  51.    // dlg. anzeigen
  52.    m_pMainWnd->ShowWindow( m_nCmdShow );
  53.    m_pMainWnd->UpdateWindow();
  54.  
  55.    return TRUE;
  56. }
  57.  
  58. // ***************[ MainWindow ]**********
  59.  
  60. // ///////////////////////////////////////
  61. // Message Map des Hauptwindows
  62. // abgefangen werden nur 2 Messages,
  63. // die WM_CLOSE meldung des Controlmenus
  64. // sowie die Button Pressed meldung
  65. // ///////////////////////////////////////
  66.  
  67. BEGIN_MESSAGE_MAP( MainWindow , CDialog )
  68.  ON_WM_CLOSE()
  69.  ON_BN_CLICKED(IDB_PRESSHERE,OnBtnClicked)
  70. END_MESSAGE_MAP()
  71.  
  72. // ///////////////////////////////////////
  73. // Name: OnBtnClicked
  74. //       Die Funktion wird aufgerufen,
  75. //       wenn der "Hier drücken" button
  76. //       auf dem Dialog gedrückt wird.
  77. // ///////////////////////////////////////
  78. void
  79. MainWindow::OnBtnClicked( void )
  80. {
  81.    // Instanzieren einer dynamischen
  82.    // Dialogbox.
  83.    XDynamicDialogBox dlg( this );
  84.  
  85.    // Initialparameter der Dialogbox
  86.    // setzen.
  87.    dlg.DefineBox(
  88.       WS_CAPTION |   // captionbar
  89.       WS_SYSMENU |    // systemmenu
  90.       WS_VISIBLE |   // sichtbar !
  91.       WS_POPUP,
  92.       1,              // X position
  93.       1,              // Y position
  94.       200,            // Breite
  95.       200,            // Höhe
  96.       "",            // Menuname
  97.       "",            // Klasse
  98.       "Dynamix !"    // Caption
  99.       );
  100.  
  101.    // Ein Button hinzufügen
  102.    dlg.AddItem(     // Neues Kontrol
  103.       5,            // x Position
  104.       5,            // y Position
  105.       60,           // Länge
  106.       25,           // Breite
  107.       IDOK,         // Control-ID
  108.       WS_TABSTOP |  // hat TABstop
  109.       BS_PUSHBUTTON,// Button style
  110.       "Button",     // Klasse
  111.       "OK",         // Caption-Text
  112.       0,            // zusatzdata
  113.       NULL          // zeiger auf data
  114.       );
  115.  
  116.    // Weitere items ..
  117.    dlg.AddItem( 5,35,60,25, 100,
  118.       WS_TABSTOP | ES_AUTOHSCROLL,
  119.       "Edit", "Initialtext", 0, NULL );
  120.  
  121.    // Bearbeitung der dynamischen Box
  122.    // starten
  123.    dlg.DoModal();
  124. }
  125.  
  126. /* *******[ dynamische box ]**************
  127.  
  128. /* ************************************ **
  129.  * XDynamicDialogBox::DefineBox
  130.  *    Initialparameter der dynamischen Box
  131.  *
  132.  * Update: 23-Nov-1992 tw
  133. ** ************************************ */
  134. void
  135. XDynamicDialogBox::DefineBox(
  136.    LONG Style,          // WindowStyle
  137.    int x,               // X-Position
  138.    int y,               // Y-Position
  139.    int cx,              // Breite
  140.    int cy,              // Höhe
  141.    LPSTR szMenuName,    // Menuname
  142.    LPSTR szClassName,   // Klassenname
  143.    LPSTR szCaptionText  // Captiontext
  144.    )
  145. {
  146.    LPDLGTEMPLATE     lpDlg;
  147.    LPSTR          lpText;
  148.  
  149.    // Anzahl byte, die für Menuname,
  150.    // Klassenname und Caption benötigt
  151.    // werden ermitteln.
  152.  
  153.    int nMenuNameBytes=strlen(
  154.                          szMenuName
  155.                          )
  156.                          + 1;
  157.    int nClassNameBytes=strlen(
  158.                          szClassName
  159.                          )
  160.                          + 1;
  161.    int nCaptionTextBytes=strlen(
  162.                            szCaptionText
  163.                            )
  164.                            + 1;
  165.  
  166.    // Anzahl Byte insgesamt ermitteln
  167.    m_nBytes = sizeof(DLGTEMPLATE) +
  168.                  nMenuNameBytes +
  169.                  nClassNameBytes +
  170.                  nCaptionTextBytes;
  171.  
  172.    // Anzahl Controlelemente auf 0
  173.    m_nItems = 0;
  174.  
  175.    // Speicher fuer Dialogbox holen
  176.    m_hMem = GlobalAlloc( GHND, m_nBytes);
  177.  
  178.    // Wenn nicht genug speicher da ist,
  179.    // wird eine Exception geworfen. Auf
  180.    // diese Weise kann die aufrufende
  181.    // Funktion einen try-catch frame auf-
  182.    // bauen, um dem user die Möglichkeit
  183.    // zu geben, vielleicht eine andere
  184.    // Anwendung zu terminieren.
  185.    if (m_hMem == NULL)
  186.    {
  187.       AfxThrowMemoryException();
  188.    }
  189.  
  190.    // Falls speicher da ist, locken
  191.    lpDlg = (LPDLGTEMPLATE) GlobalLock(
  192.                               m_hMem
  193.                               );
  194.  
  195.    // Parameter der Dialogbox im template
  196.    // ablegen
  197.    lpDlg->Style = Style;   // Art
  198.    lpDlg->nItems = 0;      // Anzahl items
  199.    lpDlg->x = x;           // X-Position
  200.    lpDlg->y = y;           // Y-Position
  201.    lpDlg->width = cx;      // Breite
  202.    lpDlg->height = cy;     // Höhe
  203.  
  204.    // Zeiger auf Speicherbereich für
  205.    // den Menutext ermitteln und Text
  206.    // hineinkopieren
  207.    lpText = ((LPSTR) lpDlg) +
  208.                sizeof( DLGTEMPLATE );
  209.    memcpy( lpText,        // Ziel
  210.            szMenuName,    // Text
  211.            nMenuNameBytes // Anzahl byte
  212.            );
  213.  
  214.    // Zeiger auf Speicher für KlassenNamen
  215.    // und CaptionText genauso behandeln
  216.    lpText += nMenuNameBytes;
  217.    memcpy( lpText, szClassName,
  218.            nClassNameBytes);
  219.  
  220.    lpText += nClassNameBytes;
  221.    memcpy( lpText, szCaptionText,
  222.            nCaptionTextBytes);
  223.  
  224.    // Speicher wieder unlocken
  225.    GlobalUnlock( m_hMem );
  226. }
  227.  
  228. /* ************************************ **
  229.  * Name: XDynamicDialogBox::AddItem
  230.  *       Kontrollelement auf der Dialog-
  231.  *       box einfügen.
  232.  * Update:  12-Dec-1992 tw
  233. ** ************************************ */
  234. void
  235. XDynamicDialogBox::AddItem(
  236.    int x,           // X-Position
  237.    int y,           // Y-Position
  238.    int cx,          // Breite
  239.    int cy,          // Höhe
  240.    int nID,         // Kontrol-ID
  241.    long Style,      // Item-Style
  242.    LPSTR szClass,   // klasse
  243.    LPSTR szText,    // Windowtext
  244.    BYTE DataBytes,  // Additional bytes
  245.    LPBYTE pData     // ptr. auf add. data
  246.    )
  247. {
  248.    LPDLGTEMPLATE lpDlg;
  249.    LPDLGITEMTEMPLATE lpItem;
  250.    LPSTR lpText;
  251.  
  252.    int nOldBytes = m_nBytes;
  253.    int nClassBytes = strlen(szClass) + 1;
  254.    int nTextBytes = strlen(szText) + 1;
  255.  
  256.    // Neue benötigte Speichergröße
  257.    // ermitteln, bisher allozierten Block
  258.    // erweitern, und neuen Bereich locken
  259.  
  260.    m_nBytes += sizeof(DLGITEMTEMPLATE) +
  261.                   nClassBytes +
  262.                   nTextBytes +
  263.                   sizeof(BYTE) +
  264.                   DataBytes;
  265.    m_hMem = GlobalReAlloc(m_hMem,
  266.                           m_nBytes,
  267.                           GHND);
  268.    if (m_hMem == NULL)
  269.    {
  270.       AfxThrowMemoryException();
  271.    }
  272.  
  273.    // Kontrollelementzähler erhöhen
  274.    m_nItems++;
  275.    lpDlg = (LPDLGTEMPLATE) GlobalLock(
  276.                               m_hMem);
  277.  
  278.    // Parameter im Speicherblock
  279.    // eintragen
  280.    lpDlg->nItems = m_nItems;
  281.    lpItem = (LPDLGITEMTEMPLATE) ((
  282.                (LPSTR) lpDlg) +nOldBytes);
  283.    lpItem->x = x;
  284.    lpItem->y = y;
  285.    lpItem->width = cx;
  286.    lpItem->height = cy;
  287.    lpItem->ID = nID;
  288.    lpItem->Style = Style | WS_CHILD |
  289.                            WS_VISIBLE;
  290.  
  291.    lpText = ((LPSTR) lpItem )+
  292.                sizeof(DLGITEMTEMPLATE);
  293.    memcpy(lpText, szClass, nClassBytes);
  294.    lpText += nClassBytes;
  295.    memcpy(lpText, szText, nTextBytes);
  296.    lpText += nTextBytes;
  297.    *lpText = DataBytes;
  298.    lpText += sizeof(BYTE);
  299.    memcpy(lpText, pData, DataBytes);
  300.  
  301.    GlobalUnlock(m_hMem);
  302. }
  303.