局域网黑白棋对战设计文档(附代码).doc_第1页
局域网黑白棋对战设计文档(附代码).doc_第2页
局域网黑白棋对战设计文档(附代码).doc_第3页
局域网黑白棋对战设计文档(附代码).doc_第4页
局域网黑白棋对战设计文档(附代码).doc_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计课程设计报告书 文档编号:项目名称 版本 CHATHBQ网络黑白棋对战程序设计课程设计报告书2010年7月7日 目录2010年7月7日1目录31、引言41.1 编写目的41.2 读者对象41.3 软件项目概述41.4 文档概述41.5参考资料42、任务概述52.1目标52.2软件的开发和运行环境52.3 用户特征52.4 进度要求52.5验收要求53、功能需求描述64、界面要求65、测试方案66、功能设计76.1类的关系描述76.2类的设计71棋盘对话框类CChatDlg72、套接字类CMySocket123消息机制137、使用指南188、维护接口219、总结211、 引言1.1 编写目的黑白棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见。本文简述了CHATHBQ网络黑白棋对战软件的需求分析、实现方法和使用方法。1.2 读者对象游戏开发商,游戏爱好者。1.3 软件项目概述l 项目名称:CHATHBQ网络黑白棋对战软件l 简称:CHATHBQl 项目代号:无1.4 文档概述本文档详细地向用户介绍软件的设计过程及每一个模块的实现方法,使用户对软件的构成用更深入的了解,最后向用户提供软件的使用方法。1.5 参考资料1、程序设计课程设计国防科大计算机学院2、Visual C+网络通信协议分析与应用实现 汪晓平/钟军 等编著,人民邮电出版社3、深入浅出MFC(第2版),侯俊杰著,华中科技大学出版社2、 任务概述2.1目标实现如下的功能:1) 设计一个实现网络黑白棋功能的对话框类和套接字类;2) 记录游戏双方的最近一次落子情况,允许悔棋;3) 实现保存棋谱和根据棋谱复盘的功能;4) 判断双方输赢,双方都无棋可下时,棋多的一方胜;5) 响应用户的鼠标消息,并显示棋盘信息;2.2软件的开发和运行环境本软件可在Windows操作系统上运行,支持软件为Microsoft Visual C+. 2.3 用户特征适合于广大使用群体2.4 进度要求在本学期期末之前,上交可执行程序的源代码,并上交需求分析和测试文档及用户使用手册。2.5验收要求实现如下的功能:1) 设计一个实现网络黑白棋功能的对话框类和套接字类;2) 记录游戏双方的最近一次落子情况,允许悔棋;3) 实现保存棋谱和根据棋谱复盘的功能;4) 判断双方输赢,双方都无棋可下时,棋多的一方胜;5) 响应用户的鼠标消息,并显示棋盘信息;3、功能需求描述在windows平台上设计并实现一个黑白棋的局域网游戏程序。具体功能如下:1) 实现画棋盘功能,要求为8*8的棋盘;2) 实现局域网通信功能,双方通过局域网发送游戏信息响应,实现交替下子,更新棋盘,并可互发信息聊天;3) 实现响应用户鼠标信息的功能,并显示棋盘信息;4) 实现保存棋盘信息及根据棋盘信息恢复棋盘的功能;5) 实现判输赢功能,当双方都无棋可下,或者64个方格都被占满后,棋局结束,子多的一方为胜方;6) 允许悔棋,各方至多一次悔棋。4、界面要求1. 实现黑白棋网络对战的功能;2. 简约而不简单3. 使用好学5、 测试方案根据功能要求进行测试。6、功能设计6.1类的关系描述本程序由于实现的功能较为简单,所以并没有进行过多的抽象和精细的模块化。程序主要有游戏对话框类CChatDlg和套接字类CMySocket,同时定义了用于消息传递的结构MSGSTRUCT。 程序的架构和类之间的主要关系如下:6.2类的设计1棋盘对话框类CChatDlgclass CChatDlg : public CDialog/ Constructionpublic:void Reset();void UpdateBoard(MSGSTRUCT *);CPoint ptConvertBP2VP(int x, int y) const;void vLauchPiece(CPoint pointBoard, int nType);int vDrawPiece(CDC* pDC);CPoint ptConvertVP2BP(CPoint pointView) const;void vSetPiecePos(CPoint piecePos);bool judg(int a,int b);void vSetPiecePos(int x,int y);CPoint m_ptPiecePos;bool bPointInBoard(CPoint pointView, int nBoardRowNum) const;void OnRecieve();bool m_bConnected;void OnAccept();void OnClose();CChatDlg(CWnd* pParent = NULL);/ standard constructorCMySocket* m_conn;CMySocket* m_sock;MSGSTRUCT store;/ Dialog Data/AFX_DATA(CChatDlg)enum IDD = IDD_CHAT_DIALOG ;CEditm_ChatList;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CChatDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HWND m_hChat;HICON m_hIcon;char step,ptr,pre,mystep;char map1010;int nBoardRowNum;/ Generated message map functions/AFX_MSG(CChatDlg)virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonClose();afx_msg void OnButtonConnect();afx_msg void OnButtonListen();afx_msg void OnChangeEdit1Clientip();virtual void OnOK();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnButtonBack();afx_msg void OnButtonSave();afx_msg void OnButtonLoadsave();afx_msg void OnUpdateEditMsg();/AFX_MSGDECLARE_MESSAGE_MAP();1.1主要成员变量说明1.1.1网络连接标志m_bConnected用来表示当前网络连接的情况,在客户端连接服务器的时候用来判断是否连接成功。1.1.2棋手棋子颜色标志mystep用来标示棋手棋子的颜色,0代表白方,1代表黑方。1.1.3网络套接字m_sock和m_conn其中m_sock对象用于做服务器时的监听之用,m_conn用于网络连接的传输。1.1.4棋盘数据map这是一个10*10的二维数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示无子,1表示落白子,2表示落黑子。1.1.5 棋盘步数统计step这是一个整型变量,用来记录下棋的步数,同时也使用它来判定当前是轮到黑白哪方下子。1.1.6 棋盘数据保存store这是一个MSGSTRUCT结构变量,主要保存了棋盘棋子的布局,当前下的步数,和棋手棋子的颜色。当需要保存棋盘或悔棋时都可以用到这个变量。1.2主要成员函数说明1.2.1套接字的回调处理OnAccept、OnClose、OnReceive本程序的套接字派生自MFC的CAsyncSocket类6,CChatDlg的这三个成员函数就分别提供了对套接字7回调事件OnAccept、OnConnect、OnReceive的实际处理,其中尤以Receive成员函数重要,它之中包含了对所有网络消息的处理,详见后面的消息机制。1.2.2清空棋盘Reset在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情:l 将m_data中每一个落子位都置为无子状态(-1)。l 按照传入的参数设置网络连接等标志。l 设置了对话框上的控件的初始状态,只有“建立游戏”和“进入游戏”两个按钮是有效的。1.2.3绘制棋盘vDrawPiece这无疑是很重要的一个函数,它根据CChatDlg内参数(map,step)绘制棋盘和棋子,同时绘出棋盘的状态,包括黑白棋子的统计数,本次轮到哪方下子。l 根据坐标绘制棋底色和网格线。l 根据map的内容,在有棋子的坐标位置绘出相应的棋子。l 绘出当前黑白棋子的统计数,本次轮到哪方下子。1.2.4左键消息OnLButtonUp作为棋盘唯一响应的左键消息,是程序和用户的接口,也需要做不少的工作:l 如果游戏连接标志m_bConnected为FALSE,禁止落子。l 如果点击时的鼠标坐标在合法坐标(0, 0)(7,7)之外,或者当前不轮到落子,亦禁止落子。l 如果走的步数大于1步,方才允许悔棋。l 进行胜利判断,如胜利则发送消息并恢复棋盘,准备下一局。l 如未胜利,则向对方发送已经落子的消息。实现代码如下:void CChatDlg:OnLButtonDown(UINT nFlags, CPoint point) CPoint ptBoard = ptConvertVP2BP(point); if(m_bConnected&bPointInBoard(point,8)&step%2=mystep)vSetPiecePos(ptBoard);vLauchPiece(ptBoard,0);CDialog:OnLButtonDown(nFlags, point);1.2.5 落子响应vLauchPiece这个函数对落子进行处理。首先检查落子是否有效,即落子地点是否已被占,或者下的子是否能在八个方向上和本颜色的棋子夹住另一种颜色的棋子,如果落子无效,则给出警告,否则更新棋盘。之后再判定双方是否还有棋可下,具体方法就是遍历所有的空位,判定如果落子是否合法,如果某一方没有子可下,则发送停步消息;如果双方都没有子可下,则说明本局已经结束,统计双方棋盘上剩下的棋子数判定输赢,并发送消息;如果双方都有子可下,则直接退出。1.2.5 控件响应函数OnButtonConnect,OnButtonListen,OnButtonClose,OnButtonBack,OnButtonSave,OnButtonLoadSave主界面上的控件实现了游戏的各种功能:OnButtonListen服务器端使用,建立游戏服务器,同时建立了一个用于监听的套接字,并对局域网进行监听。OnButtonConnect客户端使用,通过输入服务器的计算机名,建立由于连接的套接字,和服务器进行连接。OnButtonClose断开连接,并关闭套接字,同时将棋盘重置,准备重开一局。OnButtonBack悔棋,向对方发送消息,征求对方的意见,如果对方同意则悔棋,否则悔棋失败,回复消息的处理在OnRecieve中。OnButtonSave保存棋盘,并发送保存棋盘的消息,对方也会自动保存。OnButtonLoadSave转载存档,向对方发送消息,征求对方的意见,如果对方同意则转载存档,否则失败,回复消息的处理在OnRecieve中。2、套接字类CMySocketclass CMySocket : public CAsyncSocket/ Attributes/ Operationspublic:CChatDlg * m_pDlg;CMySocket();virtual CMySocket();CMySocket(CChatDlg *);/ Overridesprotected:/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMySocket)public:virtual void OnClose(int nErrorCode);virtual void OnReceive(int nErrorCode);virtual void OnAccept(int nErrorCode);/AFX_VIRTUAL/ Generated message map functions/AFX_MSG(CMySocket)/ NOTE - the ClassWizard will add and remove member functions here./AFX_MSG/ Implementationprotected:private:;2.1 主要成员变量CChatDlg * m_pDlg游戏对话框指针这是套接字类和对话框类的借口,套接字类通过这个指针回调对话框中的函数,这样当套接字类接收到局域网消息后,能够及时通知对话框进行处理,并更新棋盘,使游戏不断继续。2.2 主要成员函数2.2.1 重载构造函数CMySocket:CMySocket(CChatDlg * pDlg)当建立套接字类时,建立起对话框类与套接字类的联系。2.2.2 消息接受函数OnAccept,OnRecieve,OnClose接受局域网对方发送来的消息,通过对话框指针转到对话框进行处理3消息机制Windows系统拥有自己的消息机制,在不同事件发生的时候,系统也可以提供不同的响应方式11。黑白棋程序也模仿Windows系统实现了自己的消息机制,主要为网络对弈服务,以响应多种多样的网络消息。3.1消息机制的架构当继承自CAsyncSocket的套接字类CMySocket收到消息时,会触发CChatDlg:OnReceive事件,开始按照自定义的消息格式接收套接字发送的数据,并对不同的消息类型进行分发处理。3.2各种消息说明网络间传递的消息,都遵循以下一个结构体的形式:/ 摘自Messages.htypedef struct _tagMsgStruct UINT uMsg;/ 消息IDchar step,winner;char map1010; / 聊天内容 TCHAR szMsg128; MSGSTRUCT;随着uMsg表示消息ID;step表示当前步数;winner当棋局结束时有效,0表示输了,1表示赢了;map存着当前棋盘的信息,供更新使用;szMsg存储着聊天信息,只有当发送聊天信息时才有效。3.2.1落子消息MSG_PUTDOWN表明对方落下了一个棋子,其中step,map成员有效,winner,szMsg成员无效。此后会对游戏信息进行更新,并重绘棋盘。3.2.2悔棋消息MSG_BACK表明对方请求悔棋,接到这个消息后,会弹出MessageBox询问是否接受对方的请求,并根据玩家的选择回返MSG_AGREEBACK或MSG_REFUSEBACK消息。另外,在发送这个消息之后,主界面上的某些元素将不再响应用户的操作。图5.2 请求悔棋3.2.3同意悔棋消息MSG_AGREEBACK表明对方接受了玩家的悔棋请求,接到这个消息后,将进行正常的悔棋操作,根据存储的棋盘信息对棋盘进行更新。3.2.4拒绝悔棋消息MSG_REFUSEBACK表明对方拒绝了玩家的悔棋请求(如图5.3所示),除uMsg成员外其余成员皆无效。接到这个消息后,整个界面将恢复发送悔棋请求前的状态。图5.3 拒绝悔棋3.2.5存档消息MSG_SAVE表明对方请求对游戏存档,除uMsg成员外其余成员皆无效。接到这个消息后,程序会自动保存棋盘信息并写入到文件“SAVE.DAT”中,同时弹出MessageBox提示。 图5.4 存档游戏3.2.6 装载存档消息MSG_LOADSAVE 表明对方向你发出了同时装载存档的请求,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox询问是否接受对方的请求,并根据玩家的选择回返MSG_AGREELOAD或MSG_REFUSELOAD消息。另外,在发送这个消息之后,主界面上的某些元素将不再响应用户的操作。 图2.5 请求装载存档3.2.7同意装载存档MSG_AGREELOAD表明对方接受了玩家的装载存档请求,除uMsg成员外其余成员皆无效。接到这个消息后,从文件中读取出棋盘的存档,并更新棋盘。3.2.8拒绝装载存档MSG_REFUSELOAD表明对方拒绝了玩家的请求(如图5.6所示),除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox提示用户。图5.6 拒绝装载存档3.2.9断开消息MSG_CLOSE表明对方由于某种原因已经退出了游戏,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出对话框提示,之后界面恢复到未连接状态。图5.7 退出游戏3.2.10聊天消息MSG_CHAT表明对方发送了一条聊天信息,szMsg表示对方的信息,其余成员无效。接到这个信息后,会将对方聊天的内容显示在主对话框的聊天记录窗口内。3.2.11停步消息MSG_STOPSTEP表明下一步你已经没有棋可下了,除uMsg成员外其余成员皆无效。弹出MessageBox提示。3.2.12棋局结束MSG_ DETERMINE表明本次棋局已经结束,胜负已分,除uMsg和WINNER成员外其余成员皆无效。接到这个消息后,会弹出MessageBox显示本次棋局胜负信息,之后会重置棋盘,准备新的一局。 7、 使用指南1. 建立连接服务器端操作如下:之后: 客户端操作如下:之后 2. 游戏阶段3. 聊天功能4. 结束游戏点击“断开连接”按钮,便会退出游戏,且对方会收到通知。8、维护接口9、总结这个课程的学习让我觉得很有成就感。因为这是我的第一个拥有图形界面的程序,很直观,很享受。而且通过本课程学习和上机,我大致了解了这种简单游戏的开发和算法原理,极大的提高了我编程学习的积极性。在刚开始的时候,我还是有点为畏难的情绪。由于课程时间比较紧张,又由于缺乏基础,上课听起来一头雾水,课后上机对着电脑屏幕,面对长长的代码干瞪眼。但同时我对于网络编程怀有莫大的兴趣,所以决定编写一个基于网络的黑白棋对战软件。经过翻阅书籍,参考网上局域网聊天的程序,终于弄懂了局域网通信的CSOCKET实现,然后在局域网聊天的基础上加上下棋的功能,便成了我的作品。但过程中由于MFC有太多的隐含代码,时常让我对一些过程调用不明就里;还有面向对象的一些l类之间通信的问题至今还困扰我,但我会继续努力学习。总之,通过这门课的学习,我收获很大。10、附录/ Chat.cpp : Defines the class behaviors for the application./Chat.cpp#include stdafx.h#include Chat.h#include ChatDlg.h#include #include Chat_i.c#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CChatAppBEGIN_MESSAGE_MAP(CChatApp, CWinApp)/AFX_MSG_MAP(CChatApp)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSGON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()/ CChatApp constructionCChatApp:CChatApp()/ TODO: add construction code here,/ Place all significant initialization in InitInstance/ The one and only CChatApp objectCChatApp theApp;/ CChatApp initializationBOOL CChatApp:InitInstance()if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;if (!InitATL()return FALSE;AfxEnableControlContainer();CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);if (cmdInfo.m_bRunEmbedded | cmdInfo.m_bRunAutomated)return TRUE;/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL#elseEnable3dControlsStatic();/ Call this when linking to MFC statically#endifCChatDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the applications message pump.return FALSE;CChatModule _Module;BEGIN_OBJECT_MAP(ObjectMap)END_OBJECT_MAP()LONG CChatModule:Unlock()AfxOleUnlockApp();return 0;LONG CChatModule:Lock()AfxOleLockApp();return 1;LPCTSTR CChatModule:FindOneOf(LPCTSTR p1, LPCTSTR p2)while (*p1 != NULL)LPCTSTR p = p2;while (*p != NULL)if (*p1 = *p)return CharNext(p1);p = CharNext(p);p1+;return NULL;int CChatApp:ExitInstance()if (m_bATLInited)_Module.RevokeClassObjects();_Module.Term();CoUninitialize();return CWinApp:ExitInstance();BOOL CChatApp:InitATL()m_bATLInited = TRUE;#if _WIN32_WINNT = 0x0400HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);#elseHRESULT hRes = CoInitialize(NULL);#endifif (FAILED(hRes)m_bATLInited = FALSE;return FALSE;_Module.Init(ObjectMap, AfxGetInstanceHandle();_Module.dwThreadID = GetCurrentThreadId();LPTSTR lpCmdLine = GetCommandLine(); /this line necessary for _ATL_MIN_CRTTCHAR szTokens = _T(-/);BOOL bRun = TRUE;LPCTSTR lpszToken = _Module.FindOneOf(lpCmdLine, szTokens);while (lpszToken != NULL)if (lstrcmpi(lpszToken, _T(UnregServer)=0)_Module.UpdateRegistryFromResource(IDR_CHAT, FALSE);_Module.UnregisterServer(TRUE); /TRUE means typelib is unregdbRun = FALSE;break;if (lstrcmpi(lpszToken, _T(RegServer)=0)_Module.UpdateRegistryFromResource(IDR_CHAT, TRUE);_Module.RegisterServer(TRUE);bRun = FALSE;break;lpszToken = _Module.FindOneOf(lpszToken, szTokens);if (!bRun)m_bATLInited = FALSE;_Module.Term();CoUninitialize();return FALSE;hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);if (FAILED(hRes)m_bATLInited = FALSE;CoUninitialize();return FALSE;return TRUE;/ ChatDlg.cpp : implementation file/ChatDlg.cpp#include stdafx.h#include Chat.h#include ChatDlg.h#include MyDoc.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#define XPOS_TopLeft170#define YPOS_TopLeft30#define WIDTH_BoardGrid40#define WIDTH_Piece18#define COLOR_Brush0x00000000#define COLOR_PieceBlack0x00000000#define COLOR_PieceWhite0x00FFFFFF#define COLOR_PieceRed 0x000000F0#define COLOR_Pen0x00000000#define WIDTH_Pen1/ CChatDlg dialogCChatDlg:CChatDlg(CWnd* pParent /*=NULL*/): CDialog(CChatDlg:IDD, pParent)/AFX_DATA_INIT(CChatDlg)/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CChatDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CChatDlg)DDX_Control(pDX, IDC_EDT_CHAT, m_ChatList);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CChatDlg, CDialog)/AFX_MSG_MAP(CChatDlg)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect)ON_BN_CLICKED(IDC_BUTTON_LISTEN, OnButtonListen)ON_EN_CHANGE(IDC_EDIT1_CLIENTIP, OnChangeEdit1Clientip)ON_WM_LBUTTONDOWN()ON_BN_CLICKED(IDC_BUTTON_BACK, OnButtonBack)ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)ON_BN_CLICKED(IDC_BUTTON_LOADSAVE, OnButtonLoadsave)ON_EN_UPDATE(IDC_EDIT_MSG, OnUpdateEditMsg)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CChatDlg message handlersBOOL CChatDlg:OnInitDialog()step=-1;memset(map,0,sizeof(map);map33=map44=1;map34=map43=2;nBoardRowNum=8;m_bConnected=0;CDialog:OnInitDialog();/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here CHAR szHost100; CHAR *szIP; hostent *host; gethostname(szHost, 100); SetDlgItemText( IDC_EDIT_MyName, szHost );GetDlgItem( IDC_EDIT_MSG )-EnableWindow( FALSE );GetDlgItem( IDC_BUTTON_CLOSE )-EnableWindow( FALSE );GetDlgItem( IDC_BUTTON_SAVE )-EnableWindow( FALSE );GetDlgItem( IDC_BUTTON_LOADSAVE )-EnableWindow( FALSE );GetDlgItem( IDC_BUTTON_BACK )-EnableWindow( FALSE );GetDlgItem( IDOK )-EnableWindow( FALSE );/GetDlgItem( IDC_BUTTON_ )-EnableWindow( FALSE );/GetDlgItem( IDC_BUTTON_CLOSE )-EnableWindow( FALSE ); GetDlgItem( IDC_BUTTON_LISTEN )-SetFocus();return FALSE; / return TRUE unless you set the focus to a controlreturn TRUE; / return TRUE unless you set the focus to a control/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CChatDlg:OnPaint() CPaintDC dc(this); / device context for paintingif (IsIconic()SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseif(step=-1)step+;vDrawPiece(&dc);ReleaseDC(&dc);/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CChatDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CChatDlg:OnButtonClose() / TODO: Add your control notification handler code hereif(m_bConnected)if(mystep=0)m_conn-Close();m_sock-Close();else m_conn-Close();else m_sock-Close();Reset();void CChatDlg:OnButtonConnect() / TODO: Add your control notification handler code herem_conn=new CMySocket(this);CString strHost; GetDlgItemText( IDC_EDIT1_CLIENTIP, strHost ); m_bConnected = TRUE;mystep=store.step=1; GetDlgItem( IDC_BUTTON_CONNECT )-EnableWindow( FA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论