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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2. *            
  3. *     FILE:     ICONPRO.C
  4. *
  5. *     PURPOSE:  IconPro Project main C file
  6. *
  7. *     COMMENTS: This file contains the main window and instance handing
  8. *               for this project.
  9. *
  10. *     FUNCTIONS:
  11. *      EXPORTS: 
  12. *               GetSaveIconFileName     - Get the name of the file to write
  13. *               GetOpenIconFileName     - Get the name of a file to open
  14. *      LOCALS:
  15. *               WinMain                 - Program entry point
  16. *               InitApplication         - Register classes
  17. *               InitInstance            - Create windows
  18. *               WndProc                 - Main Window's 'Window Procedure'
  19. *               OnCommand               - Handle command messages (menu items)
  20. *               AboutDlgProc            - About Dialog Box's 'Window Procedure'
  21. *               CreateNewMDIChildWindow - Creates a new child MDI window
  22. *               UpdateMenuState         - Grays/enables appropriate menu items
  23. *               QueryCloseAllChildren   - Close all children if possible
  24. *
  25. *     Copyright 1995 - 1997 Microsoft Corp.
  26. *
  27. *
  28. * History:
  29. *                July '95 - Created
  30. *
  31. ****************************************************************************/
  32. #include <Windows.H>
  33. #include "Resource.h"
  34. #include "Icons.H"
  35. #include "IconPro.h"
  36. #include "MDIChild.h"
  37. /****************************************************************************/
  38. /* Local Function Prototypes */
  39. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow);
  40. BOOL InitApplication( HANDLE hInstance );
  41. BOOL InitInstance( HANDLE hInstance, int nCmdShow );
  42. LRESULT CALLBACK WndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam );
  43. LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
  44. BOOL CALLBACK AboutDlgProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
  45. HWND CreateNewMDIChildWindow( LPSTR szTitle, LPVOID lpData );
  46. BOOL UpdateMenuState( HWND hWnd, HMENU hMenu );
  47. BOOL QueryCloseAllChildren( void );
  48. /****************************************************************************/
  49. /****************************************************************************/
  50. /* Global Variables */
  51. HINSTANCE hInst;
  52. HWND        hWndMain, hMDIClientWnd;
  53. char        szAppName[] = TEXT("IconPro");
  54. char        szTitle[] = TEXT("IconPro Icon Handler");
  55. char        szChildClassName[] = TEXT("IconChildClass");
  56. char        szHelpFileName[] = "IconPro.HLP";
  57. /****************************************************************************/
  58. /****************************************************************************
  59. *
  60. *     FUNCTION: WinMain
  61. *
  62. *     PURPOSE:  Main entry point for this app
  63. *
  64. *     PARAMS:   HANDLE hInstance     - This instance
  65. *               HANDLE hPrevInstance - Previous instance
  66. *               LPSTR  lpszCmdLine   - Command Line
  67. *               int    nCmdShow      - Desired window status
  68. *
  69. *     RETURNS:  int - return code
  70. *
  71. * History:
  72. *                July '95 - Created
  73. *
  74. ****************************************************************************/
  75. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
  76. {
  77.     MSG msg;
  78.     // standard init stuff
  79.     if( ! hPrevInstance )
  80.     {
  81.         if( ! InitApplication( hInstance ) )
  82.         {
  83.             return FALSE;
  84.         }
  85.     }
  86.     if( ! InitInstance( hInstance, nCmdShow ) )
  87.     {
  88.         return FALSE;
  89.     }
  90.     // Standard message loop
  91.     while (GetMessage(&msg, (HWND) NULL, 0, 0)) 
  92.     {
  93.         if( !TranslateMDISysAccel(hMDIClientWnd, &msg) )
  94.         {
  95.             TranslateMessage(&msg);
  96.             DispatchMessage(&msg);
  97.         }
  98.     }
  99.     return msg.wParam;
  100. }
  101. /* End WinMain() ************************************************************/
  102. /****************************************************************************
  103. *
  104. *     FUNCTION: InitApplication
  105. *
  106. *     PURPOSE:  Register classes
  107. *
  108. *     PARAMS:   HANDLE hInstance     - This instance
  109. *
  110. *     RETURNS:  BOOL - TRUE for success, FALSE for failure
  111. *
  112. * History:
  113. *                July '95 - Created
  114. *
  115. ****************************************************************************/
  116. BOOL InitApplication( HANDLE hInstance )
  117. {
  118.     WNDCLASS    wc;
  119.     BOOL        bResult;
  120.     wc.style         = 0;
  121.     wc.lpfnWndProc   = (WNDPROC)WndProc;
  122.     wc.cbClsExtra    = 0;
  123.     wc.cbWndExtra    = 0;
  124.     wc.hInstance     = hInstance;
  125.     wc.hIcon         = LoadIcon( hInstance, MAKEINTRESOURCE(ICONPRO_ICON) );
  126.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  127.     wc.hbrBackground = NULL;
  128.     wc.lpszMenuName  = MAKEINTRESOURCE(ICONPRO_MENU);
  129.     wc.lpszClassName = szAppName;
  130.     bResult = RegisterClass( &wc );
  131.     wc.lpfnWndProc   = (WNDPROC)IconChildWndProc;
  132.     wc.cbClsExtra    = 0;
  133.     wc.cbWndExtra    = 0;
  134.     wc.hInstance     = hInstance;
  135.     wc.hIcon         = LoadIcon( hInstance, MAKEINTRESOURCE(ICONPRO_ICON) );
  136.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  137.     wc.hbrBackground = CreateSolidBrush(COLOR_3DFACE);
  138.     wc.lpszMenuName  = NULL;
  139.     wc.lpszClassName = szChildClassName;
  140.     return( bResult && RegisterClass( &wc ) );
  141. }
  142. /* End InitApplication() ***************************************************/
  143. /****************************************************************************
  144. *
  145. *     FUNCTION: InitInstance
  146. *
  147. *     PURPOSE:  Create and show the main window
  148. *
  149. *     PARAMS:   HANDLE hInstance  - This instance
  150. *               int    nCmdShow   - desired show state
  151. *
  152. *     RETURNS:  BOOL - TRUE for success, FALSE for failure
  153. *
  154. * History:
  155. *                July '95 - Created
  156. *
  157. ****************************************************************************/
  158. BOOL InitInstance( HANDLE hInstance, int nCmdShow )
  159. {
  160.     hInst = hInstance;
  161.     hWndMain = CreateWindow(
  162.         szAppName,
  163.         szTitle,
  164.         WS_OVERLAPPEDWINDOW,
  165.         CW_USEDEFAULT, 0,
  166.         CW_USEDEFAULT, 0,
  167.         NULL,
  168.         NULL,
  169.         hInstance,
  170.         NULL );
  171.     if( hWndMain == NULL )
  172.     {
  173.         return FALSE;
  174.     }
  175.     ShowWindow( hWndMain, nCmdShow );
  176.     UpdateWindow( hWndMain );
  177.     return TRUE;
  178. }
  179. /* End InitInstance() *****************************************************/
  180. /****************************************************************************
  181. *
  182. *     FUNCTION: WndProc
  183. *
  184. *     PURPOSE:  Window Procedure for the main window.
  185. *
  186. *     PARAMS:   HWND   hWnd    - This window
  187. *               UINT   Message - Which message?
  188. *               WPARAM wParam  - message parameter
  189. *               LPARAM lParam  - message parameter
  190. *
  191. *     RETURNS:  LRESULT - depends on message
  192. *
  193. * History:
  194. *                July '95 - Created
  195. *
  196. ****************************************************************************/
  197. LRESULT CALLBACK WndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam )
  198. {
  199.     // which message are we handling?
  200.     switch( Message )
  201.     {
  202.         // Menu is coming up, initialize it
  203.         case WM_INITMENU:
  204.             UpdateMenuState( hWnd, (HMENU)wParam );
  205.             return 1;
  206.         break; // end WM_INITMENU
  207.         // Window is being created, create the MDI client also
  208.         case WM_CREATE:
  209.         {
  210.             CLIENTCREATESTRUCT ccs;
  211.             // Retrieve the handle of the Window menu and assign the
  212.             // first child window identifier.
  213.             ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd), 2 );
  214.             ccs.idFirstChild = IDM_WINDOWCHILD;
  215.             // Create the MDI client window
  216.             hMDIClientWnd = CreateWindow( TEXT("MDICLIENT"), (LPCTSTR) NULL,
  217.                                             WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
  218.                                             0, 0, 0, 0, hWnd, (HMENU) 0xCAC, hInst, (LPSTR) &ccs );
  219.             ShowWindow(hMDIClientWnd, SW_SHOW);
  220.         }
  221.         break; // End WM_CREATE
  222.         // Command Messages (menu items, etc)
  223.         case WM_COMMAND:
  224.             OnCommand( hWnd, wParam, lParam );
  225.             return DefFrameProc( hWnd, hMDIClientWnd, Message, wParam, lParam );
  226.         break; // End WM_COMMAND
  227.         // Time to close down now :(
  228.         case WM_CLOSE:
  229.         {
  230.             // Will the children allow it? (Give 'em a chance to cancel)
  231.             if( QueryCloseAllChildren() )
  232.             {
  233.                 WinHelp( hWnd, szHelpFileName, HELP_QUIT, 0 );
  234.                 DestroyWindow( hWnd );
  235.                 PostQuitMessage( 0 );
  236.                 return DefFrameProc( hWnd, hMDIClientWnd, Message, wParam, lParam );
  237.             }
  238.             return 0;
  239.         }
  240.         break; // End WM_CLOSE
  241.         // Pass it on to the default window procedure
  242.         default:
  243.             return DefFrameProc( hWnd, hMDIClientWnd, Message, wParam, lParam );
  244.         break; // end default
  245.     }
  246.     return DefFrameProc( hWnd, hMDIClientWnd, Message, wParam, lParam );
  247. }
  248. /* End WndProc() ***********************************************************/
  249. /****************************************************************************
  250. *
  251. *     FUNCTION: OnCommand
  252. *
  253. *     PURPOSE:  Handles command messages for main window
  254. *
  255. *     PARAMS:   HWND   hWnd    - This window
  256. *               WPARAM wParam  - message parameter
  257. *               LPARAM lParam  - message parameter
  258. *
  259. *     RETURNS:  LRESULT - depends on message
  260. *
  261. * History:
  262. *                July '95 - Created
  263. *
  264. ****************************************************************************/
  265. LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam )
  266. {
  267.     // Which command is it?
  268.     switch( LOWORD( wParam ) )
  269.     {
  270.         // File->New menu option - spawn a new child
  271.         case ID_FILE_NEW:
  272.         {
  273.             HWND    hWndNew;
  274.             hWndNew = CreateNewMDIChildWindow( TEXT("Untitled"), NULL );
  275.             SendMessage( hMDIClientWnd, WM_MDIACTIVATE, (WPARAM)hWndNew, 0 );
  276.         }
  277.         break; // End ID_FILE_NEW
  278.         // File->Open menu option - open an ICO file
  279.         case ID_FILE_OPEN:
  280.         {
  281.             HWND            hWndNew;
  282.             LPICONRESOURCE lpIR;
  283.             TCHAR         szFileName[MAX_PATH];
  284.             TCHAR         szFileTitle[MAX_PATH];
  285.             // Get the name of the file to open
  286.             if( GetOpenIconFileName( szFileName, IDS_FILTERSTRING, "Open Icon File" ) )
  287.             {
  288.                 // Read in the icon data
  289.                 if( (lpIR = ReadIconFromICOFile( szFileName )) == NULL )
  290.                     break;
  291.                 // Get the name of the file for the window title
  292.                 if( GetFileTitle( szFileName, szFileTitle, MAX_PATH ) )
  293.                     break;
  294.                 // Make a new child to handle this icon
  295.                 hWndNew = CreateNewMDIChildWindow( szFileTitle, lpIR );
  296.                 SendMessage( hMDIClientWnd, WM_MDIACTIVATE, (WPARAM)hWndNew, 0 );
  297.             }
  298.         }
  299.         break; // End ID_FILE_OPEN
  300.         // File->Extract menu option - extract icon data from a DLL or EXE
  301.         case ID_FILE_EXTRACT:
  302.         {
  303.             HWND            hWndNew;
  304.             LPICONRESOURCE lpIR;
  305.             TCHAR         szFileName[MAX_PATH];
  306.             // Get the name of the file from which to extract the icon
  307.             if( GetOpenIconFileName( szFileName, IDS_EXEFILTERSTRING, "Extract Icon from File" ) )
  308.             {
  309.                 // Extract the icon data
  310.                 if( (lpIR = ReadIconFromEXEFile( szFileName )) == NULL )
  311.                     break;
  312.                 // Make a new child to handle this icon
  313.                 hWndNew = CreateNewMDIChildWindow( ("Untitled"), lpIR );
  314.                 SendMessage( hMDIClientWnd, WM_MDIACTIVATE, (WPARAM)hWndNew, 0 );
  315.             }
  316.         }
  317.         break; // End ID_FILE_EXTRACT
  318.         // File->Save and File->SaveAs menu options - save current ICO file to disk
  319.         case ID_FILE_SAVEAS:
  320.         case ID_FILE_SAVE:
  321.         {
  322.             HWND    hWndActive;
  323.             
  324.             // Get the active MDI child window
  325.             if( (hWndActive = (HWND)SendMessage( hMDIClientWnd, WM_MDIGETACTIVE, 0, 0 )) != NULL )
  326.             {
  327.                 // Tell it to write its icon to disk
  328.                 SendMessage( hWndActive, WM_COMMAND, wParam, 0 );
  329.             }
  330.             else
  331.                 MessageBox( hWnd, TEXT("Error Getting Active Window"), TEXT("Error"), MB_OK );
  332.         }
  333.         break; // End ID_FILE_SAVE/ID_FILE_SAVEAS
  334.         // File->Close menu option - close the current MDI child window
  335.         case ID_FILE_CLOSE:
  336.         {
  337.             HWND    hWndActive;
  338.             // Get the active MDI child window and tell it to close itself
  339.             if( (hWndActive = (HWND)SendMessage( hMDIClientWnd, WM_MDIGETACTIVE, 0, 0)) != NULL )
  340.                 SendMessage( hWndActive, WM_CLOSE, 0, lParam );
  341.         }
  342.         break; // End ID_FILE_CLOSE
  343.         // File->Exit menu option - shut 'er down
  344.         case ID_F_EXIT:
  345.             // Just send a WM_CLOSE - code there will handle it
  346.             PostMessage( hWnd, WM_CLOSE, (WPARAM)0, (LPARAM)0 );
  347.         break; // End ID_F_EXIT
  348.         // Edit->Import BMP and Edit->Stretch-Import BMP - convert BMP file to icon
  349.         // Edit->Copy, Edit->Paste, Edit->StretchPaste, Edit->AddFormat, Edit->RemoveFormat
  350.         // menu options. Just pass 'em on to the currently active MDI child window
  351.         case ID_EDIT_EXPORTBMP:
  352.         case ID_EDIT_IMPORTBMP:
  353.         case ID_EDIT_STRETCHIMPORTBMP:
  354.         case ID_EDIT_COPY:
  355.         case ID_EDIT_PASTE:
  356.         case ID_EDIT_STRETCHPASTE:
  357.         case ID_EDIT_ADDFORMAT:
  358.         case ID_EDIT_REMOVEFORMAT:
  359.         {
  360.             HWND    hWndActive;
  361.             
  362.             // Get active MDI child
  363.             if( (hWndActive = (HWND)SendMessage( hMDIClientWnd, WM_MDIGETACTIVE, 0, 0 )) != NULL )
  364.             {
  365.                 // Pass the message along
  366.                 SendMessage( hWndActive, WM_COMMAND, wParam, 0 );
  367.             }
  368.         }
  369.         break; // End ID_EDIT_XXXX
  370.         // Window->ArrangeIcons menu option
  371.         case ID_WINDOW_ARRANGEICONS:
  372.             // Ask the MDIClient to do it
  373.             SendMessage( hMDIClientWnd, WM_MDIICONARRANGE, 0, 0);
  374.         break; // End ID_WINDOW_ARRANGEICONS
  375.         // Window->Cascade menu option
  376.         case ID_WINDOW_CASCADE:
  377.             // Ask the MDIClient to do it
  378.             SendMessage( hMDIClientWnd, WM_MDICASCADE, 0, 0);
  379.         break; // End ID_WINDOW_CASCADE
  380.         // Window->Tile menu option
  381.         case ID_WINDOW_TILE:
  382.             // Ask the MDIClient to do it
  383.             SendMessage( hMDIClientWnd, WM_MDITILE, (WPARAM)MDITILE_HORIZONTAL, 0);
  384.         break; // End ID_WINDOW_TILE
  385.         // Window->TileVertical menu option
  386.         case ID_WINDOW_TILEVERTICAL:
  387.             // Ask the MDIClient to do it
  388.             SendMessage( hMDIClientWnd, WM_MDITILE, (WPARAM)MDITILE_VERTICAL, 0);
  389.         break; // End ID_WINDOW_TILEVERTICAL
  390.         
  391.         // Help->About menu option
  392.         case ID_HELP_ABOUT:
  393.             // Launch the About Dialog
  394.             DialogBox( hInst, MAKEINTRESOURCE(ICONPRO_ABOUT_DLG), hWnd, AboutDlgProc );
  395.         break;
  396.         case ID_HELP_CONTENTS:
  397.                 WinHelp( hWnd, szHelpFileName, HELP_CONTENTS, 0 );
  398.         break;
  399.     }
  400.     return 0l;
  401. }
  402. /* End OnCommand() *********************************************************/
  403. /****************************************************************************
  404. *
  405. *     FUNCTION: AboutDlgProc
  406. *
  407. *     PURPOSE:  Handles messages for About Dialog
  408. *
  409. *     PARAMS:   HWND   hWnd    - This window
  410. *               UINT   Msg     - Which message?
  411. *               WPARAM wParam  - message parameter
  412. *               LPARAM lParam  - message parameter
  413. *
  414. *     RETURNS:  BOOL - depends on message
  415. *
  416. * History:
  417. *                July '95 - Created
  418. *
  419. ****************************************************************************/
  420. BOOL CALLBACK AboutDlgProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
  421. {
  422.     switch( Msg )
  423.     {
  424.         case WM_INITDIALOG:
  425.         break;
  426.         case WM_CLOSE:
  427.             PostMessage( hWnd, WM_COMMAND, IDCANCEL, 0l );
  428.         break;
  429.         case WM_COMMAND:
  430.             switch( LOWORD(wParam) )
  431.             {
  432.                 case IDOK:
  433.                     EndDialog( hWnd, TRUE );
  434.                 break;
  435.                 case IDCANCEL:
  436.                     EndDialog( hWnd, FALSE );
  437.                 break;
  438.             }
  439.         break;
  440.         default:
  441.             return FALSE;
  442.         break;
  443.     }
  444.     return TRUE;
  445. }
  446. /* End AboutDlgProc() ******************************************************/
  447. /****************************************************************************
  448. *
  449. *     FUNCTION: CreateNewMDIChildWindow
  450. *
  451. *     PURPOSE:  Creates and shows a new MDI child window
  452. *
  453. *     PARAMS:   LPSTR  szTitle - The title for the new window
  454. *               LPVOID lpData  - Data to attach to the window (icon info)
  455. *
  456. *     RETURNS:  HWND - Handle to the new MDI child window
  457. *
  458. * History:
  459. *                July '95 - Created
  460. *
  461. ****************************************************************************/
  462. HWND CreateNewMDIChildWindow( LPTSTR szTitle, LPVOID lpData )
  463. {
  464.     HWND    hReturnWnd;
  465.     // Create the MDI child window
  466.     hReturnWnd = CreateMDIWindow( szChildClassName, szTitle, 0,
  467.                     CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT,
  468.                     hMDIClientWnd, hInst, (LPARAM)lpData );
  469.     // Show it
  470.     ShowWindow( hReturnWnd, SW_SHOW );
  471.     return hReturnWnd;
  472. }
  473. /* End CreateNewMDIChildWindow() ********************************************/
  474. /****************************************************************************
  475. *
  476. *     FUNCTION: GetOpenIconFileName
  477. *
  478. *     PURPOSE:  Prompts user for the filename for opening
  479. *
  480. *     PARAMS:   LPSTR   szFileName     - Buffer to receive name of file
  481. *               UINT    FilterStringID - ID of filter string
  482. *               LPCTSTR szTitle        - Title for the Dialog
  483. *
  484. *     RETURNS:  BOOL - TRUE for success, FALSE for failure
  485. *
  486. * History:
  487. *                July '95 - Created
  488. *
  489. ****************************************************************************/
  490. BOOL GetOpenIconFileName( LPTSTR szFileName, UINT FilterStringID, LPCTSTR szTitle )
  491. {
  492.     OPENFILENAME    ofn;
  493.     UINT            i, cbString;
  494.     TCHAR         chReplace;
  495.     TCHAR         szFilter[256];
  496.     // Get the filter string
  497.     if ((cbString = LoadString( hInst, FilterStringID, szFilter, sizeof(szFilter))) == 0 ) 
  498.         return FALSE;
  499.     // Replace the wildcard with NULL
  500.     chReplace = szFilter[cbString - 1]; /* retrieve wildcard */
  501.     for (i = 0; szFilter[i] != ''; i++) 
  502.     {
  503.         if (szFilter[i] == chReplace)
  504.             szFilter[i] = '';
  505.     }
  506.     // Fill out the OPENFILENAME struct
  507.     ZeroMemory( &ofn, sizeof( OPENFILENAME ) );
  508.     ofn.lStructSize = sizeof( OPENFILENAME );
  509.     ofn.hwndOwner = hWndMain;
  510.     ofn.hInstance = hInst;
  511.     lstrcpy( szFileName, TEXT("") );
  512.     ofn.lpstrFile = szFileName;
  513.     ofn.nMaxFile = MAX_PATH;
  514.     ofn.Flags = OFN_FILEMUSTEXIST;
  515.     ofn.lpstrFilter = szFilter;
  516.     ofn.lpstrTitle = szTitle;
  517.     // Use the common dialog
  518.     return GetOpenFileName( &ofn );
  519. }
  520. /* End GetOpenIconFileName() ***********************************************/
  521. /****************************************************************************
  522. *
  523. *     FUNCTION: GetSaveIconFileName
  524. *
  525. *     PURPOSE:  Prompts user for the filename for saving
  526. *
  527. *     PARAMS:   LPSTR   szFileName     - Buffer to receive name of file
  528. *               UINT    FilterStringID - ID of filter string
  529. *               LPCTSTR szTitle        - Title for the Dialog
  530. *
  531. *     RETURNS:  BOOL - TRUE for success, FALSE for failure
  532. *
  533. * History:
  534. *                July '95 - Created
  535. *
  536. ****************************************************************************/
  537. BOOL GetSaveIconFileName( LPTSTR szFileName, UINT FilterStringID, LPCTSTR szTitle )
  538. {
  539.     OPENFILENAME    ofn;
  540.     UINT            i, cbString;
  541.     TCHAR         chReplace;
  542.     TCHAR         szFilter[256];
  543.     // Get the filter string
  544.     if ((cbString = LoadString( hInst, FilterStringID, szFilter, sizeof(szFilter))) == 0 ) 
  545.         return FALSE;
  546.     // Replace the wildcard with NULL
  547.     chReplace = szFilter[cbString - 1]; /* retrieve wildcard */
  548.     for (i = 0; szFilter[i] != ''; i++) 
  549.     {
  550.         if (szFilter[i] == chReplace)
  551.             szFilter[i] = '';
  552.     }
  553.     // Fill out the OPENFILENAME struct
  554.     ZeroMemory( &ofn, sizeof( OPENFILENAME ) );
  555.     ofn.lStructSize = sizeof( OPENFILENAME );
  556.     ofn.hwndOwner = hWndMain;
  557.     ofn.hInstance = hInst;
  558.     lstrcpy( szFileName, TEXT("") );
  559.     ofn.lpstrFile = szFileName;
  560.     ofn.nMaxFile = MAX_PATH;
  561.     ofn.Flags = OFN_OVERWRITEPROMPT;
  562.     ofn.lpstrFilter = szFilter;
  563.     ofn.lpstrDefExt = TEXT("ICO");
  564.     ofn.lpstrTitle = szTitle;
  565.     // Use the common dialog
  566.     return GetSaveFileName( &ofn );
  567. }
  568. /* End GetSaveIconFileName() ***********************************************/
  569. /****************************************************************************
  570. *
  571. *     FUNCTION: UpdateMenuState
  572. *
  573. *     PURPOSE:  Updates states of menu items (called on menu activation)
  574. *
  575. *     PARAMS:   HWND  hWnd  - Handle to the window
  576. *               HMENU hMenu - Handle to the menu
  577. *
  578. *     RETURNS:  BOOL - TRUE for success, FALSE for failure
  579. *
  580. * History:
  581. *                July '95 - Created
  582. *
  583. ****************************************************************************/
  584. BOOL UpdateMenuState( HWND hWnd, HMENU hMenu )
  585. {
  586.     UINT    nEnableFlag, nNumFormats;
  587.     HWND    hWndActive;
  588.     // Get a handle to the active MDI child window
  589.     hWndActive=(HWND)SendMessage( hMDIClientWnd, WM_MDIGETACTIVE, 0, 0 );
  590.     // Find out how many icon image formats it holds
  591.     nNumFormats = SendMessage( hWndActive, WM_COMMAND, ID_GETNUMFORMATS, 0 );
  592.     // Do we actually have an active window?
  593.     if( hWndActive == NULL )
  594.     {
  595.         // No active MDI child...
  596.         EnableMenuItem( hMenu, ID_FILE_NEW, MF_BYCOMMAND | MF_ENABLED );
  597.         EnableMenuItem( hMenu, ID_FILE_OPEN, MF_BYCOMMAND | MF_ENABLED );
  598.         EnableMenuItem( hMenu, ID_FILE_EXTRACT, MF_BYCOMMAND | MF_ENABLED );
  599.         EnableMenuItem( hMenu, ID_FILE_CLOSE, MF_BYCOMMAND | MF_GRAYED );
  600.         EnableMenuItem( hMenu, ID_FILE_SAVE, MF_BYCOMMAND | MF_GRAYED );
  601.         EnableMenuItem( hMenu, ID_FILE_SAVEAS, MF_BYCOMMAND | MF_GRAYED );
  602.         EnableMenuItem( hMenu, ID_F_EXIT, MF_BYCOMMAND | MF_ENABLED );
  603.         EnableMenuItem( hMenu, ID_EDIT_COPY, MF_BYCOMMAND| MF_GRAYED );
  604.         EnableMenuItem( hMenu, ID_EDIT_PASTE, MF_BYCOMMAND | MF_GRAYED );
  605.         EnableMenuItem( hMenu, ID_EDIT_STRETCHPASTE, MF_BYCOMMAND | MF_GRAYED );
  606.         EnableMenuItem( hMenu, ID_EDIT_ADDFORMAT, MF_BYCOMMAND | MF_GRAYED );
  607.         EnableMenuItem( hMenu, ID_EDIT_IMPORTBMP, MF_BYCOMMAND | MF_GRAYED );
  608.         EnableMenuItem( hMenu, ID_EDIT_STRETCHIMPORTBMP, MF_BYCOMMAND | MF_GRAYED );
  609.         EnableMenuItem( hMenu, ID_EDIT_EXPORTBMP, MF_BYCOMMAND | MF_GRAYED );
  610.         EnableMenuItem( hMenu, ID_EDIT_REMOVEFORMAT, MF_BYCOMMAND | MF_GRAYED );
  611.         EnableMenuItem( hMenu, ID_WINDOW_ARRANGEICONS, MF_BYCOMMAND | MF_GRAYED );
  612.         EnableMenuItem( hMenu, ID_WINDOW_CASCADE, MF_BYCOMMAND | MF_GRAYED );
  613.         EnableMenuItem( hMenu, ID_WINDOW_TILE, MF_BYCOMMAND | MF_GRAYED );
  614.         EnableMenuItem( hMenu, ID_WINDOW_TILEVERTICAL, MF_BYCOMMAND | MF_GRAYED );
  615.     }
  616.     else
  617.     {
  618.         // We have an active MDI child...
  619.         EnableMenuItem( hMenu, ID_FILE_NEW, MF_BYCOMMAND | MF_ENABLED );
  620.         EnableMenuItem( hMenu, ID_FILE_OPEN, MF_BYCOMMAND | MF_ENABLED );
  621.         EnableMenuItem( hMenu, ID_FILE_EXTRACT, MF_BYCOMMAND | MF_ENABLED );
  622.         EnableMenuItem( hMenu, ID_FILE_CLOSE, MF_BYCOMMAND | MF_ENABLED );
  623.         nEnableFlag = (BOOL)SendMessage( hWndActive, WM_COMMAND, ID_HASFILECHANGED, 0 ) ? MF_ENABLED : MF_GRAYED;
  624.         EnableMenuItem( hMenu, ID_FILE_SAVE, MF_BYCOMMAND | nEnableFlag );
  625.         EnableMenuItem( hMenu, ID_FILE_SAVEAS, MF_BYCOMMAND | MF_ENABLED );
  626.         EnableMenuItem( hMenu, ID_F_EXIT, MF_BYCOMMAND | MF_ENABLED );
  627.         EnableMenuItem( hMenu, ID_EDIT_COPY, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  628.         if( IsClipboardFormatAvailable( CF_DIB ) )
  629.         {
  630.             EnableMenuItem( hMenu, ID_EDIT_PASTE, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  631.             EnableMenuItem( hMenu, ID_EDIT_STRETCHPASTE, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  632.         }
  633.         else
  634.         {
  635.             EnableMenuItem( hMenu, ID_EDIT_PASTE, MF_BYCOMMAND | MF_GRAYED );
  636.             EnableMenuItem( hMenu, ID_EDIT_STRETCHPASTE, MF_BYCOMMAND | MF_GRAYED );
  637.         }
  638.         EnableMenuItem( hMenu, ID_EDIT_IMPORTBMP, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  639.         EnableMenuItem( hMenu, ID_EDIT_STRETCHIMPORTBMP, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  640.         EnableMenuItem( hMenu, ID_EDIT_EXPORTBMP, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  641.         EnableMenuItem( hMenu, ID_EDIT_ADDFORMAT, MF_BYCOMMAND | MF_ENABLED );
  642.         EnableMenuItem( hMenu, ID_EDIT_REMOVEFORMAT, MF_BYCOMMAND | (nNumFormats>0)?MF_ENABLED:MF_GRAYED );
  643.         EnableMenuItem( hMenu, ID_WINDOW_ARRANGEICONS, MF_BYCOMMAND | MF_ENABLED );
  644.         EnableMenuItem( hMenu, ID_WINDOW_CASCADE, MF_BYCOMMAND | MF_ENABLED );
  645.         EnableMenuItem( hMenu, ID_WINDOW_TILE, MF_BYCOMMAND | MF_ENABLED );
  646.         EnableMenuItem( hMenu, ID_WINDOW_TILEVERTICAL, MF_BYCOMMAND | MF_ENABLED );
  647.     }
  648.     return TRUE;
  649. }
  650. /* End UpdateMenuState() ***************************************************/
  651. /****************************************************************************
  652. *
  653. *  FUNCTION   : QueryCloseAllChildren()
  654. *
  655. *  PURPOSE    : Asks the child windows if it is ok to close up app. Nothing
  656. *               is destroyed at this point. The z-order is not changed.
  657. *
  658. *  PARAMS:     : none
  659. *
  660. *
  661. *  RETURNS    : TRUE - If all children agree to the query.
  662. *               FALSE- If any one of them disagrees.
  663. *
  664. ***************************************************************************/
  665. BOOL QueryCloseAllChildren( void )
  666. {
  667.     register HWND hwndT;
  668.     for( hwndT = GetWindow(hMDIClientWnd, GW_CHILD); hwndT; hwndT = GetWindow (hwndT, GW_HWNDNEXT) )
  669.     {
  670.         if( GetWindow( hwndT, GW_OWNER ) )
  671.             continue;
  672.         if( SendMessage( hwndT, WM_CLOSE, 0, 0L ) )
  673.             return FALSE;
  674.     }
  675.     return TRUE;
  676. }
  677. /* End QueryCloseAllChildren() **********************************************/