home *** CD-ROM | disk | FTP | other *** search
/ CD Loisirs 18 / cd.iso / PLANETE / MUDWIN / SOURCE.ZIP / FRAME.C < prev    next >
C/C++ Source or Header  |  1994-09-03  |  18KB  |  687 lines

  1. //
  2. //  MODULE    Frame.c
  3. //
  4. //  PURPOSE    Window procedures for the top-most window
  5. //
  6. //  EXPORTS    FrameWndProc
  7. //
  8.  
  9. #include "defcon.h"
  10. #include "global.h"
  11. #pragma hdrstop
  12. #include <string.h>
  13.  
  14. /* Private constants.  */
  15. #define DESIRED_WINSOCK_VERSION  0x0101    // we'd like version 1.1.
  16.  
  17. /* note when we were last compiled */
  18. TS(Frame)
  19.  
  20. /* local procs */
  21. VOID NEAR SetToolBar(BOOL);
  22. VOID NEAR SetStatusLine(BOOL);
  23. VOID NEAR SetCommandLine(BOOL);
  24.  
  25. //  FUNCTION    AskAllChildren
  26. //
  27. //  PURPOSE    Send a message to all MDI children
  28. //
  29. //  PARAMETERS    None
  30. //
  31. //  RETURNS    TRUE if all children agree to the query,
  32. //              FALSE if any one of them disagrees
  33.  
  34. BOOL FAR 
  35. AskAllChildren(UINT nMessage, WPARAM wParam)
  36. {
  37.     register HWND   hwndT;
  38.  
  39.     for (hwndT = GetWindow(hClient, GW_CHILD); hwndT;
  40.          hwndT = GetWindow(hwndT, GW_HWNDNEXT)) {
  41.         /* Skip if an icon title window */
  42.         if (GetWindow(hwndT, GW_OWNER))
  43.             continue;
  44.         if (!SendMessage(hwndT, nMessage, wParam, 0L))
  45.             return FALSE;
  46.     }
  47.     return TRUE;
  48. }
  49.  
  50. //  FUNCTION    Frame_MDIMessageForwarder
  51. //
  52. //  PURPOSE    Forwards message to DefFrameProc
  53. //
  54. //  PARAMETERS    hwnd - Window handle
  55. //        nMessage - The message
  56. //        wParam - The first message parameter
  57. //        lParam - The second message parameter
  58. //
  59. //  RETURNS    LRESULT - Depends on the actual message
  60.  
  61. LRESULT 
  62. Frame_MDIMessageForwarder(HWND hwnd, UINT nMessage,
  63.               WPARAM wParam, LPARAM lParam)
  64. {
  65.     return DefFrameProc(hwnd, hClient, nMessage, wParam, lParam);
  66. }
  67.  
  68. //-------------------------------------------------------------------
  69.  
  70. #pragma argsused
  71. void NEAR 
  72. Frame_OnClose(HWND hwnd)
  73. {
  74.     /* don't close if any children cancel the operation */
  75.     if (AskAllChildren(WM_QUERYENDSESSION, 0))
  76.         DestroyWindow(hwnd);
  77. }
  78.  
  79. //-------------------------------------------------------------------
  80.  
  81. #pragma argsused
  82. VOID NEAR 
  83. Frame_OnCommand(HWND hwnd,
  84.         INT id,
  85.         HWND hwndCtl,
  86.         UINT codeNotify)
  87. {
  88.     switch (id) {
  89.     case IDM_FILE_NEW:
  90.         AddFile(NULL);
  91.         break;
  92.  
  93.     case IDM_FILE_OPEN:
  94.         //  Prompt the user for an existing file
  95.         {
  96.             char szFile[MAX_PATH];
  97.  
  98.             if (ShowFileBox(hMainWnd, FALSE,
  99.                     szFile, sizeof szFile))
  100.                 AddFile(szFile);
  101.                 }
  102.         break;
  103.  
  104.     case IDM_FILE_SAVEALL:
  105.         AskAllChildren(WM_COMMAND, IDM_FILE_SAVE);
  106.                 break;
  107.  
  108.     case IDM_FILE_SETUP:
  109.         ShowSetupBox(hwnd);
  110.         break;
  111.  
  112.     case IDM_FILE_EXIT:
  113.         PostMessage(hwnd, WM_CLOSE, 0, 0);
  114.         break;
  115.  
  116.     case IDM_OPTION_TOOLS:
  117.         SetToolBar(!(wFlags & SHOW_TOOLS));
  118.         break;
  119.  
  120.     case IDM_OPTION_STAT:
  121.         SetStatusLine(!(wFlags & SHOW_STATUS));
  122.         break;
  123.  
  124.     case IDM_OPTION_ABOVE:
  125.         SetCommandLine(!(wFlags & SHOW_ABOVE));
  126.         break;
  127.  
  128.     case IDM_WINDOW_CASCADE:
  129.         (void) FORWARD_WM_MDICASCADE(hClient, 0, SendMessage);
  130.         break;
  131.  
  132.     case IDM_WINDOW_TILE_VERTICALLY:
  133.         (void) FORWARD_WM_MDITILE(hClient, MDITILE_VERTICAL, SendMessage);
  134.         break;
  135.  
  136.     case IDM_WINDOW_TILE_HORIZONTALLY:
  137.         (void) FORWARD_WM_MDITILE(hClient, MDITILE_HORIZONTAL, SendMessage);
  138.         break;
  139.  
  140.     case IDM_WINDOW_ARRANGE_ICONS:
  141.         FORWARD_WM_MDIICONARRANGE(hClient, SendMessage);
  142.         break;
  143.  
  144.     case IDM_WINDOW_CLOSE_ALL:
  145.         AskAllChildren(WM_QUERYENDSESSION, 0);
  146.                 break;
  147.  
  148.     case IDM_HELP_ABOUT:
  149.         AboutDialog(hwnd);
  150.         break;
  151.  
  152.     case IDM_HELP_CONTENTS:
  153.         ShellExecute(hwnd, NULL, "mudwin.wri", NULL, ".",
  154.             SW_SHOWMAXIMIZED);
  155.         break;
  156.  
  157.     case IDM_FILE_PAGE:
  158.         MsgBox(MB_OK, IDS_NEXTTIME);
  159.         break;
  160.  
  161.     case IDM_FILE_SAVE:
  162.     case IDM_FILE_SAVEAS:
  163.     case IDM_FILE_PRINT:
  164.     case IDM_EDIT_UNDO:
  165.     case IDM_EDIT_CUT:
  166.     case IDM_EDIT_COPY:
  167.     case IDM_EDIT_PASTE:
  168.     case IDM_EDIT_SEND:
  169.     case IDM_EDIT_SELECT:
  170.     case IDM_EDIT_CLEAR:
  171.     case IDM_SEARCH_FIND:
  172.     case IDM_SEARCH_NEXT:
  173.     case IDM_SEARCH_PREV:
  174.     case IDM_SEARCH_REPLACE:
  175.     case IDM_SEARCH_ALTER:
  176.     case IDM_OPTION_LECHO:
  177.     case IDM_OPTION_MECHO:
  178.     case IDM_OPTION_WRAP:
  179.     case IDM_OPTION_FONT:
  180.     case IDM_OPTION_COLOR:
  181.         if (hActive)
  182.             FORWARD_WM_COMMAND(hActive, id, hwndCtl, codeNotify,
  183.                        SendMessage);
  184.         else
  185.             MsgBox(MB_ICONSTOP | MB_OK, IDS_DEBUGNOTE,
  186.                 (LPSTR) "No active window!");
  187.         break;
  188.  
  189.     default:
  190.         FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify,
  191.                    Frame_MDIMessageForwarder);
  192.         break;
  193.     }
  194. }
  195.  
  196. //-------------------------------------------------------------------
  197.  
  198. #pragma argsused
  199. BOOL NEAR 
  200. Frame_OnCreate(HWND hwnd,
  201.            CREATESTRUCT FAR * pCreateStruct)
  202. {
  203.     CLIENTCREATESTRUCT ccs;
  204.     WSADATA         wsadata;
  205.     SOCKERR         serr;
  206.     HDC             hdc;
  207.     TEXTMETRIC      tm;
  208.  
  209.     wFlags = GetPrivateInt(NULL,
  210.         "Session", "Options", SHOW_INITIAL);
  211. #ifndef SKIP_TCPIP
  212.     //  Initialize the sockets library
  213.     serr = WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata);
  214.  
  215.     if (serr != 0) {
  216.         MsgBox(MB_ICONSTOP | MB_OK, IDS_SOCKINIT,
  217.                serr, SockerrToString(serr));
  218.         return FALSE;
  219.     }
  220.     if (wsadata.wVersion != DESIRED_WINSOCK_VERSION) {
  221.         MsgBox(MB_ICONSTOP | MB_OK, IDS_SOCKVER,
  222.                LOBYTE(wsadata.wVersion),
  223.                HIBYTE(wsadata.wVersion),
  224.                LOBYTE(DESIRED_WINSOCK_VERSION),
  225.                HIBYTE(DESIRED_WINSOCK_VERSION));
  226.         return FALSE;
  227.     }
  228.     //  Save the WinSock description for the "About..." box
  229.     lpszWinSockDesc = (LPSTR) GlobalAllocPtr(GPTR,
  230.                      strlen(wsadata.szDescription) + 1);
  231.     _fstrcpy(lpszWinSockDesc, wsadata.szDescription);
  232. #else
  233.     lpszWinSockDesc = "Dummy WinSock Description";
  234. #endif
  235.  
  236.     //  Get textmetric data
  237.     hdc = GetDC(hwnd);
  238.     GetTextMetrics(hdc, &tm);
  239.     ReleaseDC(hwnd, hdc);
  240.  
  241. #ifndef SKIP_PRINT
  242.     if ((hdc = GetPrinterDC()) != 0)
  243.         DeleteDC(hdc);
  244. #endif
  245.  
  246.     //  Create the MDI client window
  247.     ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU);
  248.     ccs.idFirstChild = IDM_WINDOW_FIRST_CHILD;
  249.  
  250.     hClient = CreateWindow("mdiclient", NULL,
  251.                    WS_CHILD | WS_CLIPCHILDREN |
  252.                    WS_VSCROLL | WS_HSCROLL,
  253.                    0, 0, pCreateStruct->cx, pCreateStruct->cy,
  254.                    hwnd, 0, hInst, (LPSTR) & ccs);
  255.  
  256.     if (hClient == NULL)
  257.         return FALSE;
  258.  
  259.     hbrHilite = CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
  260.     hbrNormal = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  261.     hbrShadow = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
  262.     tmWidth  = tm.tmAveCharWidth;;
  263.     tmHeight = tm.tmHeight + tm.tmExternalLeading;
  264.     tmHt5 = tmHeight + 5;
  265.     tmHt6 = tmHeight + 6;
  266.     tmHt7 = tmHeight + 7;
  267.     tmHt8 = tmHeight + 8;
  268.  
  269.     //  Success!
  270.     ShowWindow(hClient, SW_SHOW);
  271.     return TRUE;
  272. }
  273.  
  274. //-------------------------------------------------------------------
  275.  
  276. #pragma argsused
  277. VOID NEAR 
  278. Frame_OnDestroy(HWND hwnd)
  279. {
  280. #ifndef SKIP_TCPIP
  281.     //  Disconnect from the sockets library before terminating
  282.     WSACleanup();
  283. #endif
  284.     if (hbrHilite)
  285.         DeleteObject(hbrHilite);
  286.     if (hbrNormal)
  287.         DeleteObject(hbrNormal);
  288.     if (hbrShadow)
  289.         DeleteObject(hbrShadow);
  290.     PostQuitMessage(0);
  291. }
  292.  
  293. //-------------------------------------------------------------------
  294.  
  295. #pragma argsused
  296. void NEAR 
  297. Frame_OnDevModeChange(HWND hwnd, LPCSTR lpszDeviceName)
  298. {
  299.     HDC             hdc;
  300.  
  301. #ifndef SKIP_PRINT
  302.     if ((hdc = GetPrinterDC()) != 0)
  303.         DeleteDC(hdc);
  304. #endif
  305. }
  306.  
  307. //-------------------------------------------------------------------
  308.  
  309. #pragma argsused
  310. void NEAR 
  311. Frame_OnDropFiles(HWND hwnd, HDROP hdrop)
  312. {
  313.     char            szFile[MAX_PATH];
  314.     WORD            i, n = DragQueryFile(hdrop, 0xFFFF, NULL, 0);
  315.  
  316.     for (i = 0; i < n; i++) {
  317.         DragQueryFile(hdrop, i, szFile, sizeof szFile);
  318.         AddFile(szFile);
  319.     }
  320.     DragFinish(hdrop);
  321. }
  322.  
  323. //-------------------------------------------------------------------
  324. //  FUNCTION   : Frame_OnEraseBkgnd(hwnd, hdc)
  325.  
  326. #pragma argsused
  327. BOOL NEAR
  328. Frame_OnEraseBkgnd(HWND hwnd, HDC hdc)
  329. {
  330.     return TRUE;
  331. }
  332.  
  333. //-------------------------------------------------------------------
  334. //  FUNCTION   : Frame_OnGetMinMaxInfo(hwnd, lpMinMaxInfo)
  335.  
  336. #pragma argsused
  337. void NEAR
  338. Frame_OnGetMinMaxInfo(HWND hwnd, MINMAXINFO FAR* lpMinMaxInfo)
  339. {
  340. #define OPT(F,V) ((wFlags & (F)) ? (V) : 0)
  341.     lpMinMaxInfo->ptMinTrackSize.x = 60 * tmWidth;
  342.     lpMinMaxInfo->ptMinTrackSize.y = 8 * tmHeight +
  343.         OPT(SHOW_TOOLS,48) + OPT(SHOW_STATUS,tmHt8);
  344. #undef OPT
  345. }
  346.  
  347. //-----------------------------------