SELECT.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:    select.c
  9. //
  10. //  PURPOSE:   Displays the "Select" dialog box
  11. //
  12. //  FUNCTIONS:
  13. //    CmdSelect          - Displays the "Select" dialog box
  14. //    Select             - Processes messages for "Select" dialog box.
  15. //    MsgSelectInit      - Sets up event message notification for socket
  16. //    MsgSelectDataReady - Process socket event message notifications
  17. //    MsgSelectCommand   - Process WM_COMMAND message sent to the select box.
  18. //    CmdSelectDone      - Free the select box and related data.
  19. //    CmdSelectOK        - Request Peer session
  20. //    CmdSelectList      - Enables/Disables OK button
  21. //
  22. //  COMMENTS:
  23. //
  24. //
  25. #include <windows.h>            // required for all Windows applications
  26. #include <windowsx.h>
  27. #include <wsipx.h>              // IPX Sockets defs
  28. #include <wsnetbs.h>
  29. #include <nspapi.h>
  30. #include "globals.h"            // prototypes specific to this application
  31. LRESULT CALLBACK Select(HWND, UINT, WPARAM, LPARAM);
  32. LRESULT MsgSelectInit(HWND, UINT, WPARAM, LPARAM);
  33. LRESULT MsgSelectCommand(HWND, UINT, WPARAM, LPARAM);
  34. LRESULT MsgSelectDataReady(HWND, UINT, WPARAM, LPARAM);
  35. LRESULT CmdSelectDone(HWND, WORD, WORD, HWND);
  36. LRESULT CmdSelectOK(HWND, WORD, WORD, HWND);
  37. LRESULT CmdSelectList(HWND, WORD, WORD, HWND);
  38. // Select dialog message table definition.
  39. MSD rgmsdSelect[] =
  40. {
  41.     {WM_COMMAND,    MsgSelectCommand},
  42.     {WM_INITDIALOG, MsgSelectInit},
  43.     {MW_DATAREADY,  MsgSelectDataReady}
  44. };
  45. MSDI msdiSelect =
  46. {
  47.     sizeof(rgmsdSelect) / sizeof(MSD),
  48.     rgmsdSelect,
  49.     edwpNone
  50. };
  51. // Select dialog command table definition.
  52. CMD rgcmdSelect[] =
  53. {
  54.     {IDOK,     CmdSelectOK},
  55.     {IDCANCEL, CmdSelectDone},
  56.     {SD_LIST,  CmdSelectList}
  57. };
  58. CMDI cmdiSelect =
  59. {
  60.     sizeof(rgcmdSelect) / sizeof(CMD),
  61.     rgcmdSelect,
  62.     edwpNone
  63. };
  64. // Module specific "globals"  Used when a variable needs to be
  65. // accessed in more than on handler function.
  66. HFONT hFontCopyright;
  67. //
  68. //  FUNCTION: CmdSelect(HWND, WORD, WORD, HWND)
  69. //
  70. //  PURPOSE: Displays the "Select" dialog box
  71. //
  72. //  PARAMETERS:
  73. //    hwnd      - Window handle
  74. //    wCommand  - IDM_Select (unused)
  75. //    wNotify   - Notification number (unused)
  76. //    hwndCtrl  - NULL (unused)
  77. //
  78. //  RETURN VALUE:
  79. //
  80. //    Always returns 0 - Message handled
  81. //
  82. //  COMMENTS:
  83. //    To process the IDM_Select message, call DialogBox() to display the
  84. //    Select dialog box.
  85. LRESULT CmdSelect(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  86. {
  87.     char outtext[80];
  88.     if (DialogBox(hInst, "SelectBox", hwnd, (DLGPROC)Select))
  89.     {
  90.         // reset socket event messaging to point at the main window
  91.         if (WSAAsyncSelect(MySock.sock, hwnd, MW_DATAREADY, FD_READ | FD_CLOSE) == SOCKET_ERROR)
  92.         {
  93.             // I hate it when this happens!
  94.             wsprintf(outtext, GetStringRes(IDS_ERR_WSAASYNCSELECT),
  95.                      WSAGetLastError());
  96.             MessageBox(hwnd, outtext, NULL, MB_OK);
  97.             return 0;
  98.         }
  99.         // We've got a connection...set up menu and title bar
  100.         EnableMenuItem(GetMenu(hwnd), IDM_END_CHAT, MF_ENABLED);
  101.         EnableMenuItem(GetMenu(hwnd), IDM_DISCONNECT_SERVER, MF_ENABLED);
  102.         EnableMenuItem(GetMenu(hwnd), IDM_CONNECT, MF_GRAYED);
  103.         wsprintf(outtext, GetStringRes(IDS_CHATTING_REMOTE), MySock.name, peername);
  104.         SetWindowText(hwnd, outtext);
  105.         // we're now ready to rumble
  106.     }
  107.     else
  108.     {
  109.         // clean up
  110.         closesocket(MySock.sock);
  111.         EnableMenuItem(GetMenu(hwnd), IDM_END_CHAT, MF_GRAYED);
  112.         EnableMenuItem(GetMenu(hwnd), IDM_DISCONNECT_SERVER, MF_GRAYED);
  113.         EnableMenuItem(GetMenu(hwnd), IDM_CONNECT, MF_ENABLED);
  114.         SetWindowText(hwnd, szTitle);
  115.     }
  116.     return 0;
  117. }
  118. //
  119. //  FUNCTION: Select(HWND, UINT, WPARAM, LPARAM)
  120. //
  121. //  PURPOSE:  Processes messages for "Select" dialog box.
  122. //
  123. //  PARAMETERS:
  124. //    hdlg - window handle of the dialog box
  125. //    wMessage - type of message
  126. //    wparam - message-specific information
  127. //    lparam - message-specific information
  128. //
  129. //  RETURN VALUE:
  130. //    TRUE - message handled
  131. //    FALSE - message not handled
  132. //
  133. //  COMMENTS:
  134. //
  135. //     Display version information from the version section of the
  136. //     application resource.
  137. //
  138. //     Wait for user to click on "Ok" button, then close the dialog box.
  139. //
  140. LRESULT CALLBACK Select(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  141. {
  142.     return DispMessage(&msdiSelect, hdlg, uMessage, wparam, lparam);
  143. }
  144. //
  145. //  FUNCTION: MsgSelectInit(HWND, UINT, WPARAM, LPARAM)
  146. //
  147. //  PURPOSE: Sets up socket message notifications
  148. //
  149. //  PARAMETERS:
  150. //    hwnd - The window handing the message.
  151. //    uMessage - The message number. (unused).
  152. //    wparam - Message specific data (unused).
  153. //    lparam - Message specific data (unused).
  154. //
  155. //  RETURN VALUE:
  156. //    Always returns 0 - message handled.
  157. //
  158. //  COMMENTS:
  159. //    Uses WSAAsyncSelect() to have socket event notifications sent
  160. //    to the Select Dialog Window
  161. //
  162. LRESULT MsgSelectInit(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  163. {
  164.     // Center the dialog over the application window
  165.     CenterWindow(hdlg, GetWindow(hdlg, GW_OWNER));
  166.     if(WSAAsyncSelect(MySock.sock, hdlg, MW_DATAREADY, FD_READ | FD_CLOSE) != 0)
  167.     {
  168.         // ERROR  do something
  169.     }
  170.     return TRUE;
  171. }
  172. //
  173. //  FUNCTION: MsgSelectDataReady(HWND, UINT, WPARAM, LPARAM)
  174. //
  175. //  PURPOSE: Processes incoming messages from server
  176. //
  177. //  PARAMETERS:
  178. //    hwnd - The window handing the message.
  179. //    uMessage - The message number. (unused).
  180. //    wparam - Message specific data (unused).
  181. //    lparam - Message specific data (unused).
  182. //
  183. //  RETURN VALUE:
  184. //    Always returns 0 - message handled.
  185. //
  186. //  COMMENTS:
  187. //    Receive message and then process command in message header
  188. //
  189. LRESULT MsgSelectDataReady(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  190. {
  191.     int iIndex;
  192.     char displaytext[128];
  193.     // First check to see if connection was closed
  194.     if(LOWORD(lparam) == FD_CLOSE)
  195.     {
  196.         // Connection closed kill our socket
  197.         closesocket(MySock.sock);
  198.         MessageBox(hdlg, GetStringRes(IDS_ERR_CONNECTION_DROPPED), NULL, MB_OK);
  199.         // Fix menus
  200.         EnableMenuItem(GetMenu(GetParent(hdlg)), IDM_CONNECT, MF_ENABLED);
  201.         EnableMenuItem(GetMenu(GetParent(hdlg)), IDM_DISCONNECT_SERVER, MF_GRAYED);
  202.         EnableMenuItem(GetMenu(GetParent(hdlg)), IDM_END_CHAT, MF_GRAYED);
  203.         EndDialog(hdlg, FALSE);
  204.         return 0;
  205.     }
  206.     // receive the message
  207.     if(!recvdatamessage(&MySock, &xferbuf))
  208.     {
  209.         return 0;
  210.     }
  211.     // We've got our whole message!  Now switch on the command flag
  212.     switch(xferbuf.hdr.command)
  213.     {
  214.         case REGISTER_NAME:
  215.             // Add name to list box
  216.             SendMessage(GetDlgItem(hdlg, SD_LIST), LB_ADDSTRING, 0, (LPARAM)&xferbuf.data);
  217.             break;
  218.         case DEREGISTER_NAME:
  219.             // Remove name from list box
  220.             if((iIndex = SendMessage(GetDlgItem(hdlg, SD_LIST),
  221.                                      LB_FINDSTRING,
  222.                                      (UINT)-1, (LPARAM)&xferbuf.data)) != LB_ERR)
  223.             {
  224.                 // found the index to the item...delete it!
  225.                 SendMessage(GetDlgItem(hdlg, SD_LIST), LB_DELETESTRING, iIndex, 0);
  226.             }
  227.             break;
  228.         case REQUEST_SESSION:
  229.           // Someone is asking us for a chat session
  230.             lstrcpy(displaytext, xferbuf.data);
  231.             lstrcat(displaytext,
  232.                     GetStringRes(IDS_REQUESTS_CHAT));
  233.             if(MessageBox(hdlg, displaytext,
  234.                           GetStringRes(IDS_SESSION_REQUEST), MB_OKCANCEL) == IDOK)
  235.             {
  236.                 // save the name of the peer
  237.                 lstrcpy(peername, xferbuf.data);
  238.                 // We've got ourselves a session!  Send response
  239.                 xferbuf.hdr.command = SESSION_REQUEST_RESPONSE;
  240.                 *(xferbuf.data) = 1;    // Flag to say we accept this session
  241.                 senddatamessage(MySock.sock, &xferbuf);
  242.                 EndDialog(hdlg, TRUE);  // kill the dialog
  243.                 return 0;
  244.             }
  245.             else
  246.             {
  247.                 // We're obviously to stuck up to accept a session
  248.             // from this lowlife...send the denial message
  249.                 xferbuf.hdr.command = SESSION_REQUEST_RESPONSE;
  250.                 *(xferbuf.data) = 0;    // Flag to deny session
  251.                 xferbuf.hdr.length = HDRSIZE;
  252.                 senddatamessage(MySock.sock, &xferbuf);
  253.                 return 0;
  254.             }
  255.             break;  // should never get here
  256.         case SESSION_REQUEST_RESPONSE:
  257.           // Someone responded to our session request!
  258.             if (MySock.status != SOCKSTAT_REQSESSION)
  259.             {
  260.                 return 0;  // we didn't expect this...drop packet
  261.             }
  262.             if (*xferbuf.data == 1)
  263.             {
  264.                 // Oh JOY!  Acceptance by our peer!
  265.                 EndDialog(hdlg, TRUE);
  266.                 return 0;
  267.             }
  268.             else
  269.             {
  270.                 // Depression...nobody loves us: reenable listbox so we
  271.                 // can just get rejected again.
  272.                 EnableWindow(GetDlgItem(hdlg, SD_LIST), TRUE);
  273.                 EnableWindow(GetDlgItem(hdlg, IDOK), TRUE);
  274.                 return 0;
  275.             }
  276.         default:
  277.             return 0; // This is unexpected... drop packet
  278.     }
  279.     return TRUE;
  280. }
  281. //
  282. //  FUNCTION: MsgSelectCommand(HWND, UINT, WPARAM, LPARAM)
  283. //
  284. //  PURPOSE: Process WM_COMMAND message sent to the Select box.
  285. //
  286. //  PARAMETERS:
  287. //    hwnd - The window handing the message.
  288. //    uMessage - The message number. (unused).
  289. //    wparam - Message specific data (unused).
  290. //    lparam - Message specific data (unused).
  291. //
  292. //  RETURN VALUE:
  293. //    Always returns 0 - message handled.
  294. //
  295. //  COMMENTS:
  296. //    Uses this DipsCommand function defined in wndproc.c combined
  297. //    with the cmdiSelect structure defined in this file to handle
  298. //    the command messages for the Select dialog box.
  299. //
  300. LRESULT MsgSelectCommand(HWND   hwnd,
  301.                          UINT   uMessage,
  302.                          WPARAM wparam,
  303.                          LPARAM lparam)
  304. {
  305.     return DispCommand(&cmdiSelect, hwnd, wparam, lparam);
  306. }
  307. //
  308. //  FUNCTION: CmdSelectDone(HWND, WORD, HWND)
  309. //
  310. //  PURPOSE: Free the Select box and related data.
  311. //
  312. //  PARAMETERS:
  313. //    hwnd - The window handling the command.
  314. //    wCommand - The command to be handled (unused).
  315. //    wNotify   - Notification number (unused)
  316. //    hwndCtrl - NULL (unused).
  317. //
  318. //  RETURN VALUE:
  319. //    Always returns TRUE.
  320. //
  321. //  COMMENTS:
  322. //    Calls EndDialog to finish the dialog session.
  323. //
  324. LRESULT CmdSelectDone(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  325. {
  326.     if (hFontCopyright)
  327.        DeleteObject(hFontCopyright);
  328.     EndDialog(hdlg, FALSE);          // Exit the dialog
  329.     return TRUE;
  330. }
  331. //
  332. //  FUNCTION: CmdSelectOK(HWND, WORD, HWND)
  333. //
  334. //  PURPOSE: Requests session with peer
  335. //
  336. //  PARAMETERS:
  337. //    hwnd - The window handling the command.
  338. //    wCommand - The command to be handled (unused).
  339. //    wNotify   - Notification number (unused)
  340. //    hwndCtrl - NULL (unused).
  341. //
  342. //  RETURN VALUE:
  343. //    Always returns TRUE.
  344. //
  345. //  COMMENTS:
  346. //    Sends session request message to selected peer
  347. //
  348. LRESULT CmdSelectOK(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  349. {
  350.     int iIndex;
  351.     // Get selected peer name
  352.     iIndex = SendMessage(GetDlgItem(hdlg, SD_LIST), LB_GETCURSEL, 0, 0);
  353.     SendMessage(GetDlgItem(hdlg, SD_LIST), LB_GETTEXT, iIndex, (LPARAM)&peername);
  354.     // Build session request message
  355.     MySock.status = SOCKSTAT_REQSESSION;
  356.     xferbuf.hdr.signature = MYSIGNATURE;
  357.     xferbuf.hdr.length = REALLEN(peername) + HDRSIZE;
  358.     xferbuf.hdr.command = REQUEST_SESSION;
  359.     lstrcpy(xferbuf.data, peername);
  360.     senddatamessage(MySock.sock, &xferbuf);       // Send it!
  361.     EnableWindow(GetDlgItem(hdlg, SD_LIST), FALSE);
  362.     EnableWindow(GetDlgItem(hdlg, IDOK), FALSE);
  363.     return TRUE;
  364. }
  365. //
  366. //  FUNCTION: CmdSelectList(HWND, WORD, HWND)
  367. //
  368. //  PURPOSE: Enables OK button
  369. //
  370. //  PARAMETERS:
  371. //    hwnd - The window handling the command.
  372. //    wCommand - The command to be handled (unused).
  373. //    wNotify   - Notification number (unused)
  374. //    hwndCtrl - NULL (unused).
  375. //
  376. //  RETURN VALUE:
  377. //    Always returns TRUE.
  378. //
  379. //  COMMENTS:
  380. //    When a peer is selected, enable OK button
  381. //
  382. LRESULT CmdSelectList(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  383. {
  384.     if (wNotify == LBN_SELCHANGE)  // A peer has been selected!
  385.     {
  386.         EnableWindow(GetDlgItem(hdlg, IDOK), TRUE);     // Enable that button!
  387.     }
  388.     return TRUE;
  389. }