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

Windows编程

开发平台:

Visual C++

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993-1997  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   ipxchat.c
  9. //
  10. //  PURPOSE:   Implement the windows procedure for the main application
  11. //    windows.  Also implement the generic message and command dispatchers.
  12. //
  13. //  FUNCTIONS:
  14. //    WndProc           - Processes messages for the main window.
  15. //    MsgCreate         - Initializes Edit Controls for text input/output.
  16. //    MsgSize           - Adjusts size of Edit Controls when window is resized.
  17. //    MsgSetfocus       - Keeps window focus on edit control instead of parent.
  18. //    MsgDataready      - Reads data from incoming IPC mechanism.
  19. //    MsgRefreshdisplay - Refills Inbox edit control text contents
  20. //    MsgDisconnected   - Cleans up connection killed by other side
  21. //    MsgCommand        - Handle the WM_COMMAND messages for the main window.
  22. //    MsgDestroy        - Handles the WM_DESTROY message by calling 
  23. //                        PostQuitMessage().
  24. //    CmdOutbox         - Handles messages from Outbox edit control.
  25. //    CmdDisconnected   - Disconnects current connection
  26. //    CmdExit           - Handles the file exit command by calling destory 
  27. //                        window on the main window.
  28. //
  29. //  COMMENTS:
  30. //
  31. #include <windows.h>            // required for all Windows applications
  32. #include <windowsx.h>
  33. #include <wsipx.h>
  34. #include "globals.h"            // prototypes specific to this application
  35. // Main window message table definition.
  36. MSD rgmsd[] =
  37. {
  38.     {WM_CREATE,         MsgCreate},
  39.     {WM_SIZE,           MsgSize},
  40.     {WM_SETFOCUS,       MsgSetfocus},
  41.     {WM_COMMAND,        MsgCommand},
  42.     {WM_DESTROY,        MsgDestroy},
  43.     {MW_DATAREADY,      MsgDataready},
  44.     {MW_DISCONNECTED,   MsgDisconnected},
  45.     {MW_DISPLAYREFRESH, MsgRefreshdisplay}
  46. };
  47. MSDI msdiMain =
  48. {
  49.     sizeof(rgmsd) / sizeof(MSD),
  50.     rgmsd,
  51.     edwpWindow
  52. };
  53. // Main window command table definition.
  54. CMD rgcmd[] =
  55. {
  56.     {IDM_CONNECT,    CmdConnect},
  57.     {IDM_LISTEN,     CmdListen},
  58.     {IDM_EXIT,       CmdExit},
  59.     {IDM_ABOUT,      CmdAbout},
  60.     {ID_OUTBOX,      CmdOutbox},
  61.     {IDM_DISCONNECT, CmdDisconnect}
  62. };
  63. CMDI cmdiMain =
  64. {
  65.     sizeof(rgcmd) / sizeof(CMD),
  66.     rgcmd,
  67.     edwpWindow
  68. };
  69. //
  70. //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
  71. //
  72. //  PURPOSE:  Processes messages for the main window.
  73. //
  74. //  PARAMETERS:
  75. //    hwnd     - window handle
  76. //    uMessage - message number
  77. //    wparam   - additional information (dependant on message number)
  78. //    lparam   - additional information (dependant on message number)
  79. //
  80. //  RETURN VALUE:
  81. //    The return value depends on the message number.  If the message
  82. //    is implemented in the message dispatch table, the return value is
  83. //    the value returned by the message handling function.  Otherwise,
  84. //    the return value is the value returned by the default window procedure.
  85. //
  86. //  COMMENTS:
  87. //    Call the DispMessage() function with the main window's message dispatch
  88. //    information (msdiMain) and the message specific information.
  89. //
  90. LRESULT CALLBACK WndProc(HWND   hwnd, 
  91.                          UINT   uMessage, 
  92.                          WPARAM wparam, 
  93.                          LPARAM lparam)
  94. {
  95.     return DispMessage(&msdiMain, hwnd, uMessage, wparam, lparam);
  96. }
  97. //
  98. //  FUNCTION: MsgCreate(HWND, UINT, WPARAM, LPARAM)
  99. //
  100. //  PURPOSE: Creates Inbox and Outbox Edit controls
  101. //
  102. //  PARAMETERS:
  103. //
  104. //    hwnd      - Window handle
  105. //    uMessage  - Message number (Unused)
  106. //    wparam    - Extra data     (Unused)
  107. //    lparam    - Extra data     (Unused)
  108. //
  109. //  RETURN VALUE:
  110. //
  111. //    Always returns 0 - Message handled
  112. //
  113. //  COMMENTS:
  114. //
  115. //
  116. LRESULT MsgCreate(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  117. {
  118.     // Create Edit control for typing to be sent to server
  119.     hOutWnd = CreateWindow("EDIT",
  120.                            NULL,
  121.                            WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | 
  122.                            ES_MULTILINE | ES_AUTOVSCROLL,
  123.                            0,0,0,0,
  124.                            hwnd,
  125.                            (HMENU) ID_OUTBOX,
  126.                            (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
  127.                            0);
  128.     // Create Edit control for typing to be received from server
  129.     hInWnd = CreateWindow("EDIT",
  130.                           NULL,
  131.                           WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | 
  132.                           ES_MULTILINE | ES_AUTOVSCROLL,
  133.                           0,0,0,0,
  134.                           hwnd,
  135.                           (HMENU) ID_INBOX,
  136.                           (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
  137.                           0);
  138.     return (TRUE);
  139. }
  140. //
  141. //  FUNCTION: MsgSize(HWND, UINT, WPARAM, LPARAM)
  142. //
  143. //  PURPOSE: Adjust Size of Inbox and Outbox Edit controls
  144. //
  145. //  PARAMETERS:
  146. //
  147. //    hwnd      - Window handle
  148. //    uMessage  - Message number (Unused)
  149. //    wparam    - Extra data     (Unused)
  150. //    lparam    - Parent Window Size
  151. //
  152. //  RETURN VALUE:
  153. //
  154. //    Always returns 0 - Message handled
  155. //
  156. //  COMMENTS:
  157. //
  158. //
  159. LRESULT MsgSize(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  160. {
  161.     // Size OutBox Edit Control
  162.     MoveWindow(hOutWnd,
  163.                1,1,                    // Upper Left Corner
  164.                LOWORD(lparam) - 2,         // Width of Parent Window
  165.                (HIWORD(lparam) / 2) - 2 ,     // Half the height of Parent
  166.                TRUE);                  // repaint
  167.     // Size Inbox Edit Control
  168.     MoveWindow(hInWnd,
  169.                1, (HIWORD(lparam) / 2) + 1,  // Half Way down right side
  170.                LOWORD(lparam) - 2,         // Width of Parent Window
  171.                (HIWORD(lparam) / 2) - 2,      // Half the height of Parent
  172.                TRUE);                  // repaint
  173.     return (TRUE);
  174. }
  175. //
  176. //  FUNCTION: MsgSetfocus(HWND, UINT, WPARAM, LPARAM)
  177. //
  178. //  PURPOSE: Keeps Window focus on edit control
  179. //
  180. //  PARAMETERS:
  181. //
  182. //    hwnd      - Window handle
  183. //    uMessage  - Message number (Unused)
  184. //    wparam    - Extra data     (Unused)
  185. //    lparam    - Extra data     (Unused)
  186. //
  187. //  RETURN VALUE:
  188. //
  189. //    Always returns 0 - Message handled
  190. //
  191. //  COMMENTS:
  192. //
  193. //
  194. LRESULT MsgSetfocus(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  195. {
  196.     SetFocus(hOutWnd);  // Don't let main window have focus
  197.     return (TRUE);
  198. }
  199. //
  200. //  FUNCTION: MsgDataready(HWND, UINT, WPARAM, LPARAM)
  201. //
  202. //  PURPOSE: Read data and post message to display data
  203. //
  204. //  PARAMETERS:
  205. //
  206. //    hwnd      - Window handle
  207. //    uMessage  - Message number (Unused)
  208. //    wparam    - forwarded to ReceiveInBox
  209. //    lparam    - forwarded to ReceiveInBox
  210. //
  211. //  RETURN VALUE:
  212. //
  213. //    Always returns 0 - Message handled
  214. //
  215. //  COMMENTS:
  216. //
  217. //
  218. LRESULT MsgDataready(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  219. {
  220.     // Call protocol specific program to Read data and put in szRcvBuf
  221.     if(ReceiveInBox(hwnd, wparam, lparam, szRcvBuf, sizeof(szRcvBuf)))
  222.     {
  223.         PostMessage(hwnd, MW_DISPLAYREFRESH, 0, 0);
  224.     }
  225.     return(TRUE);
  226. }
  227. //
  228. //  FUNCTION: MsgRefreshdisplay(HWND, UINT, WPARAM, LPARAM)
  229. //
  230. //  PURPOSE: Display socket data in inbox
  231. //
  232. //  PARAMETERS:
  233. //
  234. //    hwnd      - Window handle
  235. //    uMessage  - Message number (Unused)
  236. //    wparam    - Extra Data     (Unused)
  237. //    lparam    - Extra Data     (Unused)
  238. //
  239. //  RETURN VALUE:
  240. //
  241. //    Always returns 0 - Message handled
  242. //
  243. //  COMMENTS:
  244. //
  245. //
  246. LRESULT MsgRefreshdisplay(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  247. {
  248.     MSG peekmsg;
  249.     // Don't bother displaying if there is already another update queued
  250.     if(PeekMessage(&peekmsg, hwnd, MW_DATAREADY, MW_DISPLAYREFRESH, PM_NOREMOVE))
  251.     {
  252.        return(TRUE);                          
  253.     }
  254.     // Put data in szRcvBuf in InBox
  255.     SendDlgItemMessage(hwnd,
  256.                        ID_INBOX,
  257.                        EM_SETSEL,
  258.                        0,-1);
  259.     SendDlgItemMessage(hwnd,
  260.                        ID_INBOX,
  261.                        EM_REPLACESEL,
  262.                        0,
  263.                        (LPARAM)szRcvBuf);
  264.     return(TRUE);
  265. }
  266. //
  267. //  FUNCTION: MsgDisconnected(HWND, UINT, WPARAM, LPARAM)
  268. //
  269. //  PURPOSE: Cleanup connection dropped from other side
  270. //
  271. //  PARAMETERS:
  272. //
  273. //    hwnd      - Window handle
  274. //    uMessage  - Message number (Unused)
  275. //    wparam    - Extra data     (Unused)
  276. //    lparam    - Extra data     (Unused)
  277. //
  278. //  RETURN VALUE:
  279. //
  280. //    Always returns 0 - Message handled
  281. //
  282. //  COMMENTS:
  283. //
  284. //
  285. LRESULT MsgDisconnected(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  286. {
  287.     HMENU hmenu;
  288.     // Let the user know
  289.     MessageBox(hwnd,
  290.                "Connection Disconnected",
  291.                "Chat Dialog Stopped",
  292.                MB_OK);
  293.     // Protocol Specific Cleanup
  294.     CleanUp();
  295.     // Fix menus
  296.     hmenu = GetMenu(hwnd);
  297.     EnableMenuItem(hmenu, IDM_CONNECT, MF_ENABLED);
  298.     EnableMenuItem(hmenu, IDM_LISTEN, MF_ENABLED);
  299.     EnableMenuItem(hmenu, IDM_DISCONNECT, MF_GRAYED);
  300.     SetWindowText(hwnd, szTitle);
  301.     return(TRUE);
  302. }
  303. //
  304. //  FUNCTION: MsgCommand(HWND, UINT, WPARAM, LPARAM)
  305. //
  306. //  PURPOSE: Handle the WM_COMMAND messages for the main window.
  307. //
  308. //  PARAMETERS:
  309. //    hwnd     - window handle
  310. //    uMessage - WM_COMMAND (Unused)
  311. //    GET_WM_COMMAND_ID(wparam, lparam)   - Command identifier
  312. //    GET_WM_COMMAND_HWND(wparam, lparam) - Control handle
  313. //
  314. //  RETURN VALUE:
  315. //    The return value depends on the message number.  If the message
  316. //    is implemented in the message dispatch table, the return value is
  317. //    the value returned by the message handling function.  Otherwise,
  318. //    the return value is the value returned by the default window procedure.
  319. //
  320. //  COMMENTS:
  321. //    Call the DispCommand() function with the main window's command dispatch
  322. //    information (cmdiMain) and the command specific information.
  323. //
  324. LRESULT MsgCommand(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  325. {
  326.     return DispCommand(&cmdiMain, hwnd, wparam, lparam);
  327. }
  328. //
  329. //  FUNCTION: MsgDestroy(HWND, UINT, WPARAM, LPARAM)
  330. //
  331. //  PURPOSE: Calls PostQuitMessage().
  332. //
  333. //  PARAMETERS:
  334. //
  335. //    hwnd      - Window handle  (Unused)
  336. //    uMessage  - Message number (Unused)
  337. //    wparam    - Extra data     (Unused)
  338. //    lparam    - Extra data     (Unused)
  339. //
  340. //  RETURN VALUE:
  341. //
  342. //    Always returns 0 - Message handled
  343. //
  344. //  COMMENTS:
  345. //
  346. //
  347. LRESULT MsgDestroy(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  348. {
  349.     PostQuitMessage(0);
  350.     return 0;
  351. }
  352. //
  353. //  FUNCTION: CmdOutbox(HWND, WORD, WORD, HWND)
  354. //
  355. //  PURPOSE: Handle messages from Outbox--Send data if EN_CHANGE
  356. //
  357. //  PARAMETERS:
  358. //    hwnd     - The window.
  359. //    wCommand - ID_OUTBOX (unused)
  360. //    wNotify  - Notification number (unused)
  361. //    hwndCtrl - NULL (unused)
  362. //
  363. //  RETURN VALUE:
  364. //    Always returns 0 - command handled.
  365. //
  366. //  COMMENTS:
  367. //
  368. //
  369. LRESULT CmdOutbox(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  370. {
  371.     int cSendLen;
  372.     if (wNotify != EN_CHANGE)  // We only care if text has changed
  373.     {
  374.         return 0;
  375.     }
  376.     // Text has changed!  Put OutBox's text in szSndBuf
  377.     cSendLen = GetDlgItemText(hwnd,
  378.                               ID_OUTBOX,
  379.                               szSndBuf,
  380.                               sizeof(szSndBuf));
  381.     // Do protocol specific send
  382.     SendOutBox(szSndBuf, cSendLen);
  383.     return 0;
  384. }
  385. //
  386. //  FUNCTION: CmdDisconnect(HWND, WORD, WORD, HWND)
  387. //
  388. //  PURPOSE: Cut off session and fix menus appropriately
  389. //
  390. //  PARAMETERS:
  391. //    hwnd     - The window.
  392. //    wCommand - ID_OUTBOX (unused)
  393. //    wNotify  - Notification number (unused)
  394. //    hwndCtrl - NULL (unused)
  395. //
  396. //  RETURN VALUE:
  397. //    Always returns 0 - command handled.
  398. //
  399. //  COMMENTS:
  400. //
  401. //
  402. LRESULT CmdDisconnect(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  403. {
  404.     HMENU hmenu;
  405.     // Protocol Specific cleanup
  406.     CleanUp();
  407.     // Fix menus
  408.     hmenu = GetMenu(hwnd);
  409.     EnableMenuItem(hmenu, IDM_CONNECT, MF_ENABLED);
  410.     EnableMenuItem(hmenu, IDM_LISTEN, MF_ENABLED);
  411.     EnableMenuItem(hmenu, IDM_DISCONNECT, MF_GRAYED);
  412.     SetWindowText(hwnd, szTitle);
  413.     return 0;
  414. }
  415. //
  416. //  FUNCTION: CmdExit(HWND, WORD, WORD, HWND)
  417. //
  418. //  PURPOSE: Exit the application.
  419. //
  420. //  PARAMETERS:
  421. //    hwnd     - The window.
  422. //    wCommand - IDM_EXIT            (unused)
  423. //    wNotify  - Notification number (unused)
  424. //    hwndCtrl - NULL                (unused)
  425. //
  426. //  RETURN VALUE:
  427. //    Always returns 0 - command handled.
  428. //
  429. //  COMMENTS:
  430. //
  431. //
  432. LRESULT CmdExit(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  433. {
  434.     DestroyWindow(hwnd);
  435.     return 0;
  436. }