ChatDlg.cpp
上传用户:royluo
上传日期:2007-01-05
资源大小:1584k
文件大小:8k
源码类别:

游戏

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *                                                                             
  3. *   ChatDlg.cpp                                                            
  4. *                                                                             
  5. *   Electrical Engineering Faculty - Software Lab                             
  6. *   Spring semester 1998                                                      
  7. *                                                                             
  8. *   Tanks game                                                                
  9. *                                                                             
  10. *   Module description: The Chat Dialog implementation.
  11. *                                                                             
  12. *   Authors: Eran Yariv - 28484475                                           
  13. *            Moshe Zur  - 24070856                                           
  14. *                                                                            
  15. *                                                                            
  16. *   Date: 23/09/98                                                           
  17. *                                                                            
  18. ******************************************************************************/
  19. #include "stdafx.h"
  20. #include "tanks.h"
  21. #include "ChatDlg.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CChatDlg dialog
  29. CChatDlg * CChatDlg::m_pDlg = NULL;
  30. CChatDlg::CChatDlg(CWnd* pParent /*=NULL*/)
  31.     : CDialog(CChatDlg::IDD, pParent),
  32.       m_gCommManager (TANKS_APP->m_gCommManager)
  33. {
  34.     //{{AFX_DATA_INIT(CChatDlg)
  35.     //}}AFX_DATA_INIT
  36. }
  37. void CChatDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39.     CDialog::DoDataExchange(pDX);
  40.     //{{AFX_DATA_MAP(CChatDlg)
  41.     DDX_Control(pDX, IDC_CHAT_LIST, m_List);
  42.     DDX_Control(pDX, IDC_CHAT_EDIT, m_Edit);
  43.     //}}AFX_DATA_MAP
  44. }
  45. BEGIN_MESSAGE_MAP(CChatDlg, CDialog)
  46.     //{{AFX_MSG_MAP(CChatDlg)
  47.     ON_WM_CLOSE()
  48.     ON_WM_CTLCOLOR()
  49.     //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CChatDlg message handlers
  53. BOOL CChatDlg::OnInitDialog() 
  54. {
  55.     CDialog::OnInitDialog();
  56.     
  57.     // Set edit as default control:
  58.     m_Edit.LimitText(MAX_CHAT_MSG_LEN);
  59.     m_Edit.SetFocus();
  60.     return FALSE;  // return TRUE unless you set the focus to a control
  61.                   // EXCEPTION: OCX Property Pages should return FALSE
  62. }
  63. void
  64. CChatDlg::Close()
  65. {
  66.     if (m_pDlg)
  67.         m_pDlg->DestroyWindow();
  68. }
  69. void 
  70. CChatDlg::PostNcDestroy( )
  71. {
  72.     Clean ();
  73. }
  74. /*------------------------------------------------------------------------------
  75.   Function: Open
  76.   Purpose:  This static function creates a new Chat dialog. It allows single
  77.             dialog Chat to be open at a time.
  78.   Input:    pParent: Pointer to the main game dialog.
  79.   Output:   None.
  80. ------------------------------------------------------------------------------*/
  81. void 
  82. CChatDlg::Open (CWnd *pParent)
  83. {   // This function is static !!!!
  84.     if (NULL != m_pDlg)
  85.         return; // Already open
  86.     m_pDlg = new CChatDlg (pParent);
  87.     ASSERT (m_pDlg);
  88.     m_pDlg->Create (IDD_CHAT_DIALOG, pParent);
  89.     m_pDlg->ShowWindow (SW_SHOW);
  90.     m_pDlg->SetFocus ();
  91. }
  92. /*------------------------------------------------------------------------------
  93.   Function: Clean
  94.   Purpose:  Called just before exiting the dialog, to delete the object.
  95.   Input:    None.
  96.   Output:   None.
  97. ------------------------------------------------------------------------------*/
  98. void
  99. CChatDlg::Clean ()
  100. {   // This function is static !!!!
  101.     if (NULL == m_pDlg)
  102.         return; // Already closed
  103.     delete m_pDlg;  // Tricky - delete only after call to PostNcDestroy !!!
  104.     m_pDlg = NULL;
  105. }
  106. void 
  107. CChatDlg::OnCancel ()
  108. {
  109.     DestroyWindow ();
  110. }
  111. void 
  112. CChatDlg::OnClose() 
  113. {
  114.     CDialog::OnClose(); 
  115. }
  116. /*------------------------------------------------------------------------------
  117.   Function: OnOK
  118.   Purpose:  Send Chat message when user press the Enter key.
  119.   Input:    None.
  120.   Output:   None.
  121.   Remarks:   
  122. ------------------------------------------------------------------------------*/
  123. void
  124. CChatDlg::OnOK()
  125. {
  126.     CString cstrMsg;
  127.     m_Edit.GetWindowText(cstrMsg);
  128.     if (cstrMsg.IsEmpty())
  129.         return;
  130.     if (cstrMsg.GetLength() > MAX_CHAT_MSG_LEN)
  131.         cstrMsg.SetAt(MAX_CHAT_MSG_LEN, '');
  132.     m_gCommManager.NotifyChatMsg (cstrMsg);
  133.     // Clear edit box:
  134.     m_Edit.SetSel (0, -1);  // All
  135.     m_Edit.Clear();
  136.     return;
  137. }
  138. /*------------------------------------------------------------------------------
  139.   Function: AddMessage
  140.   Purpose:  The function is called on the arrival of a Chat message over the net.
  141.             The Chat message contains the string and information used to get the
  142.             sending player's name and tank's color.
  143.   Input:    idFrom: DirectPlay ID of the sending player.
  144.             dwTankID: ID of tank in game manager.
  145.             szMsg: String containing the message.
  146.   Output:   None.
  147.   Remarks:  When the dialog is opened, we have 2 instances of CChatDlg:
  148.             The one in the main dialog which we use for the open and close calls,
  149.             and the one we point to after the call to open.
  150.             Since we are interesting in the 2nd object when a new message should
  151.             be displayed, we need to look at the this pointer to determine which
  152.             instance of ChatDlg is currently invoked.
  153. ------------------------------------------------------------------------------*/
  154. void 
  155. CChatDlg::AddMessage(DPID idFrom, DWORD dwTankID, LPCSTR szMsg)
  156. {
  157.     if (! m_pDlg)   // User didn't open the dialog
  158.         return;
  159.     if (this != (CChatDlg*)m_pDlg)
  160.     {   // Marshal the call to the dlg object:
  161.         m_pDlg->AddMessage(idFrom, dwTankID, szMsg);
  162.         return;
  163.     }
  164.     m_List.SetRedraw (FALSE);
  165.     // Format String
  166.     CString str;
  167.     CString cstrName;
  168.     m_gCommManager.GetPlayerName(idFrom, cstrName);
  169.     str.Format ("%s: %s", cstrName, szMsg);
  170.     // Try to add string to list box:
  171.     int ind = m_List.AddString (str);
  172.     if (LB_ERRSPACE == ind)
  173.     {   // Delete the oldest string in the list box
  174.         m_List.DeleteString (0);
  175.         ind = m_List.AddString (str);
  176.     }
  177.     if (LB_ERR == ind)     // Unknown error
  178.     {
  179.         m_List.SetRedraw (TRUE);
  180.         return;
  181.     }
  182.     m_List.SetItemData (ind, dwTankID);  // attach tank ID to line
  183.     m_List.SetTopIndex (ind);
  184.     m_List.SetRedraw (TRUE);
  185. }
  186. /*
  187. HBRUSH CChatDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  188. {
  189.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  190.     if (CTLCOLOR_LISTBOX == nCtlColor &&
  191.         m_List.GetCount())
  192.     {
  193.         COLORREF crColor;
  194.         switch (m_List.GetItemData(m_List.GetCount()-1))
  195.         {
  196.         case 0: crColor = RGB(128,  64,   8); break;    // Brown
  197.         case 1: crColor = RGB(  0,   0, 255); break;    // Blue
  198.         case 2: crColor = RGB(255,   0,   0); break;    // Red
  199.         case 3: crColor = RGB(180, 180,  20); break;    // Yellow
  200.         default:
  201.             ASSERT(FALSE);
  202.         }
  203.         pDC->SetTextColor (crColor);
  204.     }
  205.     // TODO: Return a different brush if the default is not desired
  206.     return hbr;
  207. }
  208. */