Annotation of mstools/samples/dyndlg/dyndlg.c, revision 1.1.1.1

1.1       root        1: /**************************************************************************\
                      2: *  Simple sample to show how to dynamically create Win32 dialogs.
                      3: *
                      4: *         Steve Firebaugh
                      5: *         Microsoft Developer Support
                      6: *         Copyright (c) 1992, 1993 Microsoft Corporation
                      7: *
                      8: *
                      9: \**************************************************************************/
                     10: 
                     11: #define UNICODE
                     12: #include <windows.h>
                     13: #include "dyndlg.h"
                     14: 
                     15: LRESULT APIENTRY MainWndProc(HWND, UINT, UINT, LONG);
                     16: LRESULT APIENTRY About(HWND, UINT, WPARAM, LPARAM );
                     17: 
                     18: int Create1(HWND);
                     19: int Create2(HWND);
                     20: 
                     21: HINSTANCE ghInst;
                     22: 
                     23: /**************************************************************************\
                     24: *
                     25: *  function:  WinMain()
                     26: *
                     27: *  input parameters:  c.f. generic sample
                     28: *
                     29: \**************************************************************************/
                     30: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     31:                      LPSTR lpCmdLine, int nCmdShow)
                     32: {
                     33:     HWND   hwnd;
                     34:     MSG    msg;
                     35:     HANDLE hLibrary;
                     36: 
                     37:     UNREFERENCED_PARAMETER( lpCmdLine );
                     38: 
                     39:     ghInst = hInstance;
                     40: 
                     41:     /* Check for previous instance.  If none, then register class. */
                     42:     if (!hPrevInstance) {
                     43:         WNDCLASS  wc;
                     44: 
                     45:         wc.style = 0;
                     46:         wc.lpfnWndProc = (WNDPROC)MainWndProc;
                     47: 
                     48:         wc.cbClsExtra = 0;
                     49:         wc.cbWndExtra = 0;
                     50:         wc.hInstance = hInstance;
                     51:         wc.hIcon = LoadIcon(hInstance, TEXT("dyndlgIcon"));
                     52:         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                     53:         wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
                     54:         wc.lpszMenuName = TEXT("dyndlgMenu");
                     55:         wc.lpszClassName = TEXT("dyndlg");
                     56: 
                     57:         if (!RegisterClass(&wc)) return (FALSE);
                     58:     }  /* class registered o.k. */
                     59: 
                     60: 
                     61:     /* Create the main window.  Return false if CreateWindow() fails */
                     62:     hwnd = CreateWindow(
                     63:         TEXT("dyndlg"),
                     64:         TEXT("dyndlg"),
                     65:         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
                     66:         CW_USEDEFAULT,
                     67:         CW_USEDEFAULT,
                     68:         CW_USEDEFAULT,
                     69:         CW_USEDEFAULT,
                     70:         NULL,
                     71:         NULL,
                     72:         hInstance,
                     73:         NULL);
                     74: 
                     75:     if (!hwnd) return (FALSE);
                     76: 
                     77: 
                     78:     /***** CUSTOM CONTROL
                     79:     * Load the DLL containing the custom control.
                     80:     *****/
                     81:     hLibrary = LoadLibrary (TEXT("..\\spincube\\SPINCUBE.DLL"));
                     82:     if (hLibrary == NULL)
                     83:       MessageBox (hwnd, TEXT("LoadLibrary (..\\spincube\\SPINCUBE.DLL) failed"),
                     84:                   TEXT("Error, this app requires spincube."), MB_OK | MB_ICONEXCLAMATION);
                     85:     /***** CUSTOM CONTROL *****/
                     86: 
                     87: 
                     88:     /* Demo: Just for fun, start out with one of the dialogs created. */
                     89:     PostMessage (hwnd, WM_COMMAND, IDM_DIALOG2, 0);
                     90: 
                     91:     /* Loop getting messages and dispatching them. */
                     92:     while (GetMessage(&msg,NULL, 0, 0)) {
                     93:       TranslateMessage(&msg);
                     94:       DispatchMessage(&msg);
                     95:     }
                     96: 
                     97:     if (hLibrary != NULL) FreeLibrary (hLibrary);
                     98: 
                     99:     return (msg.wParam);
                    100: }
                    101: 
                    102: 
                    103: 
                    104: 
                    105: 
                    106: 
                    107: 
                    108: 
                    109: 
                    110: 
                    111: /***************************************************************************\
                    112: *    FUNCTION: MainWndProc
                    113: \***************************************************************************/
                    114: LRESULT APIENTRY MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    115: {
                    116:   switch (message) {
                    117: 
                    118:     /**********************************************************************\
                    119:     *  Menu item support.
                    120:     *
                    121:     \**********************************************************************/
                    122:     case WM_COMMAND:
                    123:       switch (LOWORD(wParam)) {
                    124: 
                    125:         case IDM_DIALOG1:
                    126:           Create1 (hwnd);
                    127:         break;
                    128: 
                    129:         case IDM_DIALOG2:
                    130:           Create2 (hwnd);
                    131:         break;
                    132: 
                    133:         case IDM_HELP:
                    134:           WinHelp( hwnd, TEXT("dyndlg.hlp"), HELP_INDEX, (DWORD) NULL );
                    135:         break;
                    136: 
                    137:         case IDM_ABOUT:
                    138:           DialogBox (GetModuleHandle(NULL), TEXT("aboutBox"), hwnd, (DLGPROC)About);
                    139:         return 0;
                    140: 
                    141:       }  /* end switch */
                    142:     break;  /* end wm_command */
                    143: 
                    144: 
                    145: 
                    146:     case WM_DESTROY:
                    147:       WinHelp( hwnd,  TEXT("dyndlg.hlp"), (UINT) HELP_QUIT, (DWORD) NULL );
                    148:       PostQuitMessage(0);
                    149:     break;
                    150: 
                    151:     } /* end switch */
                    152:     return (DefWindowProc(hwnd, message, wParam, lParam));
                    153: }
                    154: 
                    155: 
                    156: /****************************************************************************
                    157:     FUNCTION: About
                    158: ****************************************************************************/
                    159: LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    160: {
                    161:   if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) {
                    162:     EndDialog (hwnd, TRUE);
                    163:     return TRUE;
                    164:   }
                    165:   if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) {
                    166:     EndDialog (hwnd, TRUE);
                    167:     return TRUE;
                    168:   }
                    169:   return FALSE;
                    170: }
                    171: 
                    172: 
                    173: 
                    174: 
                    175: 
                    176: 
                    177: 
                    178: 
                    179: /*+++
                    180: 
                    181: 
                    182:     Create the first dialog dynamically.  Notice that we are NOT using
                    183:     structures here because too many of the fields are of variable length.
                    184:     Instead, just allocate some memory to play with, and start filling in
                    185:     the data at that pointer.
                    186: 
                    187:     p - pointer which is moved down through the DLGTEMPLATE information.
                    188:     pdlgtemplate - pointer to the TOP of the DLGTEMPLATE information.
                    189: 
                    190: 
                    191:     Notice that UNICODE is defined to be on in this module.  That means:
                    192:       1.  All strings included in TEXT() macro will be made unicode strings
                    193:         by the compiler.
                    194:       2.  wsprintf() will accept a unicode string as input, and will fill
                    195:         its lpOut buffer with a unicode string.  Notice that in any case,
                    196:         the return value is the number of *characters*  not the number of
                    197:         bytes.
                    198:       3.  Any system call which may be dependent upon unicode will be mapped
                    199:         to its wide character version (*W not *A) by the header files.
                    200:         Notice that this does not matter for the CreateDialogIndirect() call.
                    201:         Both the A and W versions expect the dialog template to contain wide
                    202:         character strings.
                    203: 
                    204: 
                    205:     Here we create a simple dialog with one item.  The dialog has a title,
                    206:     the item has text, and the item class is specified by ordinal.  There
                    207:     is no font information.
                    208: 
                    209: ---*/
                    210: 
                    211: Create1(HWND hwnd)
                    212: {
                    213: WORD *p, *pdlgtemplate;
                    214: int nchar;
                    215: 
                    216:   /* declare variables purely for ease of reading the names provide. */
                    217:   DWORD   lStyle;
                    218:   DWORD   lExtendedStyle;
                    219:   WORD    NumberOfItems;
                    220:   WORD    x;
                    221:   WORD    y;
                    222:   WORD    cx;
                    223:   WORD    cy;
                    224: 
                    225:   WORD    wId;
                    226: 
                    227:   /* allocate some memory to play with  */
                    228:   pdlgtemplate = p = (PWORD) LocalAlloc (LPTR, 1000);
                    229: 
                    230:   lStyle              = DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_VISIBLE;
                    231:   lExtendedStyle      = 0;
                    232:   NumberOfItems       = 1;
                    233:   x                   = 10;
                    234:   y                   = 10;
                    235:   cx                  = 100;
                    236:   cy                  = 100;
                    237: 
                    238:   /* start to fill in the dlgtemplate information.  addressing by WORDs */
                    239:   *p++ = LOWORD (lStyle);
                    240:   *p++ = HIWORD (lStyle);
                    241:   *p++ = LOWORD (lExtendedStyle);
                    242:   *p++ = HIWORD (lExtendedStyle);
                    243:   *p++ = NumberOfItems;
                    244:   *p++ = x ;
                    245:   *p++ = y ;
                    246:   *p++ = cx;
                    247:   *p++ = cy;
                    248:   *p++ = 0;     // Menu
                    249:   *p++ = 0;     // Class
                    250: 
                    251:   /* copy the title of the dialog, null terminate the string. */
                    252:   nchar = wsprintf (p, TEXT("Title 1"));
                    253:   p += nchar;
                    254:   *p++ = 0;
                    255: 
                    256:   /* add in the wPointSize and szFontName here iff the DS_SETFONT bit on */
                    257: 
                    258:   /* make sure the first item starts on a DWORD boundary */
                    259:   { ULONG l;
                    260: 
                    261:   l = (ULONG) p;
                    262:   l +=3;
                    263:   l >>=2;
                    264:   l <<=2;
                    265:   p = (PWORD) l;
                    266:   }
                    267: 
                    268: 
                    269:   /* now start with the first item */
                    270:   lStyle              = BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD;
                    271:   x                   = 10;
                    272:   y                   = 70;
                    273:   cx                  = 80;
                    274:   cy                  = 20;
                    275:   wId                 = IDOK;
                    276: 
                    277: 
                    278:   *p++ = LOWORD (lStyle);
                    279:   *p++ = HIWORD (lStyle);
                    280:   *p++ = LOWORD (lExtendedStyle);
                    281:   *p++ = HIWORD (lExtendedStyle);
                    282:   *p++ = x ;
                    283:   *p++ = y ;
                    284:   *p++ = cx;
                    285:   *p++ = cy;
                    286:   *p++ = wId;
                    287: 
                    288:   /* fill in class i.d. Button in this case */
                    289:   *p++ = (WORD)0xffff;
                    290:   *p++ = (WORD)0x0080;
                    291: 
                    292:   /* copy the text of the first item, null terminate the string. */
                    293:   nchar = wsprintf (p, TEXT("OK"));
                    294:   p += nchar;
                    295:   *p++ = 0;
                    296: 
                    297:   *p++ = 0;  // advance pointer over nExtraStuff WORD
                    298: 
                    299:   CreateDialogIndirect (ghInst, (LPDLGTEMPLATE) pdlgtemplate, hwnd, (DLGPROC) About);
                    300: 
                    301:   LocalFree (LocalHandle (pdlgtemplate));
                    302: 
                    303:   return 0;
                    304: }
                    305: 
                    306: 
                    307: 
                    308: 
                    309: 
                    310: 
                    311: 
                    312: /*+++
                    313: 
                    314: 
                    315:     Create the second dialog dynamically.
                    316: 
                    317:     Here we create a dialog which has font information (DS_SETFONT),
                    318:     and which has two items with the item class specified by name.
                    319: 
                    320: 
                    321: ---*/
                    322: Create2(HWND hwnd)
                    323: {
                    324: WORD *p, *pdlgtemplate;
                    325: int nchar;
                    326: 
                    327:   /* declare variables purely for ease of reading the names provide. */
                    328:   DWORD   lStyle;
                    329:   DWORD   lExtendedStyle;
                    330:   WORD    NumberOfItems;
                    331:   WORD    x;
                    332:   WORD    y;
                    333:   WORD    cx;
                    334:   WORD    cy;
                    335: 
                    336:   WORD    wId;
                    337: 
                    338:   /* allocate some memory to play with  */
                    339:   pdlgtemplate = p = (PWORD) LocalAlloc (LPTR, 1000);
                    340: 
                    341:   lStyle              = WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_SETFONT;
                    342:   lExtendedStyle      = 0;
                    343:   NumberOfItems       = 2;
                    344:   x                   = 210;
                    345:   y                   = 10;
                    346:   cx                  = 100;
                    347:   cy                  = 100;
                    348: 
                    349:   /* start to fill in the dlgtemplate information.  addressing by WORDs */
                    350:   *p++ = LOWORD (lStyle);
                    351:   *p++ = HIWORD (lStyle);
                    352:   *p++ = LOWORD (lExtendedStyle);
                    353:   *p++ = HIWORD (lExtendedStyle);
                    354:   *p++ = NumberOfItems;
                    355:   *p++ = x ;
                    356:   *p++ = y ;
                    357:   *p++ = cx;
                    358:   *p++ = cy;
                    359:   *p++ = 0;     // Menu
                    360:   *p++ = 0;     // Class
                    361: 
                    362:   /* copy the title of the dialog, null terminate the string. */
                    363:   nchar = wsprintf (p, TEXT("Title 2"));
                    364:   p += nchar;
                    365:   *p++ = 0;
                    366: 
                    367:   /* Font information because of DS_SETFONT */
                    368:   *p++ = 18;     // point size
                    369:   nchar = wsprintf (p, TEXT("Times New Roman"));  // Face name
                    370:   p += nchar;
                    371:   *p++ = 0;
                    372: 
                    373: 
                    374:   /* make sure the first item starts on a DWORD boundary */
                    375:   { ULONG l;
                    376: 
                    377:   l = (ULONG) p;
                    378:   l +=3;
                    379:   l >>=2;
                    380:   l <<=2;
                    381:   p = (PWORD) l;
                    382:   }
                    383: 
                    384: 
                    385:   /* now start with the first item */
                    386:   lStyle              = BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP;
                    387:   x                   = 10;
                    388:   y                   = 60;
                    389:   cx                  = 80;
                    390:   cy                  = 20;
                    391:   wId                 = IDOK;
                    392: 
                    393: 
                    394:   *p++ = LOWORD (lStyle);
                    395:   *p++ = HIWORD (lStyle);
                    396:   *p++ = LOWORD (lExtendedStyle);
                    397:   *p++ = HIWORD (lExtendedStyle);
                    398:   *p++ = x ;
                    399:   *p++ = y ;
                    400:   *p++ = cx;
                    401:   *p++ = cy;
                    402:   *p++ = wId;
                    403: 
                    404: 
                    405:   /* fill in class i.d., this time by name */
                    406:   nchar = wsprintf (p, TEXT("BUTTON"));
                    407:   p += nchar;
                    408:   *p++ = 0;
                    409: 
                    410: 
                    411:   /* copy the text of the first item, null terminate the string. */
                    412:   nchar = wsprintf (p, TEXT("OK"));
                    413:   p += nchar;
                    414:   *p++ = 0;
                    415: 
                    416:   *p++ = 0;  // advance pointer over nExtraStuff WORD
                    417: 
                    418:   /* make sure the second item starts on a DWORD boundary */
                    419:   { ULONG l;
                    420: 
                    421:   l = (ULONG) p;
                    422:   l +=3;
                    423:   l >>=2;
                    424:   l <<=2;
                    425:   p = (PWORD) l;
                    426:   }
                    427: 
                    428: #define SS_INMOTION 0x0002  /* from spincube.h */
                    429:   lStyle              = WS_VISIBLE | WS_CHILD | SS_INMOTION;
                    430:   x                   = 20;
                    431:   y                   = 5;
                    432:   cx                  = 65;
                    433:   cy                  = 45;
                    434:   wId                 = 57;
                    435: 
                    436: 
                    437:   *p++ = LOWORD (lStyle);
                    438:   *p++ = HIWORD (lStyle);
                    439:   *p++ = LOWORD (lExtendedStyle);
                    440:   *p++ = HIWORD (lExtendedStyle);
                    441:   *p++ = x ;
                    442:   *p++ = y ;
                    443:   *p++ = cx;
                    444:   *p++ = cy;
                    445:   *p++ = wId;
                    446: 
                    447: 
                    448:   /* fill in class i.d., this time by name */
                    449: 
                    450:   /***** CUSTOM CONTROL
                    451:   * Fill in the class name that is specified in the DLL
                    452:   *  See the \q_a\samples\spincube sample for the source to this.
                    453:   *****/
                    454:   nchar = wsprintf (p, TEXT("Spincube"));
                    455:   p += nchar;
                    456:   *p++ = 0;
                    457: 
                    458:   /* copy the text of the second item, null terminate the string. */
                    459:   nchar = wsprintf (p, TEXT(""));
                    460:   p += nchar;
                    461:   *p++ = 0;
                    462: 
                    463:   *p++ = 0;  // advance pointer over nExtraStuff WORD
                    464: 
                    465:   CreateDialogIndirect (ghInst, (LPDLGTEMPLATE) pdlgtemplate, hwnd, (DLGPROC) About);
                    466: 
                    467:   LocalFree (LocalHandle (pdlgtemplate));
                    468: 
                    469:   return 0;
                    470: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.