home *** CD-ROM | disk | FTP | other *** search
/ Desktop Works 1995 - 1996 / desktopworks1995-1996.iso / animator / child.c < prev    next >
C/C++ Source or Header  |  1996-01-01  |  18KB  |  691 lines

  1. #include "animator.h"
  2.  
  3.  
  4. static char szAllPurpose [MAX_FILE_SIZE];
  5.  
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9.  
  10. BOOL NEAR PASCAL Child_OnCreate (HWND, LPCREATESTRUCT);
  11. VOID NEAR PASCAL Child_OnSize (HWND, UINT, short, short);            
  12. VOID NEAR PASCAL Child_OnSetFocus (HWND, HWND);
  13. VOID NEAR PASCAL Child_OnMDIActivate (HWND, BOOL, HWND, HWND);
  14. VOID NEAR PASCAL Child_OnCommand (HWND, UINT, HWND, UINT); 
  15. VOID NEAR PASCAL Child_OnDestroy (HWND);
  16. VOID NEAR PASCAL Child_OnClose(HWND);
  17. BOOL NEAR PASCAL Child_OnQueryEndSession (HWND);
  18. LONG NEAR PASCAL Child_OnDrawItem (HWND, const DRAWITEMSTRUCT FAR *);
  19. LONG NEAR PASCAL Child_OnMeasureItem (HWND, LPMEASUREITEMSTRUCT);
  20. VOID NEAR PASCAL Child_OnDropFiles (HWND, HDROP);
  21.  
  22. short NEAR PASCAL FigureOutWhereToInsert (HWND, LPPOINT);
  23. BOOL NEAR PASCAL InsertIconImage (short, HWND, short, LPSTR);
  24. BOOL NEAR PASCAL AddIconImage (short, HWND, LPSTR);
  25. VOID NEAR PASCAL HandleSelectionState (const DRAWITEMSTRUCT FAR *);
  26. VOID NEAR PASCAL HandleFocusState (const DRAWITEMSTRUCT FAR *);
  27.  
  28. #ifdef __cplusplus
  29. }
  30. #endif
  31.  
  32.  
  33. //////////////////////////////////////////////////////////////////////////
  34. //  ChildProc - Handles all of the messages for the Child animation
  35. //  window which shows all of the icons and their file names.
  36. //  The window procedure makes use of Message Crackers, a new
  37. //  idea introduced in the header file WINDOWSX.H.  Using this file
  38. //  is a good way to preserve your code for changes in upcoming versions
  39. //  of Windows, where types and parameters change.
  40. //////////////////////////////////////////////////////////////////////////
  41.  
  42. LRESULT _export CALLBACK ChildProc(WNDPROC_PARAMS)
  43. {
  44.     switch (uMsg) 
  45.     {
  46.         HANDLE_MSG (hWnd, WM_CREATE, Child_OnCreate);
  47.         HANDLE_MSG (hWnd, WM_SIZE, Child_OnSize);
  48.         HANDLE_MSG (hWnd, WM_SETFOCUS, Child_OnSetFocus);
  49.         HANDLE_MSG (hWnd, WM_MDIACTIVATE, Child_OnMDIActivate);
  50.         HANDLE_MSG (hWnd, WM_COMMAND, Child_OnCommand);
  51.         HANDLE_MSG (hWnd, WM_DRAWITEM, Child_OnDrawItem);
  52.         HANDLE_MSG (hWnd, WM_MEASUREITEM, Child_OnMeasureItem);
  53.         HANDLE_MSG (hWnd, WM_DESTROY, Child_OnDestroy);
  54.         HANDLE_MSG (hWnd, WM_CLOSE, Child_OnClose);
  55.         HANDLE_MSG (hWnd, WM_QUERYENDSESSION, Child_OnQueryEndSession);
  56.         HANDLE_MSG (hWnd, WM_DROPFILES, Child_OnDropFiles);
  57.     }
  58.  
  59.     return DefMDIChildProc(hWnd, uMsg, wParam, lParam);
  60. }
  61.             
  62.  
  63.  
  64. //////////////////////////////////////////////////////////////////////////
  65. //  Child_OnCreate() - Creates the listbox and initializes the data
  66. //  structure and window words for this window.
  67. //////////////////////////////////////////////////////////////////////////
  68.  
  69. BOOL NEAR PASCAL Child_OnCreate (HWND hwnd, LPCREATESTRUCT lpCS)
  70. {
  71.     short i,j;
  72.     HWND  hwndList = CreateWindow ("LISTBOX","",
  73.                                      WS_CHILD|WS_VISIBLE|
  74.                                      LBS_NOINTEGRALHEIGHT|
  75.                                      LBS_OWNERDRAWFIXED|LBS_HASSTRINGS|
  76.                                      LBS_NOTIFY|WS_VSCROLL|WS_BORDER,
  77.                                      0,0,0,0,hwnd,
  78.                                      IDD_LISTBOX, _hInst, NULL);
  79.     if (!IsWindow (hwndList)) 
  80.     {
  81.         return FALSE;
  82.     }
  83.  
  84.     SendMessage (hwndList, WM_SETFONT, GetStockFont(ANSI_VAR_FONT),0L);
  85.     DragAcceptFiles (hwnd, TRUE);
  86.  
  87.     i = (short)((LPMDICREATESTRUCT)lpCS->lpCreateParams)->lParam;
  88.     
  89.     SET_HWNDLIST (hwnd, hwndList);   // next three are window words.   
  90.     SET_WINDOWNUM (hwnd, i);
  91.     SET_ISDIRTY (hwnd, FALSE);   
  92.     SET_EXELOADED (i, FALSE);        // rest are in data structure.
  93.     SET_AUTOANIMATE (i, FALSE);
  94.     SZFILENAME(i)[0] = '\0';
  95.     SZEXELINK(i)[0] = '\0';
  96.     SET_HWNDANIM(i, hwnd);  
  97.     SET_INDEX (i, 0);
  98.     SET_NUMICONS (i, 0);
  99.     SET_TIMEINT (i, 100);   
  100.     
  101.  
  102.     for (j=0; j<(short)MAXICONS ; j++)
  103.     {
  104.         HICONS(i)[j] = NULL;
  105.     }
  106.  
  107.     UPDATE_STATBAR;
  108.  
  109.     return TRUE;
  110. }
  111.  
  112.  
  113.  
  114. //////////////////////////////////////////////////////////////////////////
  115. //  Child_OnSize() - Moves listbox accordingly, and sets column width.
  116. //////////////////////////////////////////////////////////////////////////
  117.  
  118. VOID NEAR PASCAL Child_OnSize (HWND hwnd, UINT wSizeType, short cx, short cy)            
  119. {
  120.     
  121.     if (LB_ERR==(WORD)SendMessage(HWNDLIST(hwnd),LB_SETCOLUMNWIDTH,cx-2,0L))
  122.     {
  123.         MESSAGE (IDS_ListBoxSize);
  124.     }
  125.  
  126.     MoveWindow(HWNDLIST(hwnd), 0, 0, cx, cy, TRUE);
  127.  
  128.     DefMDIChildProc(hwnd, WM_SIZE, (WPARAM)wSizeType, MAKELPARAM(cx,cy));
  129. }
  130.  
  131.  
  132.  
  133. //////////////////////////////////////////////////////////////////////////
  134. //  Child_OnDropFiles() - Handles the Drag-n-Drop protocol that File
  135. //  Manager in Windows 3.1 makes available to us.
  136. //////////////////////////////////////////////////////////////////////////
  137.  
  138. VOID NEAR PASCAL Child_OnDropFiles (HWND hwnd, HDROP hDrop)
  139. {
  140.     short  sChild   = WINDOWNUM (hwnd);
  141.     HWND   hwndList = HWNDLIST (hwnd);
  142.     short  sNumDrop = (short)DragQueryFile (hDrop,(WORD)-1,NULL,0);
  143.  
  144.     if (ISANIMATING(sChild))
  145.     {
  146.         MESSAGE (IDS_NoDropOnWhileAnimate);
  147.         return;
  148.     }
  149.  
  150.     if (sNumDrop > 0)
  151.     {
  152.         short i;
  153.         short sInsert;
  154.         POINT pt;
  155.         char   szDropFile [MAX_FILE_SIZE];    
  156.  
  157.         // get the point of up-click.  If up-click over an existing
  158.         // listbox entry, insert the files there.  Else, append.
  159.  
  160.         DragQueryPoint (hDrop, (LPPOINT)&pt);
  161.  
  162.         sInsert = FigureOutWhereToInsert (hwndList, (LPPOINT)&pt);
  163.         
  164.         for (i=0 ; i<(short)sNumDrop ; i++)
  165.         {
  166.             DragQueryFile (hDrop, i, (LPSTR)szDropFile, MAX_FILE_SIZE);
  167.  
  168.             if (sInsert < 0)
  169.             {
  170.                 AddIconImage (sChild, hwndList, (LPSTR)szDropFile);
  171.             }
  172.             else
  173.             {
  174.                 InsertIconImage (sChild, hwndList, sInsert, (LPSTR)szDropFile);
  175.             }    
  176.                         
  177.             SET_ISDIRTY (hwnd, TRUE);
  178.         }
  179.     }
  180. }
  181.  
  182.         
  183.  
  184. //////////////////////////////////////////////////////////////////////////
  185. //  Child_OnSetFocus() - Sets focus to the listbox.
  186. //////////////////////////////////////////////////////////////////////////
  187.  
  188. VOID NEAR PASCAL Child_OnSetFocus (HWND hwnd, HWND hwndPrev)
  189. {
  190.     SetFocus(HWNDLIST(hwnd));
  191. }
  192.  
  193.  
  194.  
  195. //////////////////////////////////////////////////////////////////////////
  196. //  Child_OnMDIActivate() - Sets up the menu accordingly, and updates
  197. //  the status bar, since the new active child may have a totally
  198. //  different state.
  199. //////////////////////////////////////////////////////////////////////////
  200.  
  201. VOID NEAR PASCAL Child_OnMDIActivate (HWND hwnd, BOOL bActive, 
  202.     HWND hwndActive, HWND hwndDeActive)
  203. {
  204.     SendMessage(_hwndClient, WM_MDISETMENU, (WPARAM)0,
  205.         bActive ? MAKELPARAM(_hmenuChild, _hmenuChildWindow)
  206.                 : MAKELPARAM(_hmenuMain, _hmenuMainWindow));
  207.  
  208.     DrawMenuBar(_hwndFrame);
  209.  
  210.     UPDATE_STATBAR;
  211.  
  212.     if (bActive)
  213.     {
  214.         SetFocus (hwnd);
  215.     }
  216.     
  217.     DefMDIChildProc(hwnd, WM_MDIACTIVATE, (WPARAM)bActive, 
  218.         MAKELPARAM(hwndActive,hwndDeActive));
  219. }
  220.  
  221.  
  222.  
  223. //////////////////////////////////////////////////////////////////////////
  224. //  Child_OnCommand() - Handles all of the command processing specific
  225. //  to an animation.
  226. //////////////////////////////////////////////////////////////////////////
  227.  
  228. VOID NEAR PASCAL Child_OnCommand (HWND hwnd, UINT uMsg, 
  229.         HWND hChild, UINT uExtra) 
  230. {
  231.     short sChild = WINDOWNUM(hwnd);
  232.  
  233.     switch (uMsg) 
  234.     {
  235.         case IDM_SETTINGS:
  236.         {
  237.             if (DialogBox (_hInst, SETTINGSDLG, hwnd, _lpfnSettings))
  238.             {
  239.                 UPDATE_STATBAR;
  240.                 SET_ISDIRTY (hwnd, TRUE);
  241.  
  242.                 if (AUTOANIMATE (sChild))
  243.                 {
  244.                     PostMessage (hwnd, WM_COMMAND, IDM_GO, 0L);
  245.                 }
  246.             }
  247.             break;
  248.         }
  249.  
  250.         case IDM_GO:
  251.         {            
  252.             if (!NUMICONS(sChild))
  253.             {
  254.                 MESSAGE (IDS_NoIcons);
  255.                 break;
  256.             }
  257.  
  258.             if (!TIMEINT(sChild) || !SZEXELINK(sChild)[0])
  259.             {
  260.                 SendMessage (_hwndFrame, WM_COMMAND, IDM_SETTINGS, 0L);
  261.             }
  262.  
  263.             if (SZEXELINK(sChild) && TIMEINT(sChild))
  264.             {
  265.                 // Free old icon handles before creating new ones.
  266.                 // 
  267.                 DeletePreviousHandles (hwnd);
  268.                 SetupIconHandles (hwnd);
  269.                 SET_INDEX (sChild, 0);
  270.                 SET_ISANIMATING (sChild, TRUE);
  271.             }
  272.  
  273.             break;
  274.         }
  275.  
  276.         case IDM_STOP:
  277.         {
  278.             SET_ISANIMATING (sChild, FALSE);
  279.  
  280.             if (IsWindow (HWNDTARGET(sChild)))
  281.             {
  282.                 SetClassWord (HWNDTARGET(sChild), GCW_HICON, 
  283.                     HPREVICON(sChild));
  284.  
  285.                 InvalidateAll (HWNDTARGET(sChild),HPREVICON(sChild));
  286.             }
  287.  
  288.             break ;
  289.         }       
  290.          
  291.         case IDM_SAVE:
  292.         case IDM_SAVEAS:
  293.         {
  294.             SaveIconsToFile (hwnd, uMsg);
  295.             SET_ISDIRTY (h