




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章 课程设计目的和要求课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,不进能够锻炼学生的分析解决实际问题的能力、提高学生适应实际环境的实践编程的能力,也能培养学生独立、探索的能力,同时也是对嘘声所学理论知识和基本技能的全面考核。C语言课程设计是一门实践性非常强的课程,不但要注重c语言程序设计基本知识的学习,更要注重程序设计技能的培养,使学生能够允许渐进地把握c语言程序设计的技能。通过课程设计,培养学生阅读和编写程序的能力,培养计算机程序设计的能力和素质,以及思维方法。初步积累编程经验,打下良好的计算机应用基础。1.1 目的通过c语言的课程设计,使学生初步掌握c程序设计中的各个步骤,如涉及方案的确定、程序设计、软件编程、以及培养使用技术资料,编写涉及说明书的能力,提高学生编程的综合能力及上机调试水平。1.2 基本要求1.掌握文件以及设计文件系统、文件指针的概念。2.学会运用文件打开、关闭、读写等文件操作。3.掌握用c语言图形函数设计一些简单的图形。4.对c语言的基本知识以及数组、指针、结构体知识进行综合应用。第二章 课程设计任务内容此课程设计的任务内容是编写一个聊天小程序,使用图形用户界面,能实现一个聊天室中多人聊天和私聊。2.1 背景如今是计算机和互联网络的时代,“网络”已经成为大家耳熟能详的词语,各种基于网络的娱乐服务、信息服务已经遍地开花,像OICQ等网络聊天软件已经甚至成为一种文化的象征。但是从技术的角度上讲,互联网络的体系结构仍然是基于20世纪七八十年代就已经产生并逐渐成熟的TCP/IP协议族(又称IPv4协议族),虽然现在的一种新的IPv6协议正在蓬勃发展,有望全面取代IPv4,但是IPv4在近30年的发展中,已经形成了庞大的市场,大量成熟的商业软件、硬件产品都基于IPv4,在可以预见的10年之内,IPv4大概是不会退出历史的舞台的,而且现在IPv6还没有成熟的编程接口,仍然需要IPv4的编程接口上编写网络程序。2.2内容及任务局域网即时聊天通过进行文本聊天来实现彼此沟通、交流信息。本次局域网即时聊天程序设计主要用了Visual C+编程环境,实现了在LAN中在线用户的文本、语音交互。在设计里涉及到了网络通信基本原理和Socket编程技。由于程序是在TCP/IP环境下运行,所以分服务器端和客户端。服务器端和客户端是通过建立Socket链接来实现聊天功能。本次设计主要着重于文本聊天部分,在同一个局域网内的不同主机可以互相聊天,而且聊天的人数不限。第三章 详细设计说明3.1 编程思路3.1.1简介计算机网络有两个典型的参考模型,一个是TCP/IP,另一个是OSI,这两个都是分层结构,由于各种原因,现在TCP/IP已经成为工业标准,这里不再讨论OSI的内容,只介绍TCP/IP参考模型。需要说明的是,TCP和IP分别为这个分层参考模型中的两层的名字,也分别是一种协议的名字,而IP还有“网络地址”的含义,这些分别取决于它们出现的上下文,平时所说的TCP/IP协议实际上指的是以这两个协议为核心的整个网络体系结构。3.1.2 TCP/IP分层TCP/IP分为5层,这5层从高到低分别是: 应用层(Application Layer):提供各种Internet 管理和应用服务功能。 运输层(Transport Layer):提供端到端的数据传送服务,由TCP协议和UDP协议组成,这一层又经常叫做TCP层,但是UDP和TCP的地位是相同的。 网络层 (Network Layer):又叫IP层,控制IP包的传送。 数据链路层(Data Link Layer):在有差错的物理线路上提供无差错的数据传输。 物理层(Physical Layer):在物理线路上传输原始的二进制数据位。设计一般的网络程序时,程序员只需要用到应用层和传输之间的接口,对于比较底层的程序,可能会用到传输层和网络层之间的接口,一般来说,很少有必要在更低的层次上编程了。TCP和UDP留给程序员的接口是套接字(socket),程序员通过套接字来使用TCP和UDP服务实现网络通信。TCP的使用方式和UDP有所不同,相比之下,TCP的使用比较复杂,涉及到监听、请求连接、接受连接等比较多的语义,并且不能广播,因此适合Client/Server(客户端/服务器)模式的网络服务,如FTP等,而这里的聊天程序采用的是各台主机地位完全平等的模式,因此使用UDP协议。3.1.3 UDP通信过程MFC使用 CSocket 封装了socket以及相关的一组操作,程序将通过CSocket使用UDP服务。具体使用UDP进行通信的过程如下: 建立一个UDP类型的CSocket实例。 设置socket属性,允许socket进行广播。 将socket和IP以及端口进行绑定。一台主机可以有多个IP和多个端口,进行绑定之后,系统将把一个确定的本机IP地址和端口留给这个socket,其它socket不能占用,这样可以避免不同程序同时发送数据包造成的混乱。 发送和接受数据包。发送数据包时,直接发送就可以了,但是接受数据包时,需要判断是否有数据可以接收,如果没有数据可以接收时调用接收函数,就会发生阻塞。 关闭socket,释放绑定的IP地址和端口资源。3.2总体结构图该程序是用c语言编译成的,通过建立【MFC AppWizord】工程,使用图形用户界面,实现一个聊天室中多人聊天,可以两个人私聊,并使用socket通信。聊天小程序IPADRESSBUTTON SENDHISTORYMESSAGE 图3-1函数总体构造图3.3变量分析ConstPort:端口 CSocket:类IPADRESS:IP地址HISTORY:历时聊天记录MESSAGE:发送信息FormPort:对方端口CString strToAdd:加入到聊天记录的字符串Buffer:用于接收数据缓冲区地址1024 :缓冲区的大小fromIP:源地址LPCTSTR(m_strMessage):数据报内容NULL:表示数据广播M_constPort:对方的端口Strip:对方的地址m_history:聊天记录3.4函数功能说明和部分函数流程图3.4.1子函数流程图1. void CE05Doc:OnFileConnect() 开始显示连接设置对话框先关闭上次的有效连接创建一个新的套接字显示连接成功信息结束 图3-2 显示连接这是一个现实连接函数。主要目的是为了,连接到对方的计算机。首先我们可以在程序界面上找到一个设置端口,对方IP地址,我们输入想要连接的对方的IP地址。然后点击开始。程序会自动创建一个新的套接。最后在程序界面显示连接成功信息。2. void Receive Message()开始通过套接字接收信息检查接收到的数据长度是否有效,截掉无效数据 N显示接收到的数据 Y 结束 图3-3 显示数据这个程序时是接收信息。首先通过套接字接收信息,然后检查收到的数据是否有效,裁掉无效数据,最后把接收到得数据显示到程序界面。实现这个功能主要是建立一个UDP类型的CSocket实例。开始输入对方IP地址输入要发送的信息发送接收对方消息结束连接成功3.4.2 主函数流程图 N Y 图3-4 接受对方消息这是主函数,主要显示我们是怎样聊天的。设计一般的网络程序时,程序员只需要用到应用层和传输之间的接口,对于比较底层的程序,可能会用到传输层和网络层之间的接口,一般来说,很少有必要在更低的层次上编程了。TCP和UDP留给程序员的接口是套接字(socket),程序员通过套接字来使用TCP和UDP服务实现网络通信。TCP的使用方式和UDP有所不同,相比之下,TCP的使用比较复杂,涉及到监听、请求连接、接受连接等比较多的语义,并且不能广播,因此适合Client/Server(客户端/服务器)模式的网络服务,如FTP等,而这里的聊天程序采用的是各台主机地位完全平等的模式,因此使用UDP协议。首先我们要输入对方的IP地址,然后连接,如果显示连接成功,我们就可以把我们想要发送的信息发送给对方。同时也能接收对方发送的信息。实现聊天。第 四 章 运行结果及软件使用说明4.1 运行结果 图4-1 初始画面4.2 使用说明1.先运行服务器程序,按确定即可,程序启动后会自动隐藏窗口,但在任务栏上留下一个托盘,可以单击图标使服务器工作窗口出现。2.再启动客户端程序,可以先申请新账号来登录,以后就可以直接用此ID登录了。客户端程序最小化后自动隐藏,且也会在任务栏上出现一个托盘,单击图标可以使主窗口出现。第五章 心得体验在学习了一学期的c+ 和一学期的数据结构后,我们第一次自己动手完成了这个课程设计。回想这几周的努力,有很多感慨!从最开始老师给每个人布置下自己的课题后,大家都去图书馆或者上网搜查资料,而我也不例外。跑了不知道多少趟的图书馆,但回来却总是发现,借得书不对,在聊天程序这方面,好多都是用c#编的,而用c+的很少。看着大家都拿着与自己课程设计相关的书籍资料,仔细的学习着,我心里不知道多着急。还好,在同学的帮助和推荐下,我终于找到了这本适合自己的书,当时不知道有多开心。翻开书,正准备着好好研究一番的时候,看到这些我不熟悉的,甚至有好多我都没见过的名词,心里又失落了之前关于c的学习,也只是编一下源代码,查找一些简单的错误而已。但书上介绍的内容,确是在visual c+ 6.0中新建一个 【MFC AppWizord】的工程,这是我以前从没接触过的,并且要实现聊天,还用到了TCP协议和IP地址。但是已经选择了,而且还费了那么多时间和精力找资料,我知道不能放弃,便硬着头皮,一点一点的看关于这方面的知识,跟着书上说明的步骤,一步一步的做过程中,也遇到了许多的麻烦。由于要添加代码,总是弄不懂要在哪添加,添加后,总是不对,并且运行的时候还有好多错误,让我又担心又着急。幸亏有老师和同学的帮忙,让我的错误越改越少,最后完成了我的课程设计!这次的经历,让我有很多感触。平时学习的知识是死的,要想真正成为自己的东西,就要让它变灵活,自己主动动手去做一些程序,才知道自己的不足。除了对我自己的努力感到欣慰外,更要感谢的是老师和同学的帮忙,让我事半功倍的完成了任务!附录1 参考文献1.Visual c+ 开发实用编程200例,中国铁道出版社 ,2005年11月2.谭浩强:C+程序设计,清华大学出版社,2004年6月第一版3.严蔚敏:数据结构(C语言版),清华大学出版社,1997年4月第一版4. 梁翎,李爱齐:c语言程序设计使用技巧与程序实例,上海科普出版社,1996年5月5.鲁沐浴:c语言最新编程技巧200例,电子工业出版社,1997年1月6.王大刚:c语言编程宝典7.王士元:c高级使用程序设计,清华大学出版社,1996年6月8.陈国章:Turbo c程序技巧与应用实例,天津科学技术出版社,1995年5月9.Herbert Schildt:C:The Complete Reference10.郭翠英:c语言课程设计案例精编,中国水利水电出版社,2005年附录2 程序源代码/ InfoDlg.cpp : implementation file/#include stdafx.h#include Info.h#include InfoDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)ON_WM_LBUTTONDOWN()/AFX_MSG_MAPEND_MESSAGE_MAP()/ CInfoDlg dialogCInfoDlg:CInfoDlg(CWnd* pParent /*=NULL*/): CDialog(CInfoDlg:IDD, pParent)/AFX_DATA_INIT(CInfoDlg)m_strMsg = _T();m_strName = _T();m_nPort = 0;m_nType = -1;m_strState = _T();m_hisMsg = _T();/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_bShow=true;void CInfoDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CInfoDlg)DDX_Control(pDX, IDM_EXIT, m_exit);DDX_Control(pDX, IDC_EDIT_PORT, m_edit_port);DDX_Control(pDX, IDC_EDIT_NAME, m_edit_name);DDX_Control(pDX, IDC_EDIT_MSG, m_edit_msg);DDX_Control(pDX, IDC_FRESH, m_fresh);DDX_Control(pDX, IDC_SHOW, m_shou);DDX_Control(pDX, IDC_ABOUT, m_about);DDX_Control(pDX, IDC_BUTTON_SEND, m_button_send);DDX_Control(pDX, IDC_BUTTON_CLOSE, m_button_close);DDX_Control(pDX, IDC_LIST_SEND, m_list_send);DDX_Control(pDX, IDC_BUTTON, m_button);DDX_Text(pDX, IDC_EDIT_MSG, m_strMsg);DDX_Text(pDX, IDC_EDIT_NAME, m_strName);DDX_Text(pDX, IDC_EDIT_PORT, m_nPort);DDX_Radio(pDX, IDC_RADIO1, m_nType);DDX_Text(pDX, IDC_STATE, m_strState);DDX_Text(pDX, IDC_HIS_MSG, m_hisMsg);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CInfoDlg, CDialog)/AFX_MSG_MAP(CInfoDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_RADIO1, OnRadio1)ON_BN_CLICKED(IDC_RADIO2, OnRadio2)ON_BN_CLICKED(IDC_BUTTON, OnButton)ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)ON_COMMAND(IDM_EXIT, OnExit)ON_COMMAND(IDC_ABOUT, OnAbout)ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)ON_BN_CLICKED(IDC_SHOW, OnShow)ON_BN_CLICKED(IDC_FRESH, OnFresh)ON_WM_LBUTTONDOWN()ON_WM_CREATE()ON_WM_LBUTTONDBLCLK()ON_WM_CONTEXTMENU()ON_COMMAND(ID_MENUITEM32772, OnMenuitem32772)ON_MESSAGE(MYWM_NOTIFYICON,OnMyIconNotify)ON_MESSAGE(WM_HOTKEY,OnHotKey)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CInfoDlg message handlersBOOL CInfoDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 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 iconCInfoApp* app=(CInfoApp*)AfxGetApp();if(app-m)m_nType=0;UpdateData(false); GetDlgItem(IDC_BUTTON)-SetWindowText(开始连接);elsem_nType=1; UpdateData(false);GetDlgItem(IDC_BUTTON)-SetWindowText(开始侦听);char buf200;DWORD dd=200;:GetComputerName(buf,&dd);m_nPort=4000;m_listenSocket.SetParenet(this);m_connectSocket.SetParenet(this);UpdateData(false);GetDlgItem(IDC_BUTTON_SEND)-EnableWindow(false);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(FALSE);ExpandDialog(IDC_LIST_SEND,true);m_menu.LoadMenu(IDR_MENU1);TaskBarAddIcon(GetSafeHwnd(),100,AfxGetApp()-LoadIcon(IDR_MAINFRAME),_T(聊天软件-太原科技大学);RegisterHotKey(m_hWnd,m_hotShow,MOD_WIN,Q);SetWindowPos(&CWnd:wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);return TRUE; / return TRUE unless you set the focus to a controlvoid CInfoDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ 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 CInfoDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(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);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CInfoDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CInfoDlg:OnRadio1() UpdateData(true);if(m_nType=0)m_button.SetWindowText(开始连接);elsem_button.SetWindowText(开始侦听);void CInfoDlg:OnRadio2() UpdateData(true);if(m_nType=0)m_button.SetWindowText(开始连接);elsem_button.SetWindowText(开始侦听);void CInfoDlg:OnAccept()m_listenSocket.Accept(m_connectSocket);m_strState=已经和 客户端 建立了连接;UpdateData(false);GetDlgItem(IDC_BUTTON_SEND)-EnableWindow(TRUE);void CInfoDlg:OnButton() UpdateData(true);GetDlgItem(IDC_RADIO1)-EnableWindow(FALSE);GetDlgItem(IDC_RADIO2)-EnableWindow(FALSE);GetDlgItem(IDC_EDIT_NAME)-EnableWindow(FALSE);GetDlgItem(IDC_EDIT_PORT)-EnableWindow(FALSE);GetDlgItem(IDC_BUTTON)-EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SEND)-EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(TRUE);if(m_nType=0)m_connectSocket.Create();m_connectSocket.Connect(m_strName,m_nPort);m_strState=正在连接到服务器(如果长时间无响应,请确认服务端程序是否处于侦听状态).;UpdateData(false);elsem_listenSocket.Create(m_nPort);m_listenSocket.Listen();m_strState=正在侦听客户端连接.;UpdateData(false);void CInfoDlg:OnConnect()m_strState=已经和 服务器 建立了连接;UpdateData(false);GetDlgItem(IDC_BUTTON_SEND)-EnableWindow(true);void CInfoDlg:OnButtonSend() OnSend();void CInfoDlg:OnSend()UpdateData(true);if(m_strMsg !=)if( m_connectSocket.Send (LPCTSTR(m_strMsg), m_strMsg.GetLength() =SOCKET_ERROR )m_strState=发送消息失败, 请确认已经正确连接!;UpdateData(false);elsem_list_send.AddString(你说:+m_strMsg);m_list_send.AddString(-);UpdateData(false);void CInfoDlg:OnReceive()char *pbuffer=new char1025;int bufferSize=1024;CString str;int iReceived=m_connectSocket.Receive(pbuffer,bufferSize);if( iReceived=SOCKET_ERROR)m_strState=接受消息失败 !;UpdateData(false);elsepbufferiReceived=NULL;str=pbuffer;m_list_send.AddString(对方说:+str);m_list_send.AddString(-); m_hisMsg=str; UpdateData(false);void CInfoDlg:OnButtonClose() OnClose();void CInfoDlg:OnClose()m_connectSocket.Close();m_listenSocket.Close();GetDlgItem(IDC_RADIO1)-EnableWindow(true);GetDlgItem(IDC_RADIO2)-EnableWindow(true);GetDlgItem(IDC_EDIT_NAME)-EnableWindow(true);GetDlgItem(IDC_EDIT_PORT)-EnableWindow(true);GetDlgItem(IDC_BUTTON)-EnableWindow(true);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(false);if(m_nType=0)m_strState=已经和 服务器 断开了连接 ;UpdateData(false);elsem_strState=已经 客户端 断开了连接 ;UpdateData(false);void CInfoDlg:OnExit() CDialog:OnOK();void CInfoDlg:OnAbout() CAboutDlg dlg;dlg.DoModal();void CInfoDlg:OnMenuitem32771() MessageBox(本软件目前还是免费版本,你可以自由复制使用。,说明,MB_OK | MB_ICONINFORMATION);void CInfoDlg:OnShow() static BOOL bExpand=false;/记录扩展或收缩状态 ExpandDialog(IDC_LIST_SEND,bExpand);/扩展或收缩对话框 bExpand=!bExpand; void CInfoDlg:ExpandDialog(int nResourceID, BOOL bExpand)static CRect rcLarge; /记录扩展后对话框的位置和大小 static CRect rcSmall; /记录收缩后对话框的位置和大小 CString sExpand; if(rcLarge.IsRectNull() CRect rcLandmark; /记录分界线的位置和大小 CWnd* pWndLandmark=GetDlgItem(nResourceID); ASSERT(pWndLandmark); GetWindowRect(rcLarge); pWndLandmark-GetWindowRect(rcLandmark); rcSmall=rcLarge; rcSmall.bottom=rcLandmark.top;/ 如果将扩展部分放在对话框的右边,只需将此句改为rcSmall.right=rcLandmark.left;即可 if(bExpand) SetWindowPos(NULL,0,0,rcLarge.Width(),rcLarge.Height(), SWP_NOMOVE|SWP_NOZORDER); sExpand=隐藏记录; EnableVisibleChildren(); else SetWindowPos(NULL,0,0,rcSmall.Width(),rcSmall.Height(),SWP_NOMOVE|SWP_NOZORDER); sExpand=显示记录; EnableVisibleChildren(); SetDlgItemText(IDC_SHOW,sExpand); void CInfoDlg:EnableVisibleChildren()CWnd *pWndCtl=GetWindow(GW_CHILD); CRect rcTest; CRect rcControl; /记录各控件的位置和大小 CRect rcShow; /记录目前显示对话框的位置和大小 GetWindowRect(rcShow); while(pWndCtl!=NULL) pWndCtl-GetWindowRect(rcControl); if(rcTest.IntersectRect(rcShow,rcControl) pWndCtl-EnableWindow(TRUE); else pWndCtl-EnableWindow(FALSE); pWndCtl=pWndCtl-GetWindow(GW_HWNDNEXT); void CInfoDlg:OnFresh() m_list_send.ResetContent();void CInfoDlg:OnLButtonDown(UINT nFlags, CPoint point) ReleaseCapture();SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,0);CDialog:OnLButtonDown(nFlags, point);int CInfoDlg:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDialog:OnCreate(lpCreateStruct) = -1)return -1;return 0;void CInfoDlg:OnLButtonDblClk(UINT nFlags, CPoint point) CAboutDlg dlg;dlg.DoModal();CDialog:OnLButtonDblClk(nFlags, point);void CAboutDlg:OnLButtonDown(UINT nFlags, CPoint point) CDialog:OnOK();CDialog:OnLButtonDown(nFlags, point);void CInfoDlg:OnContextMenu(CWnd* pWnd, CPoint point) CMenu *pmenu;pmenu=m_menu.GetSubMenu(0);pmenu-TrackPopupMenu( TPM_RIGHTBUTTON,point.x,point.y,this,NULL);void CInfoDlg:OnMenuitem32772() MessageBox(其实很简单,自己看一下就知道了!,如何使用,MB_OK | MB_ICONINFORMATION);BOOL CInfoDlg:TaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip)NOTIFYICONDATA d;d.cbSize=sizeof(NOTIFYICONDATA);d.hWnd=hwnd;d.uID=uID;d.uFlags=NIF_ICON | NIF_TIP | NIF_MESSAGE;d.uCallbackMessage=MYWM_NOTIFYICON;d.hIcon=hicon;if(lpszTip)lstrcpy(d.szTip,lpszTip);elsed.szTip0=0;return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度漯河职业技术学院单招《物理》考前冲刺试卷【学生专用】附答案详解
- 2025计算机一级考试综合练习附答案详解【培优B卷】
- 中班综合教案《寻找蛋宝宝》反思
- 2025年绿色金融市场发展与金融机构战略研究报告
- 2025年环境评价公众参与机制优化与绿色农业发展策略研究报告
- 全屋定制销售合同单
- 河南省南阳市宛城区等2地2025-2026学年高二上学期开学考试语文试题(含答案)
- 巡护员安全培训简报内容课件
- 屋檐线描课件绘画步骤
- 小鹅通上传课件时间长问题
- 2025至2030中国原果浆行业项目调研及市场前景预测评估报告
- 商场装修合同
- 2025年版住宅房屋租赁合同范本下载
- 2-5跨学科实践制作隔音房间模型八年级物理学案人教版
- 房屋学位租赁合同协议书
- 2025年高速公路标杆企业组织效能报告
- 2025年秋新人教版数学三年级上册全册教案
- 政府装监控合同范本
- 重症凝血病标准化评估中国专家共识(2025版)
- 2025年秋季学期“1530”安全教育记录表
- 竖井滑模施工组织设计
评论
0/150
提交评论