DYNDLG.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. #include <windows.h>
  11. #include "dyndlg.h"
  12. LRESULT APIENTRY MainWndProc(HWND, UINT, UINT, LONG);
  13. LRESULT APIENTRY About(HWND, UINT, WPARAM, LPARAM );
  14. int Create1(HWND);
  15. int Create2(HWND);
  16. LPWORD lpwAlign (LPWORD);
  17. int nCopyAnsiToWideChar (LPWORD, LPSTR);
  18. HINSTANCE ghInst;
  19. /**************************************************************************
  20. *
  21. *  function:  WinMain()
  22. *
  23. *  input parameters:  c.f. generic sample
  24. *
  25. **************************************************************************/
  26. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  27.                      LPSTR lpCmdLine, int nCmdShow)
  28. {
  29.     HWND   hwnd;
  30.     MSG    msg;
  31.     HANDLE hLibrary;
  32.     UNREFERENCED_PARAMETER( lpCmdLine );
  33.     ghInst = hInstance;
  34.     /* Check for previous instance.  If none, then register class. */
  35.     if (!hPrevInstance) {
  36.         WNDCLASS  wc;
  37.         wc.style = 0;
  38.         wc.lpfnWndProc = (WNDPROC)MainWndProc;
  39.         wc.cbClsExtra = 0;
  40.         wc.cbWndExtra = 0;
  41.         wc.hInstance = hInstance;
  42.         wc.hIcon = LoadIcon(hInstance, TEXT("dyndlgIcon"));
  43.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  44.         wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
  45.         wc.lpszMenuName = TEXT("dyndlgMenu");
  46.         wc.lpszClassName = TEXT("dyndlg");
  47.         if (!RegisterClass(&wc)) return (FALSE);
  48.     }  /* class registered o.k. */
  49.     /* Create the main window.  Return false if CreateWindow() fails */
  50.     hwnd = CreateWindow(
  51.         TEXT("dyndlg"),
  52.         TEXT("DynDlg"),
  53.         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
  54.         CW_USEDEFAULT,
  55.         CW_USEDEFAULT,
  56.         CW_USEDEFAULT,
  57.         CW_USEDEFAULT,
  58.         NULL,
  59.         NULL,
  60.         hInstance,
  61.         NULL);
  62.     if (!hwnd) return (FALSE);
  63.     /***** CUSTOM CONTROL
  64.     * Load the DLL containing the custom control.
  65.     *****/
  66.     hLibrary = LoadLibrary (TEXT("..\spincube\SPINCUBE.DLL"));
  67.     if (hLibrary == NULL)
  68.       if (PRIMARYLANGID(GetUserDefaultLangID ()) == LANG_JAPANESE)
  69.         MessageBox (hwnd, TEXT("LoadLibrary (..\spincube\SPINCUBE.DLL) 偑幐攕偟傑偟偨丅"),
  70.                   TEXT("僄儔乕, 偙偺傾僾儕働乕僔儑儞偼 spincube 偑昁梫偱偡"), MB_OK | MB_ICONEXCLAMATION);
  71.       else
  72.         MessageBox (hwnd, TEXT("LoadLibrary (..\spincube\SPINCUBE.DLL) failed"),
  73.                   TEXT("Error, this app requires spincube."), MB_OK | MB_ICONEXCLAMATION);
  74.     /***** CUSTOM CONTROL *****/
  75.     /* Demo: Just for fun, start out with one of the dialogs created. */
  76.     PostMessage (hwnd, WM_COMMAND, IDM_DIALOG2, 0);
  77.     /* Loop getting messages and dispatching them. */
  78.     while (GetMessage(&msg,NULL, 0, 0)) {
  79.       TranslateMessage(&msg);
  80.       DispatchMessage(&msg);
  81.     }
  82.     if (hLibrary != NULL) FreeLibrary (hLibrary);
  83.     return (msg.wParam);
  84. }
  85. /***************************************************************************
  86. *    FUNCTION: MainWndProc
  87. ***************************************************************************/
  88. LRESULT APIENTRY MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  89. {
  90.   switch (message) {
  91.     /**********************************************************************
  92.     *  Menu item support.
  93.     *
  94.     **********************************************************************/
  95.     case WM_COMMAND:
  96.       switch (LOWORD(wParam)) {
  97.         case IDM_DIALOG1:
  98.           Create1 (hwnd);
  99.         break;
  100.         case IDM_DIALOG2:
  101.           Create2 (hwnd);
  102.         break;
  103.         case IDM_HELP:
  104.           WinHelp( hwnd, TEXT("dyndlg.hlp"), HELP_INDEX, (DWORD) NULL );
  105.         break;
  106.         case IDM_ABOUT:
  107.           DialogBox (GetModuleHandle(NULL), TEXT("aboutBox"), hwnd, (DLGPROC)About);
  108.         return 0;
  109.       }  /* end switch */
  110.     break;  /* end wm_command */
  111.     case WM_DESTROY:
  112.       WinHelp( hwnd,  TEXT("dyndlg.hlp"), (UINT) HELP_QUIT, (DWORD) NULL );
  113.       PostQuitMessage(0);
  114.     break;
  115.     } /* end switch */
  116.     return (DefWindowProc(hwnd, message, wParam, lParam));
  117. }
  118. /****************************************************************************
  119.     FUNCTION: About
  120. ****************************************************************************/
  121. LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  122. {
  123.   if (message == WM_INITDIALOG)
  124.     return TRUE;
  125.   if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) {
  126.     EndDialog (hwnd, TRUE);
  127.     return TRUE;
  128.   }
  129.   if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) {
  130.     EndDialog (hwnd, TRUE);
  131.     return TRUE;
  132.   }
  133.   return FALSE;
  134. }
  135. /*+++
  136.     Create the first dialog dynamically.  Notice that we are NOT using
  137.     structures here because too many of the fields are of variable length.
  138.     Instead, just allocate some memory to play with, and start filling in
  139.     the data at that pointer.
  140.     p - pointer which is moved down through the DLGTEMPLATE information.
  141.     pdlgtemplate - pointer to the TOP of the DLGTEMPLATE information.
  142.     Here we create a simple dialog with one item.  The dialog has a title,
  143.     the item has text, and the item class is specified by ordinal.  There
  144.     is no font information.
  145. ---*/
  146. Create1(HWND hwnd)
  147. {
  148.   WORD  *p, *pdlgtemplate;
  149.   int   nchar;
  150.   DWORD lStyle;
  151.   /* allocate some memory to play with  */
  152.   pdlgtemplate = p = (PWORD) LocalAlloc (LPTR, 1000);
  153.   /* start to fill in the dlgtemplate information.  addressing by WORDs */
  154.   lStyle = DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_VISIBLE;
  155.   *p++ = LOWORD (lStyle);
  156.   *p++ = HIWORD (lStyle);
  157.   *p++ = 0;          // LOWORD (lExtendedStyle)
  158.   *p++ = 0;          // HIWORD (lExtendedStyle)
  159.   *p++ = 1;          // NumberOfItems
  160.   *p++ = 10;         // x
  161.   *p++ = 10;         // y
  162.   *p++ = 100;        // cx
  163.   *p++ = 100;        // cy
  164.   *p++ = 0;          // Menu
  165.   *p++ = 0;          // Class
  166.   /* copy the title of the dialog */
  167.   if (PRIMARYLANGID(GetUserDefaultLangID ()) == LANG_JAPANESE)
  168.     nchar = nCopyAnsiToWideChar (p, TEXT("僞僀僩儖 1"));
  169.   else
  170.     nchar = nCopyAnsiToWideChar (p, TEXT("Title 1"));
  171.   p += nchar;
  172.   /* add in the wPointSize and szFontName here iff the DS_SETFONT bit on */
  173.   /* make sure the first item starts on a DWORD boundary */
  174.   p = lpwAlign (p);
  175.   /* now start with the first item */
  176.   lStyle = BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD;
  177.   *p++ = LOWORD (lStyle);
  178.   *p++ = HIWORD (lStyle);
  179.   *p++ = 0;          // LOWORD (lExtendedStyle)
  180.   *p++ = 0;          // HIWORD (lExtendedStyle)
  181.   *p++ = 10;         // x
  182.   *p++ = 70;         // y
  183.   *p++ = 80;         // cx
  184.   *p++ = 20;         // cy
  185.   *p++ = IDOK;       // ID
  186.   /* fill in class i.d. Button in this case */
  187.   *p++ = (WORD)0xffff;
  188.   *p++ = (WORD)0x0080;
  189.   /* copy the text of the first item */
  190.   nchar = nCopyAnsiToWideChar (p, TEXT("OK"));
  191.   p += nchar;
  192.   *p++ = 0;  // advance pointer over nExtraStuff WORD
  193.   CreateDialogIndirect (ghInst, (LPDLGTEMPLATE) pdlgtemplate, hwnd, (DLGPROC) About);
  194.   LocalFree (LocalHandle (pdlgtemplate));
  195.   return 0;
  196. }
  197. /*+++
  198.     Create the second dialog dynamically.
  199.     Here we create a dialog which has font information (DS_SETFONT),
  200.     and which has two items with the item class specified by name.
  201. ---*/
  202. Create2(HWND hwnd)
  203. {
  204.   WORD  *p, *pdlgtemplate;
  205.   int   nchar;
  206.   DWORD lStyle;
  207.   /* allocate some memory to play with  */
  208.   pdlgtemplate = p = (PWORD) LocalAlloc (LPTR, 1000);
  209.   /* start to fill in the dlgtemplate information.  addressing by WORDs */
  210.   lStyle = WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_SETFONT;
  211.   *p++ = LOWORD (lStyle);
  212.   *p++ = HIWORD (lStyle);
  213.   *p++ = 0;          // LOWORD (lExtendedStyle)
  214.   *p++ = 0;          // HIWORD (lExtendedStyle)
  215.   *p++ = 2;          // NumberOfItems
  216.   *p++ = 210;        // x
  217.   *p++ = 10;         // y
  218.   *p++ = 100;        // cx
  219.   *p++ = 100;        // cy
  220.   *p++ = 0;          // Menu
  221.   *p++ = 0;          // Class
  222.   /* copy the title of the dialog */
  223.   if (PRIMARYLANGID(GetUserDefaultLangID ()) == LANG_JAPANESE)
  224.     nchar = nCopyAnsiToWideChar (p, TEXT("僞僀僩儖 2"));
  225.   else
  226.     nchar = nCopyAnsiToWideChar (p, TEXT("Title 2"));
  227.   p += nchar;
  228.   /* Font information because of DS_SETFONT */
  229.   *p++ = 18;     // point size
  230.   nchar = nCopyAnsiToWideChar (p, TEXT("Times New Roman"));  // Face name
  231.   p += nchar;
  232.   /* make sure the first item starts on a DWORD boundary */
  233.   p = lpwAlign (p);
  234.   /* now start with the first item */
  235.   lStyle = BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP;
  236.   *p++ = LOWORD (lStyle);
  237.   *p++ = HIWORD (lStyle);
  238.   *p++ = 0;          // LOWORD (lExtendedStyle)
  239.   *p++ = 0;          // HIWORD (lExtendedStyle)
  240.   *p++ = 10;         // x
  241.   *p++ = 60;         // y
  242.   *p++ = 80;         // cx
  243.   *p++ = 20;         // cy
  244.   *p++ = IDOK;       // ID
  245.   /* fill in class i.d., this time by name */
  246.   nchar = nCopyAnsiToWideChar (p, TEXT("BUTTON"));
  247.   p += nchar;
  248.   /* copy the text of the first item */
  249.   nchar = nCopyAnsiToWideChar (p, TEXT("OK"));
  250.   p += nchar;
  251.   *p++ = 0;  // advance pointer over nExtraStuff WORD
  252.   /* make sure the second item starts on a DWORD boundary */
  253.   p = lpwAlign (p);
  254. #define SS_INMOTION 0x0002  /* from spincube.h */
  255.   lStyle = WS_VISIBLE | WS_CHILD | SS_INMOTION;
  256.   *p++ = LOWORD (lStyle);
  257.   *p++ = HIWORD (lStyle);
  258.   *p++ = 0;          // LOWORD (lExtendedStyle)
  259.   *p++ = 0;          // HIWORD (lExtendedStyle)
  260.   *p++ = 20;         // x
  261.   *p++ = 5;          // y
  262.   *p++ = 65;         // cx
  263.   *p++ = 45;         // cy
  264.   *p++ = 57;         // ID
  265.   /* fill in class i.d., this time by name */
  266.   /***** CUSTOM CONTROL
  267.   * Fill in the class name that is specified in the DLL
  268.   *  See the q_asamplesspincube sample for the source to this.
  269.   *****/
  270.   nchar = nCopyAnsiToWideChar (p, TEXT("Spincube"));
  271.   p += nchar;
  272.   /* copy the text of the second item, null terminate the string. */
  273.   nchar = nCopyAnsiToWideChar (p, TEXT(""));
  274.   p += nchar;
  275.   *p++ = 0;  // advance pointer over nExtraStuff WORD
  276.   CreateDialogIndirect (ghInst, (LPDLGTEMPLATE) pdlgtemplate, hwnd, (DLGPROC) About);
  277.   LocalFree (LocalHandle (pdlgtemplate));
  278.   return 0;
  279. }
  280. /*+++
  281.     Helper routine.  Take an input pointer, return closest
  282.      pointer that is aligned on a DWORD (4 byte) boundary.
  283. ---*/
  284. LPWORD lpwAlign ( LPWORD lpIn)
  285. {
  286.   ULONG ul;
  287.   ul = (ULONG) lpIn;
  288.   ul +=3;
  289.   ul >>=2;
  290.   ul <<=2;
  291.   return (LPWORD) ul;
  292. }
  293. /*+++
  294.     Helper routine.  Takes second parameter as Ansi string, copies
  295.      it to first parameter as wide character (16-bits / char) string,
  296.      and returns integer number of wide characters (words) in string
  297.      (including the trailing wide char NULL).
  298. ---*/
  299. int nCopyAnsiToWideChar (LPWORD lpWCStr, LPSTR lpAnsiIn)
  300. {
  301.   int cchAnsi = lstrlen(lpAnsiIn);
  302.   return MultiByteToWideChar(GetACP(), MB_PRECOMPOSED, lpAnsiIn, cchAnsi, lpWCStr, cchAnsi) + 1;
  303. }