FiveDlg.cpp
上传用户:fjjkzlh
上传日期:2010-04-06
资源大小:469k
文件大小:9k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. // FiveDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Five.h"
  5. #include "FiveDlg.h"
  6. #include "ServerDlg.h"
  7. #include "ClientDlg.h"
  8. #include "NameDlg.h"
  9. #include "StatDlg.h"
  10. #include "AboutDlg.h"
  11. #include "Table.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CFiveDlg dialog
  19. CFiveDlg::CFiveDlg(CWnd* pParent /*=NULL*/)
  20. : CDialog(CFiveDlg::IDD, pParent)
  21. {
  22. //{{AFX_DATA_INIT(CFiveDlg)
  23. //}}AFX_DATA_INIT
  24. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  25. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  26. }
  27. void CFiveDlg::DoDataExchange(CDataExchange* pDX)
  28. {
  29. CDialog::DoDataExchange(pDX);
  30. //{{AFX_DATA_MAP(CFiveDlg)
  31. DDX_Control(pDX, IDC_EDT_CHAT, m_ChatList);
  32. //}}AFX_DATA_MAP
  33. }
  34. BEGIN_MESSAGE_MAP(CFiveDlg, CDialog)
  35. //{{AFX_MSG_MAP(CFiveDlg)
  36. ON_WM_PAINT()
  37. ON_WM_QUERYDRAGICON()
  38. ON_COMMAND(ID_MENU_1P, OnMenu1p)
  39. ON_BN_CLICKED(IDC_BTN_BACK, OnBtnBack)
  40. ON_COMMAND(ID_MENU_PC, OnMenuPc)
  41. ON_COMMAND(ID_MENU_SERVER, OnMenuServer)
  42. ON_COMMAND(ID_MENU_CLIENT, OnMenuClient)
  43. ON_WM_SETCURSOR()
  44. ON_BN_CLICKED(IDC_BTN_HQ, OnBtnHq)
  45. ON_BN_CLICKED(IDC_BTN_LOST, OnBtnLost)
  46. ON_COMMAND(ID_MENU_LEAVE, OnMenuLeave)
  47. ON_COMMAND(ID_MENU_PLAYAGAIN, OnMenuPlayagain)
  48. ON_COMMAND(ID_MENU_NAME, OnMenuName)
  49. ON_COMMAND(ID_MENU_STAT, OnMenuStat)
  50. ON_COMMAND(ID_MENU_EXIT, OnMenuExit)
  51. ON_COMMAND(ID_MENU_ABOUT, OnMenuAbout)
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CFiveDlg message handlers
  56. BOOL CFiveDlg::OnInitDialog()
  57. {
  58. CDialog::OnInitDialog();
  59. // Set the icon for this dialog.  The framework does this automatically
  60. //  when the application's main window is not a dialog
  61. SetIcon(m_hIcon, TRUE); // Set big icon
  62. SetIcon(m_hIcon, FALSE); // Set small icon
  63. // TODO: Add extra initialization here
  64.     m_pDlg = NULL;
  65.     CRect rect(0, 0, 200, 200);
  66.     m_Table.CreateEx( WS_EX_CLIENTEDGE, _T("ChessTable"), NULL, WS_VISIBLE | WS_BORDER | WS_CHILD,
  67.         CRect( 0, 0, 401, 478 ), this, IDC_TABLE );
  68.     // 设置双方姓名
  69.     SetDlgItemText( IDC_ST_ME, m_Table.m_strMe );
  70.     SetDlgItemText( IDC_ST_ENEMY, _T("无玩家加入") );
  71.     // 禁用“再玩”和“离开”
  72.     CMenu *pMenu = GetMenu();
  73.     pMenu->EnableMenuItem( ID_MENU_PLAYAGAIN, MF_DISABLED | MF_GRAYED | MF_BYCOMMAND );
  74.     pMenu->EnableMenuItem( ID_MENU_LEAVE, MF_DISABLED | MF_GRAYED | MF_BYCOMMAND );
  75.     // 捕获聊天输入框句柄,供处理回车使用
  76.     m_hChat = FindWindowEx( GetDlgItem( IDC_CMB_CHAT )->GetSafeHwnd(), NULL, _T("Edit"), NULL );
  77.     ::SendMessage( m_hChat, EM_LIMITTEXT, (WPARAM)128, 0);
  78.     m_Table.Clear( TRUE );
  79.     GetDlgItem( IDC_CMB_CHAT )->EnableWindow( FALSE );
  80.     GetDlgItem( IDC_BTN_BACK )->EnableWindow( FALSE );
  81.     GetDlgItem( IDC_BTN_HQ )->EnableWindow( FALSE );
  82.     GetDlgItem( IDC_BTN_LOST )->EnableWindow( FALSE );
  83.     GetDlgItem( IDC_TABLE )->SetFocus();
  84. return FALSE;  // return TRUE  unless you set the focus to a control
  85. }
  86. // If you add a minimize button to your dialog, you will need the code below
  87. //  to draw the icon.  For MFC applications using the document/view model,
  88. //  this is automatically done for you by the framework.
  89. void CFiveDlg::OnPaint() 
  90. {
  91. if (IsIconic())
  92. {
  93. CPaintDC dc(this); // device context for painting
  94. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  95. // Center icon in client rectangle
  96. int cxIcon = GetSystemMetrics(SM_CXICON);
  97. int cyIcon = GetSystemMetrics(SM_CYICON);
  98. CRect rect;
  99. GetClientRect(&rect);
  100. int x = (rect.Width() - cxIcon + 1) / 2;
  101. int y = (rect.Height() - cyIcon + 1) / 2;
  102. // Draw the icon
  103. dc.DrawIcon(x, y, m_hIcon);
  104. }
  105. else
  106. {
  107. CDialog::OnPaint();
  108. }
  109. }
  110. // The system calls this to obtain the cursor to display while the user drags
  111. //  the minimized window.
  112. HCURSOR CFiveDlg::OnQueryDragIcon()
  113. {
  114. return (HCURSOR) m_hIcon;
  115. }
  116. void CFiveDlg::OnOK() 
  117. {
  118. }
  119. void CFiveDlg::OnCancel() 
  120. {
  121.     if ( IDYES == MessageBox( _T("确定要退出吗?"), _T("五子棋"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 ) )
  122.         CDialog::OnCancel();
  123. }
  124. void CFiveDlg::OnMenu1p() 
  125. {
  126. // TODO: Add your command handler code here
  127.     // 与电脑对弈,则不允许和棋、聊天与认输
  128.     GetDlgItem( IDC_BTN_HQ )->EnableWindow( FALSE );
  129.     GetDlgItem( IDC_CMB_CHAT )->EnableWindow( FALSE );
  130.     GetDlgItem( IDC_BTN_BACK )->EnableWindow( FALSE );
  131.     GetDlgItem( IDC_BTN_LOST )->EnableWindow( FALSE );
  132.     m_Table.Accept( 1 );
  133. }
  134. void CFiveDlg::OnBtnBack() 
  135. {
  136. // TODO: Add your control notification handler code here
  137.     m_Table.Back();
  138. }
  139. void CFiveDlg::OnMenuPc() 
  140. {
  141. // TODO: Add your command handler code here
  142.     // 与电脑对弈,则不允许和棋、聊天与认输
  143.     GetDlgItem( IDC_BTN_HQ )->EnableWindow( FALSE );
  144.     GetDlgItem( IDC_CMB_CHAT )->EnableWindow( FALSE );
  145.     GetDlgItem( IDC_BTN_BACK )->EnableWindow( FALSE );
  146.     GetDlgItem( IDC_BTN_LOST )->EnableWindow( FALSE );
  147.     m_Table.SetColor( 1 );
  148.     m_Table.Clear( FALSE );
  149.     m_Table.SetGameMode( 1 );
  150. }
  151. void CFiveDlg::OnMenuServer() 
  152. {
  153.     // TODO: Add your command handler code here
  154.     m_pDlg = new CServerDlg;
  155.     m_pDlg->Create( IDD_DLG_SERVER, this );
  156.     m_pDlg->ShowWindow( SW_SHOW );
  157. }
  158. void CFiveDlg::OnMenuClient() 
  159. {
  160. // TODO: Add your command handler code here
  161.     CClientDlg dlg;
  162.     if ( IDOK == dlg.DoModal() )
  163.     {
  164.         // 发送己方姓名
  165.         MSGSTRUCT msg;
  166.         msg.uMsg = MSG_INFORMATION;
  167.         lstrcpy( msg.szMsg, m_Table.m_strMe );
  168.         m_Table.m_conn.Send( (LPCVOID)&msg, sizeof( MSGSTRUCT ) );
  169.         // 设置按钮状态
  170.         GetDlgItem( IDC_BTN_HQ )->EnableWindow( TRUE );
  171.         GetDlgItem( IDC_CMB_CHAT )->EnableWindow( TRUE );
  172.         GetDlgItem( IDC_BTN_BACK )->EnableWindow( FALSE );
  173.         GetDlgItem( IDC_BTN_LOST )->EnableWindow( TRUE );
  174.         // 设置菜单状态
  175.         m_Table.SetMenuState( FALSE );
  176.     }
  177. }
  178. BOOL CFiveDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  179. {
  180. // TODO: Add your message handler code here and/or call default
  181.     if ( GetDlgItem( IDC_EDT_CHAT ) == pWnd )
  182.     {
  183.         // 处理聊天记录的鼠标指针
  184.         SetCursor( LoadCursor( NULL, IDC_ARROW ) );
  185.         return TRUE;
  186.     }
  187.     else
  188.     return CDialog::OnSetCursor(pWnd, nHitTest, message);
  189. }
  190. BOOL CFiveDlg::PreTranslateMessage(MSG* pMsg) 
  191. {
  192. // TODO: Add your specialized code here and/or call the base class
  193. if ( WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam && m_hChat == pMsg->hwnd )
  194.     {
  195.         // 处理聊天输入窗口的回车消息
  196.         TCHAR str[128];
  197.         // 发送聊天内容
  198.         ::GetWindowText( m_hChat, str, 128 );
  199.         m_Table.Chat( str );
  200.         // 加入聊天记录
  201.         CString strAdd;
  202.         strAdd.Format( _T("你 说:%srn"), str );
  203.         m_ChatList.SetSel( -1, -1, TRUE );
  204.         m_ChatList.ReplaceSel( strAdd );
  205.         // 清空聊天输入窗口
  206.         ::SetWindowText( m_hChat, _T("") );
  207.     }
  208. return CDialog::PreTranslateMessage(pMsg);
  209. }
  210. void CFiveDlg::OnBtnHq() 
  211. {
  212. // TODO: Add your control notification handler code here
  213.     m_Table.DrawGame();
  214. }
  215. void CFiveDlg::OnBtnLost() 
  216. {
  217. // TODO: Add your control notification handler code here
  218. m_Table.GiveUp();
  219. }
  220. void CFiveDlg::OnMenuLeave() 
  221. {
  222. // TODO: Add your command handler code here
  223.     m_Table.m_conn.Close();
  224.     m_Table.m_sock.Close();
  225.     GetDlgItem( IDC_BTN_BACK )->EnableWindow( FALSE );
  226.     GetDlgItem( IDC_BTN_HQ )->EnableWindow( FALSE );
  227.     GetDlgItem( IDC_BTN_LOST )->EnableWindow( FALSE );
  228.     GetDlgItem( IDC_CMB_CHAT )->EnableWindow( FALSE );
  229.     // 设置菜单状态
  230.     m_Table.SetMenuState( TRUE );
  231.     // 设置棋盘等待状态
  232.     m_Table.SetWait( TRUE );
  233.     // 设置网络连接状态
  234.     m_Table.m_bConnected = FALSE;
  235.     // 重新设置对方名称
  236.     SetDlgItemText( IDC_ST_ENEMY, _T("无玩家加入") );
  237. }
  238. void CFiveDlg::OnMenuPlayagain() 
  239. {
  240. // TODO: Add your command handler code here
  241.     m_Table.PlayAgain();
  242. }
  243. void CFiveDlg::OnMenuName() 
  244. {
  245. // TODO: Add your command handler code here
  246. CNameDlg dlg;
  247.     if ( IDOK == dlg.DoModal() )
  248.     {
  249.         SetDlgItemText( IDC_ST_ME, m_Table.m_strMe );
  250.     }
  251. }
  252. void CFiveDlg::OnMenuStat() 
  253. {
  254. // TODO: Add your command handler code here
  255. CStatDlg dlg;
  256.     dlg.DoModal();
  257. }
  258. void CFiveDlg::OnMenuExit() 
  259. {
  260. // TODO: Add your command handler code here
  261. OnCancel();
  262. }
  263. void CFiveDlg::OnMenuAbout() 
  264. {
  265. // TODO: Add your command handler code here
  266. CAboutDlg dlg;
  267.     dlg.DoModal();
  268. }