Navigation:  C/C++ Scripting Engine > Sample C/C++ Script Code >

DialogBoxIndirect.c

Previous pageReturn to chapter overviewNext page

Use Windows specific C code to display a system dialog window.

bar_dot

 

#include "Fab3000.h"

#include <windows.h>

 

#define ID_HELP   150

#define ID_EDIT          180

#define ID_TEXT   200

 

 

char nEditTwo[128]= "Input String Here." ;

 

BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM) ;

 

LPWORD lpwAlign ( LPWORD lpIn)

{

        ULONG ul;

 

        ul = (ULONG) lpIn;

        ul +=3;

        ul >>=2;

        ul <<=2;

        return (LPWORD) ul;

}

 

int main() {

      HGLOBAL hgbl;

      LPDLGTEMPLATE lpdt;

      LPDLGITEMTEMPLATE lpdit;

      LPWORD lpw;

      LRESULT ret;

      LPWSTR lpwsz;

//     wchar_t *pwc;

//     size_t nchar;

 

      hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);

      if (!hgbl)

          return -1;

 

      lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);

 

      // Define a dialog box.

 

      lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;

      lpdt->cdit = 3; // number of controls

      lpdt->x  = 10;  lpdt->y  = 10;

      lpdt->cx = 100; lpdt->cy = 70;

 

      lpw = (LPWORD) (lpdt + 1);

      *lpw++ = 0;   // no menu

      *lpw++ = 0;   // predefined dialog box class (by default)

 

      /*pwc = (wchar_t *) lpw;

      nchar = 1+ mbstowcs( pwc, "DialogBox", strlen("DialogBox") );

      lpw   += nchar;*/

     

      lpwsz = (LPWSTR) lpw;

      lstrcpyW(lpwsz, L"DialogBox");

      lpw = (LPWORD) (lpwsz + lstrlenW(lpwsz) + 1);

 

      //-----------------------

      // Define an OK button.

      //-----------------------

      lpw = lpwAlign (lpw);

 

      lpdit = (LPDLGITEMTEMPLATE) lpw;

      lpdit->x  = 10; lpdit->y  = 50;

      lpdit->cx = 80; lpdit->cy = 15;

      lpdit->id = IDOK; // OK button identifier

      lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;

 

      lpw = (LPWORD) (lpdit + 1);

      *lpw++ = 0xFFFF;

      *lpw++ = 0x0080;   // button class

 

      /*pwc = (wchar_t *) lpw;

    nchar = 1+ mbstowcs( pwc, "Exit", strlen("Exit") );

      lpw   += nchar;*/

      lpwsz = (LPWSTR) lpw;

      lstrcpyW(lpwsz, L"Exit");

      lpw = (LPWORD) (lpwsz + lstrlenW(lpwsz) + 1);

      *lpw++ = 0;             // no creation data

 

 

      //-----------------------

      // Define a button.

      //-----------------------

      lpw = lpwAlign (lpw);

 

      lpdit = (LPDLGITEMTEMPLATE) lpw;

      lpdit->x  = 10; lpdit->y  = 30;

      lpdit->cx = 80; lpdit->cy = 15;

      lpdit->id = ID_HELP;  

      lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;

 

      lpw = (LPWORD) (lpdit + 1);

      *lpw++ = 0xFFFF;

      *lpw++ = 0x0080;                 // button class atom

 

      /*pwc = (wchar_t *) lpw;

    nchar = 1+ mbstowcs( pwc, "DisplayInput", strlen("DisplayInput") );

      lpw   += nchar;*/

      lpwsz = (LPWSTR) lpw;

      lstrcpyW(lpwsz, L"DisplayInput");

      lpw = (LPWORD) (lpwsz + lstrlenW(lpwsz) + 1);

      *lpw++ = 0;                     // no creation data

 

 

      //-----------------------

      // Define a EDIT.

      //-----------------------

      lpw = lpwAlign (lpw);

 

      lpdit = (LPDLGITEMTEMPLATE) lpw;

      lpdit->x  = 10; lpdit->y  = 10;

      lpdit->cx = 80; lpdit->cy = 12;

      lpdit->id = ID_EDIT;  

      lpdit->style = ES_LEFT | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;

 

      lpw = (LPWORD) (lpdit + 1);

      *lpw++ = 0xFFFF;

      *lpw++ = 0x0081;                 // edit class atom

      *lpw++ = 0;                     // no creation data

 

 

      GlobalUnlock(hgbl);

 

      ret = DialogBoxIndirect(NULL,

                              (LPDLGTEMPLATE) hgbl,

                              NULL,

                              (DLGPROC) DialogProc);

 

      GlobalFree(hgbl);

 

      return ret;

     }

 

 

BOOL CALLBACK  DialogProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

 

    switch (iMsg)

  {

        case WM_INITDIALOG :

        SetDlgItemText ( hDlg, ID_EDIT, nEditTwo );

              return TRUE ;

        case WM_COMMAND :

              switch (LOWORD (wParam))

              {

          case ID_EDIT :

             GetDlgItemText (hDlg, ID_EDIT, nEditTwo, 127);

            return TRUE;

          case ID_HELP :

              MessageBox( NULL, nEditTwo, "Input Data", MB_OK | MB_SYSTEMMODAL | MB_NOFOCUS);

              return TRUE;

          case IDOK :

                    EndDialog (hDlg, 0) ;

              return TRUE ;

       }

            break ;

    }

    return FALSE ;

}