計(jì)算機(jī)優(yōu)秀畢業(yè)論文設(shè)計(jì)
《計(jì)算機(jī)優(yōu)秀畢業(yè)論文設(shè)計(jì)》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《計(jì)算機(jī)優(yōu)秀畢業(yè)論文設(shè)計(jì)(72頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、word 本科畢業(yè)設(shè)計(jì)(論文) 題目名稱(chēng):基于VC++的企業(yè)內(nèi)部通信軟件的設(shè)計(jì)與實(shí)現(xiàn) 學(xué) 院: 計(jì)算機(jī)科學(xué)與技術(shù) 專(zhuān)業(yè)年級(jí): 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué)生某某: 班級(jí)學(xué)號(hào): 指導(dǎo)教師: 二○一四 年 六 月 六 日 67 / 72 摘 要 八十年代初,美國(guó)政府的高級(jí)研究工程機(jī)構(gòu)〔ARPA〕給加利福尼亞大學(xué)Berkeley分校提供了資金,讓他們?cè)赨NIX操作系統(tǒng)下實(shí)現(xiàn)TCP/IP協(xié)議。在這個(gè)項(xiàng)目中,研究人員為T(mén)CP/IP網(wǎng)絡(luò)通信開(kāi)發(fā)了一個(gè)API〔應(yīng)用程序接口〕。這個(gè)
2、API稱(chēng)為Socket接口〔套接字〕。今天,SOCKET接口是TCP/IP網(wǎng)絡(luò)最為通用的API,也是在INTERNET上進(jìn)展應(yīng)用開(kāi)發(fā)最為通用的API。 隨著網(wǎng)絡(luò)技術(shù)的開(kāi)展與人們生活的需求,網(wǎng)絡(luò)通信已越來(lái)越受到人們的親睞。本課題是開(kāi)發(fā)一個(gè)基于UDP的企業(yè)內(nèi)部通信系統(tǒng),既可以應(yīng)用于封閉的局域網(wǎng)環(huán)境下,也可以在互聯(lián)網(wǎng)的環(huán)境下使用。本軟件是基于VC++6.0開(kāi)發(fā)的,采用軟件工程的方法,應(yīng)用了程序設(shè)計(jì)技術(shù)、網(wǎng)絡(luò)技術(shù),運(yùn)用了WINSOCK相關(guān)API接口。WINSOCK 是在Windows進(jìn)展網(wǎng)絡(luò)通信編程的API接口,也是Windows網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)。研究的主要內(nèi)容是如何利用套接字編寫(xiě)網(wǎng)絡(luò)通信程序,主要完
3、成了客戶(hù)端的發(fā)送信息,發(fā)送圖片與顯示在線(xiàn)用戶(hù)與多人聊天,文件傳輸?shù)裙ぷ?。文件傳輸功能是本軟件系統(tǒng)的一個(gè)亮點(diǎn),它可以讓兩個(gè)用戶(hù)之間實(shí)現(xiàn)文件的傳遞。通過(guò)聊天工具的使用,讓分布在不同地點(diǎn)、使用不同機(jī)器的一組用戶(hù)能夠與時(shí)進(jìn)展信息交流,以達(dá)到信息共享的目的,從而提高工作或者生活效率。通過(guò)測(cè)試,本軟件操作簡(jiǎn)單,靈活性好,運(yùn)行也比擬穩(wěn)定,可以廣泛使用。 關(guān)鍵字 : UDP;VC++6.0;WINSOCK;網(wǎng)絡(luò)通信 Abstract The early 80s, the U.S. government's Advanced Research Project agency (ARPA) to the
4、 University of California, Berkeley provided funding to enable them to achieve in the UNIX operating system, TCP / IP protocol. In this project, researchers for the TCP / IP Network munication Development an API (application program interface). This API is called Socket Interface (socket). Today, SO
5、CKET interface is a TCP / IP network of the most mon API, is the INTERNET application development on the most mon API. With the development of network technology and the demand of people's life, network munication has been more and more get the favor of people. This topic is to develop an internal
6、munication system based on UDP, local area network (LAN) can be used in a closed environment, also can be used under the environment of Internet. This software is based on vc + + 6.0 development, adopt the method of software engineering, application programming technology, network technology, using
7、the WINSOCK API interface.WINSOCK is in Windows network munication programming API interface, also is the standard of Windows network programming.The main content of the research is how to use the socket network munication program, mainly pleted the client sends a message, send pictures to show onli
8、ne users and many people chat, file transfer, etc.File transfer function is one of the highlights of this software system, it can realize the file transfer between two users.Through the use of chat, let distribution in different locations, a group of users will be able to use different machine excha
9、nge of information in a timely manner, in order to achieve the purpose of information sharing, so as to improve the efficiency of work or life.Through test, the software operation is simple, flexibility is good, operation is stable, can be widely used. Key words:UDP;VC++6.0;WINSOCK;Network munica
10、tion 目錄 摘 要I AbstractII 第1章 緒 論1 1.1 課題選題背景1 1.2 國(guó)內(nèi)外現(xiàn)狀分析和研究成果1 1.3 課題研究?jī)?nèi)容與意義2 第2章 相關(guān)技術(shù)概述3 2.1 開(kāi)發(fā)環(huán)境3 2.1.1 開(kāi)發(fā)工具簡(jiǎn)介3 2.1.2 Visual C++ MFC概述3 2.2 WinSock網(wǎng)絡(luò)編程3 2.2.1 Socket簡(jiǎn)介4 2.2.2 開(kāi)發(fā)Windows Sockets網(wǎng)絡(luò)通信程序的軟、硬件環(huán)境4 2.2.3 CSocket類(lèi)編程模型5 2.2.4 用VC6.0進(jìn)展Windows Sockets程序開(kāi)發(fā)的技術(shù)要點(diǎn)5
11、2.3 TCP/IP協(xié)議概述6 第3章 軟件需求分析7 3.1 需求分析7 3.1.1 功能需求分析7 3.1.2 數(shù)據(jù)需求分析7 3.1.3 性能需求分析7 3.1.4 運(yùn)行需求分析8 3.2 可行性分析8 3.2.1 經(jīng)濟(jì)可行性分析8 3.2.2 技術(shù)可行性分析8 3.2.3 運(yùn)行可行性分析8 第4章 軟件系統(tǒng)設(shè)計(jì)9 4.1 概要設(shè)計(jì)9 4.2 根本框架設(shè)計(jì)10 4.2.1 宏和數(shù)據(jù)結(jié)構(gòu)的定義10 4.2.2 程序配置文件10 4.2.3 調(diào)試模塊10 4.2.4 主界面初始化11 4.2.5 主界面布局15 4.2.6 自繪按鈕16 4
12、.2.7 自繪好友列表框18 4.3 好友管理19 4.3.1 添加好友19 4.3.2 刪除好友21 4.3.3 與好友保持連接22 4.4 聊天模塊23 4.5 聊天室模塊26 4.6 傳送文件模塊29 4.7 共享屏幕模塊32 4.8 白板模塊34 第5章 軟件測(cè)試36 5.1 軟件測(cè)試的目的36 5.2 軟件測(cè)試方法分類(lèi)36 5.2.1 靜態(tài)測(cè)試與動(dòng)態(tài)測(cè)試36 5.2.2 黑盒測(cè)試與白盒測(cè)試36 5.2.3 測(cè)試中的錯(cuò)誤分類(lèi)37 5.3 通訊軟件測(cè)試38 5.3.1 測(cè)試用例設(shè)計(jì)要求38 5.3.2 聊天模塊測(cè)試用例38 5.4
13、 測(cè)試總結(jié)38 結(jié) 論40 致 謝41 參考文獻(xiàn)42 附 錄43 第1章 緒 論 1.1 課題選題背景 近年來(lái),隨著全球信息化的不斷開(kāi)展,網(wǎng)絡(luò)也在飛速開(kāi)展。我們都知道局域網(wǎng)的存在,特別是在大型企業(yè),比如銀行、公安機(jī)關(guān)等等對(duì)網(wǎng)絡(luò)安全要求特別嚴(yán)格的企業(yè)單位都會(huì)有自己的局域網(wǎng),因?yàn)榫钟蚓W(wǎng)的安全可靠,使其不容易受到網(wǎng)絡(luò)病毒的攻擊,所以局域網(wǎng)得以在企業(yè)之中廣泛應(yīng)用。然而,任何企業(yè)的內(nèi)部都是離不開(kāi)通訊的,所以企業(yè)內(nèi)部通信軟件就應(yīng)運(yùn)而生了。這種通信軟件是專(zhuān)為局域網(wǎng)通信而開(kāi)發(fā)的,它適用于局域網(wǎng),同時(shí)也促進(jìn)了局域網(wǎng)的開(kāi)展,局域網(wǎng)開(kāi)展又給通信軟件帶來(lái)了更多應(yīng)用的機(jī)會(huì),
14、可以說(shuō),局域網(wǎng)通信工具和局域網(wǎng)二者之間相輔相成,相互促進(jìn)。開(kāi)展到今天,大多數(shù)企業(yè)都應(yīng)用了局域網(wǎng),可見(jiàn)其在當(dāng)今社會(huì)的重要地位。應(yīng)用局域網(wǎng)辦公的企業(yè),必須要有自己企業(yè)內(nèi)部的通訊軟件,然而,現(xiàn)在,在廣域網(wǎng)上,可盈利的通訊軟件到處都是,而局域網(wǎng)內(nèi)的通訊軟件卻很少,在功能上,也是參差不齊。因此,為了企業(yè)更好、更安全的通訊,我想到開(kāi)發(fā)一款適用于企業(yè)的局域網(wǎng)通信軟件,恰好通過(guò)我的大學(xué)所學(xué),我有信心在教師的講解和指導(dǎo)下,很好的完成這任務(wù)。最后,教師為我選定了基于VC++企業(yè)內(nèi)部通信軟件的設(shè)計(jì)與實(shí)現(xiàn)這一題目。 1.2 國(guó)內(nèi)外現(xiàn)狀分析和研究成果 即時(shí)通訊工具是目前使用最為普遍的網(wǎng)絡(luò)應(yīng)用軟件之一,繼 出現(xiàn)
15、在我們的計(jì)算機(jī)上之后,網(wǎng)易、新浪、搜狐等知名公司也迫不與待地參加了這一領(lǐng)域的競(jìng)爭(zhēng),而微軟、雅虎、AOL的國(guó)際巨頭公司也一刻沒(méi)有停止自己擴(kuò)X的腳步。國(guó)內(nèi)在使用的最普與的就是騰訊 ,微軟的MSN也受到商務(wù)人士的青睞;國(guó)外主要使用的是由美國(guó)在線(xiàn)出的ICQ、AMI以與微軟的MSN等。 目前,windows平臺(tái)方面的即時(shí)通訊軟件已經(jīng)很多,但是其他系統(tǒng)的比擬少,例如Linux平臺(tái),雖然有類(lèi)似 方面的一些產(chǎn)品,比如Linux 、Luna ,但是數(shù)量畢竟不多且功能界面等都還不太理想;面向企業(yè)的即時(shí)通訊軟件雖然比擬多,但是除了 、微軟等公司的產(chǎn)品,其他的產(chǎn)品都還比擬年輕,推出時(shí)間較短,且用
16、戶(hù)較少。鑒于此種情況,很多公司都在開(kāi)發(fā)新的即時(shí)通訊工具軟件,利用新的技術(shù)開(kāi)發(fā),使客戶(hù)端和服務(wù)器端的性能和功能都得到一定的提升,適合在企業(yè)內(nèi)部網(wǎng)絡(luò)和互聯(lián)網(wǎng)上運(yùn)行,同時(shí)使其具備跨平臺(tái)的特性,方便在各個(gè)系統(tǒng)上運(yùn)行。 另外,許多企業(yè)已經(jīng)應(yīng)用了即時(shí)通訊類(lèi)產(chǎn)品作為內(nèi)部交流的平臺(tái)。但絕大多數(shù)企事業(yè)單位只把即時(shí)通訊類(lèi)產(chǎn)品作為邊緣產(chǎn)品,沒(méi)有充分的認(rèn)識(shí)到即時(shí)通訊類(lèi)產(chǎn)品在工作中的重要作用,沒(méi)有想過(guò)去如何正確的應(yīng)用。還有許多企事業(yè)單位使用網(wǎng)絡(luò)個(gè)人交流工具〔如 ,MSN〕,但存在許多安全隱患。許多開(kāi)發(fā)商并沒(méi)有將此產(chǎn)品作為公司的重點(diǎn),也并沒(méi)有從客戶(hù)的角度出發(fā),只是在產(chǎn)品線(xiàn)上附加即時(shí)通訊產(chǎn)品,做的不夠完善,使此產(chǎn)品淪
17、為邊緣產(chǎn)品,從而導(dǎo)致即時(shí)通訊產(chǎn)品市場(chǎng)萎縮。 隨著我們國(guó)家的信息化飛速開(kāi)展,許多企事業(yè)單位信息化程度大幅度提高。企事業(yè)單位非常需要使用內(nèi)部即時(shí)通訊產(chǎn)品來(lái)提高工作效率。 1.3 課題研究?jī)?nèi)容與意義 為了保障通信安全,建設(shè)內(nèi)網(wǎng)、專(zhuān)網(wǎng)是一個(gè)解決這一問(wèn)題的方法,隨著企業(yè)業(yè)務(wù)X圍的不斷擴(kuò)大,網(wǎng)絡(luò)規(guī)模也在擴(kuò)大,采用該方案的話(huà),本錢(qián)必然非常高。由于公眾信息網(wǎng)是對(duì)整個(gè)社會(huì)開(kāi)放的公眾根底網(wǎng)絡(luò),具有覆蓋性X圍廣、速度快、費(fèi)用低、使用方便等特點(diǎn),但同時(shí)卻存在著安全性差的問(wèn)題。用戶(hù)通過(guò)公眾信息網(wǎng)來(lái)傳輸?shù)男畔?,在傳輸?shù)倪^(guò)程中可能被竊取、篡改和偽造,信息的安全性和可靠性因此會(huì)大大的降低,所以?xún)?nèi)網(wǎng)、專(zhuān)網(wǎng)還是不可缺少的
18、。 在通信工具上,我們習(xí)慣了通過(guò)類(lèi)似于 ,MSN之類(lèi)的程序軟件和天南地北的朋友聊天、發(fā)信息,不過(guò)所有聊天程序都需要Internet的支持,因此它們無(wú)法在局域網(wǎng)內(nèi)部大顯身手,那么是否想到過(guò)要讓單位內(nèi)部的員工,寢室周?chē)耐瑢W(xué),不用上Internet就可以輕松體驗(yàn)到內(nèi)網(wǎng)通訊的樂(lè)趣呢?有了這種想法,本課題的研究?jī)?nèi)容——開(kāi)發(fā)局域網(wǎng)通信軟件就有了必要性,讓單位員工或者寢室同學(xué)不出內(nèi)網(wǎng)就能自由通信。 企業(yè)內(nèi)部通信軟件是一個(gè)即時(shí)通信工具。因此,通過(guò)該軟件的設(shè)計(jì)和開(kāi)發(fā),可以對(duì)自己所學(xué)習(xí)的知識(shí)進(jìn)展了一次綜合提高,并且會(huì)有更深層次的理解和掌握,在這個(gè)過(guò)程中,還能激發(fā)自己的學(xué)習(xí)潛力,提高軟件開(kāi)發(fā)的能力
19、,加深對(duì)網(wǎng)絡(luò)協(xié)議和Windows環(huán)境下網(wǎng)絡(luò)編程的理解和掌握,所以,開(kāi)發(fā)企業(yè)內(nèi)部通信軟件在理論和實(shí)踐上都有非常重要的意義。 第2章相關(guān)技術(shù)概述 2.1 開(kāi)發(fā)環(huán)境 本節(jié)主要介紹本軟件系統(tǒng)的開(kāi)發(fā)環(huán)境,以與運(yùn)用的編程工具等。 2.1.1 開(kāi)發(fā)工具簡(jiǎn)介 本系統(tǒng)采用Windows 7中文操作系統(tǒng),包含Windows API的支持,使用面向?qū)ο蟮木幊坦ぞ遃isual C++ 6.0進(jìn)展項(xiàng)目開(kāi)發(fā)。他是一款面向?qū)ο蟮墓δ軓?qiáng)大的可視化編程開(kāi)發(fā)工具。使用Vissual C++可以完成任何C語(yǔ)言和C++語(yǔ)言的程序。其中的MFC庫(kù)集成了Windows Sockets API應(yīng)用程序接口,使得用戶(hù)可以用面向
20、對(duì)象的方法直接調(diào)用。AppWizard可以用來(lái)生成初步的框架文件,資源編輯器用于幫助直觀地設(shè)計(jì)用戶(hù)接口,CLassWizard用來(lái)協(xié)助添加代碼到框架文件,并且提供文檔/視圖結(jié)構(gòu)支持,從而使用應(yīng)用程序開(kāi)發(fā)變得輕松。 2.1.2 Visual C++ MFC概述 MFC〔Microsoft Foundation Class Library〕庫(kù)是Microsoft公司基于Windows的C++應(yīng)用程序編程接口,是Visual C++中編寫(xiě)Windows應(yīng)用程序的首選方法。MFC是一組C++類(lèi),這些是由常用的Windows應(yīng)用程序定制的。使用MFC,可以在任何時(shí)候調(diào)用Win32函數(shù)、最大程度地利
21、用Windows。而且,基于MFC的程序不僅小巧而且運(yùn)行速度快,這是因?yàn)閂isual C++非常接近Windows的底層,所以編譯器所編譯出來(lái)的程序質(zhì)量相當(dāng)?shù)母?,從而保證了Visual C++編寫(xiě)出來(lái)的軟件產(chǎn)品擁有高效率的運(yùn)行速度。MFC中的各種類(lèi)結(jié)合起來(lái)構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此根底上來(lái)建立Windows下的應(yīng)用程序,這是一種相對(duì)SDK來(lái)事更為簡(jiǎn)單的方法。因?yàn)樵诳傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶(hù)接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。 2.2 WinSock網(wǎng)絡(luò)編程 Windows Socke
22、ts是從Berkeley Sockets擴(kuò)展而來(lái)的,其在繼承Berkeley Sockets的根底上,又進(jìn)展了新的擴(kuò)大。這些擴(kuò)大主要是提供了一些異步函數(shù),并增加了符合WINDOWS消息驅(qū)動(dòng)特性的網(wǎng)絡(luò)事件異步選擇機(jī)制。 Windows Sockets由兩局部組成:開(kāi)發(fā)組件和運(yùn)行組件。 開(kāi)發(fā)組件:Windows Sockets 實(shí)現(xiàn)文檔、應(yīng)用程序接口(API)引入庫(kù)和一些頭文件。 運(yùn)行組件:Windows Sockets 應(yīng)用程序接口的動(dòng)態(tài)庫(kù)(WINSOCK.DLL)。 2.2.1 Socket簡(jiǎn)介 套接字〔Socket〕最初是由加利福尼亞大學(xué)Berkeley分校為UNIX操作系統(tǒng)開(kāi)發(fā)的
23、網(wǎng)絡(luò)通信接口,隨著UNIX操作系統(tǒng)的廣泛使用,套接字成為當(dāng)前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。90年代初,由Sun Microsystems,JSB Corporation,F(xiàn)TP software,Microdyne和Microsoft等幾家公司共同制定了一套標(biāo)準(zhǔn),即Windows Sockets規(guī)X。 Windows Sockets API是Microsoft Windows的網(wǎng)絡(luò)程序設(shè)計(jì)接口,它在繼承了Berkeley Sockets主要特征的根底上,又對(duì)它進(jìn)展了重要擴(kuò)大。這些擴(kuò)大主要是提供了一些異步函數(shù),并增加了符合Windows消息驅(qū)動(dòng)特性的網(wǎng)絡(luò)事件異步選擇機(jī)制。這些擴(kuò)大有利于應(yīng)用
24、程序開(kāi)發(fā)者編制符合Windows編程模式的軟件,它使在Windows下開(kāi)發(fā)高性能的網(wǎng)絡(luò)通信程序成為可能。 Socket實(shí)際上是指一個(gè)通信端點(diǎn),借助于它,用戶(hù)所開(kāi)發(fā)的Socket應(yīng)用程序,可以通過(guò)網(wǎng)絡(luò)與其它Socket應(yīng)用程序進(jìn)展通信。 近年來(lái),隨著計(jì)算機(jī)網(wǎng)絡(luò)與Windows 95的流行,許多用戶(hù)所開(kāi)發(fā)的應(yīng)用程序需要實(shí)現(xiàn)網(wǎng)絡(luò)間的數(shù)據(jù)通信。 2.2.2 開(kāi)發(fā)Windows Sockets網(wǎng)絡(luò)通信程序的軟、硬件環(huán)境 所采用的操作系統(tǒng)軟件可以是Windows XP,Windows 7,因?yàn)樗鼈兌贾С諻indows Sockets API,在以下的介紹中,我們將以在Windows XP環(huán)境下的開(kāi)
25、發(fā)為例。 所采用的編程語(yǔ)言一般可選目前較流行使用的可視化和采用面向?qū)ο蠹夹g(shù)的Microsoft Visual C++ 6.0。Visual C++ 6.0可在Windows XP或Windows 7環(huán)境下運(yùn)行,其開(kāi)發(fā)系統(tǒng)增加了全面集成的基于Windows 的開(kāi)發(fā)工具以與一個(gè)基于傳統(tǒng)C/C++開(kāi)發(fā)過(guò)程的“可視化〞用戶(hù)界面驅(qū)動(dòng)模型。Visual C++ 6.0中的Microsoft基類(lèi)〔MFC,即Microsoft Foundation Class)庫(kù)是一系列C++類(lèi),其中封裝著為Microsoft Windows操作系統(tǒng)系列編寫(xiě)應(yīng)用程序的各種功能 。在有關(guān)套接字方面,Visual C++ 6
26、.0對(duì)原來(lái)的Windows Sockets庫(kù)函數(shù)進(jìn)展了一系列封裝,繼而產(chǎn)生了CSocket 、CSocketFile等類(lèi),它們封裝著有關(guān)Socket的各種功能。 所采用的網(wǎng)絡(luò)通信協(xié)議一般是TCP / IP。Windows XP和Windows 7都帶有該協(xié)議。但是,所開(kāi)發(fā)的網(wǎng)絡(luò)通信應(yīng)用程序并不能直接與TCP / IP核心打交道,而是與網(wǎng)絡(luò)應(yīng)用編程界面Windows Sockets API打交道。Windows Sockets API如此可直接與TCP/IP核心進(jìn)展溝通。TCP / IP核心協(xié)議連同網(wǎng)絡(luò)物理介質(zhì)〔如網(wǎng)卡〕一起,都是提供網(wǎng)絡(luò)應(yīng)用程序間相互通信的設(shè)施。 2.2.3 CSocke
27、t類(lèi)編程模型 使用CSocket對(duì)象涉與CArchive和CSocketFile 類(lèi)對(duì)象。以下介紹的針對(duì)字節(jié)流型套接字的操作步驟中,只有第三步對(duì)于客戶(hù)方和服務(wù)方操作是不同的,其他步驟都一樣。 〔1〕構(gòu)造一個(gè)CSocket對(duì)象。 〔2〕使用這個(gè)對(duì)象的Create()成員函數(shù)產(chǎn)生一個(gè)socket對(duì)象。在客戶(hù)方程序中,除非需要數(shù)據(jù)報(bào)套接字,Create()函數(shù)一般情況下應(yīng)該使用默認(rèn)參數(shù)。而對(duì)于服務(wù)方程序,必須在調(diào)用Create時(shí)指定一個(gè)端口。需要注意的是,Carchive類(lèi)對(duì)象不能與數(shù)據(jù)報(bào)〔UDP〕套接字一起工作,因此對(duì)于數(shù)據(jù)報(bào)套接字,CAsyncSocket和CSocket 的使用方法是
28、一樣的。 〔3〕如果是客戶(hù)方套接字,如此調(diào)用CAsyncSocket ∷Connect()函數(shù)與服務(wù)方套接字連接;如果是服務(wù)方套接字,如此調(diào)用CAsyncSocket∷Listen()開(kāi)始監(jiān)聽(tīng)來(lái)自客戶(hù)方的連接請(qǐng)求,收到連接請(qǐng)求后,調(diào)用CAsyncSocket∷Accept()函數(shù)承受請(qǐng)求,建立連接。請(qǐng)注意Accept()成員函數(shù)需要一個(gè)新的并且為空的CSocket對(duì)象作為它的參數(shù),解釋同上。 〔4〕產(chǎn)生一個(gè)CSocketFile對(duì)象,并把它與CSocket 對(duì)象關(guān)聯(lián)起來(lái)。 〔5〕為接收和發(fā)送數(shù)據(jù)各產(chǎn)生一個(gè)CArchive 對(duì)象,把它們與CSocketFile對(duì)象關(guān)聯(lián)起來(lái)。切記CArc
29、hive是不能和數(shù)據(jù)報(bào)套接字一起工作的。 〔6〕使用CArchive對(duì)象的Read()、Write()等函數(shù)在客戶(hù)與服務(wù)方傳送數(shù)據(jù)。 〔7〕通訊完畢后,銷(xiāo)毀CArchive、CSocketFile和CSocket對(duì)象。 2.2.4 用VC6.0進(jìn)展Windows Sockets程序開(kāi)發(fā)的技術(shù)要點(diǎn) 〔1〕同常規(guī)編程一樣,無(wú)論服務(wù)器方還是客戶(hù)方應(yīng)用程序都要進(jìn)展所謂的初始化處理,這局部工作仍可采用消息驅(qū)動(dòng)機(jī)制來(lái)先期完成。 〔2〕一般情況下,網(wǎng)絡(luò)通信程序是某應(yīng)用程序中的一模塊。在單獨(dú)調(diào)試網(wǎng)絡(luò)通信程序時(shí),要盡量與采用該通信模塊的其它應(yīng)用程序開(kāi)發(fā)者約定好,統(tǒng)一采用一種界面形式,即單文檔界面S
30、DI、多文檔界面MDI和基于對(duì)話(huà)框界面中的一種〔這在使用AppWizard形成項(xiàng)目[Project]文件時(shí)有提示〕,盡管這并非必須,但可使通信模塊在移植到所需的應(yīng)用程序時(shí)省時(shí)省力,因?yàn)閂isual C++ 6.0這種可視化語(yǔ)言在給我們提供方便的同時(shí),也給我們帶來(lái)某些不便,譬如所形成的項(xiàng)目文件中的許多相關(guān)文件與所采用的界面形式密切聯(lián)系,許多消息驅(qū)動(dòng)功能,隨所采用的界面形式不同而各異。 當(dāng)然,也可將通信模塊函數(shù)化,并形成一個(gè)動(dòng)態(tài)連接庫(kù)文件(DLL文件〕,供主程序調(diào)用。 〔3〕以通信程序作為其中一個(gè)模塊的應(yīng)用程序往往不是在等待數(shù)據(jù)發(fā)送或接收完之后再做其它工作,因而在主程序中要采用多線(xiàn)程〔Mult
31、ithreaded〕技術(shù)。即將數(shù)據(jù)的發(fā)或收,放在一個(gè)具有一定優(yōu)先級(jí)〔一般宜取較高優(yōu)先級(jí)〕的輔助線(xiàn)程中,在數(shù)據(jù)發(fā)或收期間,主程序仍可進(jìn)展其它工作,譬如利用上一個(gè)周期收到的數(shù)據(jù)繪制曲線(xiàn) 。Visual C++ 6.0中的MFC提供了許多有關(guān)啟動(dòng)線(xiàn)程、管理線(xiàn)程、同步化線(xiàn)程、終止線(xiàn)程等功能函數(shù)。 〔4〕在許多情況下,要求通信模塊應(yīng)實(shí)時(shí)地收、發(fā)數(shù)據(jù)。譬如調(diào)用之的主程序以0.5秒為一周期,在這段時(shí)間內(nèi) ,要進(jìn)展如下工作:接收數(shù)據(jù),利用收到的數(shù)據(jù)進(jìn)展運(yùn)算,將運(yùn)算結(jié)果發(fā)送到其它計(jì)算機(jī)節(jié)點(diǎn),周而復(fù)始。我們?cè)诔浞掷肳indows Sockets的基于消息的網(wǎng)絡(luò)事件異步選擇機(jī)制,用消息來(lái)驅(qū)動(dòng)數(shù)據(jù)的發(fā)送和接收的根
32、底上,結(jié)合使用其他措施,如將數(shù)據(jù)的收和發(fā)放在高優(yōu)先級(jí)線(xiàn)程,在軟件設(shè)計(jì)上,安排好時(shí)序,盡量防止在同一時(shí)間內(nèi),雙方都在向?qū)Ψ桨l(fā)送大量數(shù)據(jù)的情況發(fā)生,保證網(wǎng)絡(luò)要有足夠的帶寬等,成功地實(shí)現(xiàn)了數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性。 2.3 TCP/IP協(xié)議概述 TCP/IP協(xié)議〔Transfer Control Protocol/Internet Protocol〕指?jìng)鬏斂刂?網(wǎng)絡(luò)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議。這個(gè)協(xié)議作為網(wǎng)絡(luò)中使用的根本協(xié)議,是Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的根底。 TCP/IP協(xié)議是包括上百個(gè)協(xié)議,其中包括很多功能:TCP〔Transfer Control Protocol〕傳輸控制協(xié)議,IP〔Inte
33、rnet Protocol〕互聯(lián)網(wǎng)協(xié)議,UDP〔User Datagram Protocol〕用戶(hù)數(shù)據(jù)報(bào)協(xié)議,ICMP〔Internet Control Message Protocol〕互聯(lián)網(wǎng)控制信息協(xié)議,F(xiàn)TP〔File Transfer Protocol〕文件傳輸協(xié)議,SMTP〔Simle Mail Transfer Protocol〕簡(jiǎn)單傳輸協(xié)議,SNMP〔simle Network Manage Protocol〕簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議,ARP〔Address Resolution Protocol〕地址解析協(xié)議等。 從分層模型方面來(lái)講,TCP/IP由四個(gè)層次組成:鏈路層、網(wǎng)絡(luò)層、傳輸層
34、、應(yīng)用層。每一層負(fù)責(zé)不同的功能: 〔1〕鏈路層,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序和計(jì)算機(jī)中對(duì)應(yīng)的網(wǎng)絡(luò)接口。用于處理與電纜等其他任何傳輸媒介的物理接口細(xì)節(jié)。 〔2〕網(wǎng)絡(luò)層,即互聯(lián)網(wǎng)層,通常處理分組網(wǎng)絡(luò)中的活動(dòng),例如分組的路由選擇。網(wǎng)絡(luò)層協(xié)議包括IP協(xié)議〔網(wǎng)際協(xié)議〕,ICMP協(xié)議〔Internet互聯(lián)網(wǎng)控制報(bào)文協(xié)議〕,以與IGMP協(xié)議〔Internet組管理協(xié)議〕。 〔3〕運(yùn)輸層,為兩臺(tái)主機(jī)上的應(yīng)用程序提供點(diǎn)對(duì)點(diǎn)活端到端的通信。在TCP/IP協(xié)議組件中,有兩個(gè)互不一樣的傳輸協(xié)議:TCP〔傳輸控制協(xié)議〕和UDP〔用戶(hù)數(shù)據(jù)報(bào)協(xié)議〕。TCP為兩臺(tái)主機(jī)提供高可靠性的數(shù)據(jù)通信。由于運(yùn)輸層提供了高可靠性
35、的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而UDP如此為應(yīng)用層來(lái)提供。 〔4〕應(yīng)用層,負(fù)責(zé)處理特定的程序細(xì)節(jié)。幾乎各種不同的TCP/IP實(shí)現(xiàn)都會(huì)提供下面這些通用的應(yīng)用程序。 l Telnet遠(yuǎn)程登錄 l FTP文件傳輸協(xié)議 l SMTP簡(jiǎn)單傳輸協(xié)議 l SNMP簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議 第3章 軟件需求分析 3.1 需求分析 3.1.1 功能需求分析 〔1〕用戶(hù)端的根本聊天信息發(fā)送,這些根本聊天信息包括文本和圖片。文本和圖片聊天是聊天軟件最根底的功能。用戶(hù)通過(guò)輸入IP來(lái)查找用戶(hù),并申請(qǐng)加為好友,在對(duì)方同意加為好友后,在線(xiàn)用戶(hù)列表就會(huì)更新用戶(hù),把參加的用戶(hù)添加到用戶(hù)列表中。
36、這樣,兩個(gè)用戶(hù)之前就可以實(shí)現(xiàn)通信了。在信息傳輸中,預(yù)計(jì)利用TCP/IP協(xié)議中的UDP協(xié)議,這是面向無(wú)連接的協(xié)議,但發(fā)送速度快,用于聊天信息傳輸用適合。 〔2〕用戶(hù)端文件傳輸?shù)墓δ埽脩?hù)之間可以斷點(diǎn)續(xù)傳文件。在傳文件之前,首先創(chuàng)建一信息文件,記錄文件傳送的一些信息,并根據(jù)傳輸?shù)臄?shù)據(jù)量實(shí)時(shí)修改。如果沒(méi)有傳完,下次就可以繼續(xù)打開(kāi)這個(gè)信息文件,接著上次的進(jìn)度傳輸。因?yàn)槲募鬏斎胍髷?shù)據(jù)不能出錯(cuò),因此此模塊采用TCP協(xié)議。 〔3〕用戶(hù)端之間白板和聊天室的功能,這個(gè)功能有些類(lèi)似遠(yuǎn)程會(huì)議內(nèi)容的傳輸,研究目的是為了滿(mǎn)足企業(yè)內(nèi)部隨時(shí)性小會(huì)議室的要求。通過(guò)聊天室滿(mǎn)足交流討論,通過(guò)白板讓發(fā)起者將想要表達(dá)的內(nèi)容,
37、清楚的給目標(biāo)對(duì)象呈現(xiàn)出來(lái)。 〔4〕用戶(hù)之間后臺(tái)的連接,每個(gè)用戶(hù)隔指定一段時(shí)間會(huì)向用戶(hù)列表中的每一用戶(hù)發(fā)送消息,查看用戶(hù)是否在線(xiàn),如果不在線(xiàn),就更新用戶(hù)列表,刪除用戶(hù)。 3.1.2 數(shù)據(jù)需求分析 〔1〕客戶(hù)端之間聊天信息。在控件上顯示時(shí)格式化,更易于用戶(hù)的查看自己發(fā)送或接收到的信息。 〔2〕在線(xiàn)用戶(hù)列表信息。服務(wù)器端存放在適當(dāng)?shù)目臻g中,在發(fā)送給客戶(hù)端時(shí),對(duì)信息列表進(jìn)展格式化,便于客戶(hù)端提取信息。 〔3〕客戶(hù)端向服務(wù)器端發(fā)送確實(shí)認(rèn)在線(xiàn)信息。包括客戶(hù)端剛剛啟動(dòng)時(shí)的初始化信息和在使用過(guò)程中確實(shí)認(rèn)在線(xiàn)信息。 〔4〕其它程序內(nèi)部可能需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)體。 3.1.3 性能需求分析 〔1〕可
38、靠性高,能在由于系統(tǒng)問(wèn)題或其它原因產(chǎn)生錯(cuò)誤后,作出相對(duì)應(yīng)處理,比如網(wǎng)絡(luò)初始化失敗、服務(wù)器不在線(xiàn)等,可以提示用戶(hù)安全退出本程序,在出現(xiàn)不可知的錯(cuò)誤以后,可以盡量安全的退出程序。在程序的設(shè)計(jì)過(guò)程中,要求能盡可能多的設(shè)想到用戶(hù)使用過(guò)程中可能發(fā)生的事件,并能在判斷事件后做出相應(yīng)的處理,使程序具有較高的容錯(cuò)性能。 〔2〕宜操作性,程序簡(jiǎn)單易懂,容易上手使用。設(shè)計(jì)界面是,簡(jiǎn)化界面的復(fù)雜性,模擬 等現(xiàn)有即時(shí)通訊工具的界面,使用戶(hù)能很容易看懂并使用。 〔3〕開(kāi)發(fā)文檔易理解,保證以后自己二次開(kāi)發(fā)或他人接手開(kāi)發(fā)時(shí),能夠清晰的理解整個(gè)系統(tǒng)的設(shè)計(jì)思路和實(shí)現(xiàn)細(xì)節(jié)。 〔4〕模塊化設(shè)計(jì)此軟件的功能,不同的模塊實(shí)現(xiàn)
39、不同的功能,使得軟件易于以后的維護(hù)與擴(kuò)展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。 3.1.4 運(yùn)行需求分析 〔1〕用戶(hù)界面 程序較小,啟動(dòng)速度快,無(wú)啟動(dòng)界面。在本地局域網(wǎng)中使用,所以無(wú)需進(jìn)展用戶(hù)登錄,無(wú)需認(rèn)證界面,啟動(dòng)后的應(yīng)用界面要清爽,設(shè)計(jì)要簡(jiǎn)單明了,要具有較高的易用性。 〔2〕故障處理 在遇到可預(yù)知的故障與情況時(shí),能提示用戶(hù)并自動(dòng)退出;在遇到不可預(yù)知的故障時(shí)能安全退出。 3.2 可行性分析 軟件可行性分析最根本的任務(wù)是對(duì)以后的行動(dòng)方針提出建議。如果問(wèn)題沒(méi)有可行的解釋?zhuān)治鰡T應(yīng)該建議停止這項(xiàng)開(kāi)發(fā)工程,以防止時(shí)間、資源、人力和金錢(qián)的浪費(fèi)。 3.2.1 經(jīng)
40、濟(jì)可行性分析 由于本軟件的主要背景是畢業(yè)課程設(shè)計(jì),不注重直接的經(jīng)濟(jì)效益和其后的開(kāi)展方向,注重的是自身水平和能力的提高。而且對(duì)自身的經(jīng)濟(jì)要求也不高,只要有一臺(tái)到兩臺(tái)可開(kāi)發(fā)程序軟件的電腦便可,所以不用考慮到經(jīng)濟(jì)問(wèn)題。 3.2.2 技術(shù)可行性分析 首先我已經(jīng)搭建好開(kāi)發(fā)所需要的軟硬件平臺(tái),并進(jìn)展了合理而完善的需求分析,做好了充分的前期準(zhǔn)備工作,其次因?yàn)楸境绦虻钠脚_(tái)將基于WINDOWS,將要使用網(wǎng)絡(luò)通信技術(shù),而WINDOWS有完善成熟的網(wǎng)絡(luò)通信接口,以與與VC++6.0開(kāi)發(fā)環(huán)境的嚴(yán)密契合能力,加之相類(lèi)似的更大規(guī)模的INTERNET通信工具產(chǎn)品也已有例在先,所以這個(gè)程序的開(kāi)發(fā)可行性在技術(shù)上是完全可
41、行的。 3.2.3 運(yùn)行可行性分析 本軟件為一個(gè)小型的基于局域網(wǎng)的通信軟件,所消耗的資源是非常小的,現(xiàn)在一般的電腦無(wú)論是硬件還是軟件都能夠滿(mǎn)足條件,因此,本軟件在運(yùn)行上是可行的。 第4章 軟件系統(tǒng)設(shè)計(jì) 本章將從兩個(gè)方面介紹本系統(tǒng)的設(shè)計(jì)。第一,介紹本軟件的概要設(shè)計(jì)。第二,介紹本軟件的詳細(xì)設(shè)計(jì)。詳細(xì)設(shè)計(jì)是先從根本框架的設(shè)計(jì)出發(fā),然后逐步介紹好友管理模塊、聊天模塊、聊天室模塊、傳送文件模塊、白板模塊。所以本章是本論文的重點(diǎn)。 4.1 概要設(shè)計(jì) 根據(jù)以上的軟件需求分析,可對(duì)本軟件進(jìn)展如下的功能模塊劃分,總體功能如圖4-1所示。 總體功能 傳輸 文件 白板
42、 聊天室 發(fā)送根本聊天信息 保持連接 發(fā)送圖片信息 發(fā)送文本信息 圖4-1 總體功能框圖 本軟件的總體功能主要?jiǎng)澐譃槲鍌€(gè)模塊: (1) 根本聊天模塊:兩個(gè)用戶(hù)端的根本聊天信息發(fā)送,這些根本聊天信息包括文本和圖片。本模塊目的是為兩個(gè)用戶(hù)提供根本的聊天環(huán)境。 (2) 聊天室模塊:多個(gè)用戶(hù)端的根本聊天信息的發(fā)送,聊天信息只能是文本信息。本模塊目的是為多個(gè)用戶(hù)提供根本的聊天環(huán)境。 (3) 白板模塊:多個(gè)用戶(hù)端之間的白板信息傳送。這個(gè)白板就是一個(gè)畫(huà)板,多個(gè)用戶(hù)建立連接之后,可通過(guò)此白板模塊達(dá)到信息共享的目的。建立連接的多個(gè)用戶(hù)都在看同一塊白板,在上面
43、畫(huà)的圖、寫(xiě)的內(nèi)容,都可以馬上會(huì)呈現(xiàn)給其他用戶(hù)。 (4) 傳輸文件模塊:用戶(hù)端文件傳輸?shù)墓δ?,使用?hù)之間可以進(jìn)展文件傳輸。本文件傳輸功能用可以支持?jǐn)帱c(diǎn)續(xù)傳文件。 〔5〕用戶(hù)之間后臺(tái)的連接,每個(gè)用戶(hù)隔指定一段時(shí)間會(huì)向用戶(hù)列表中的每一用戶(hù)發(fā)送消息,查看用戶(hù)是否在線(xiàn),如果不在線(xiàn),就更新用戶(hù)列表,刪除用戶(hù)。 4.2 根本框架設(shè)計(jì) 本節(jié)內(nèi)容將介紹本軟件的根本框架設(shè)計(jì),包括宏和數(shù)據(jù)結(jié)構(gòu)的定義、程序的配置文件、調(diào)試模塊、主頁(yè)面初始化相關(guān)內(nèi)容、主頁(yè)面的布局以與其自會(huì)按鈕和自繪好友列表等根本框架相關(guān)內(nèi)容。 4.2.1 宏和數(shù)據(jù)結(jié)構(gòu)的定義 程序中用到了很多宏和數(shù)據(jù)結(jié)構(gòu),這些宏和數(shù)據(jù)結(jié)構(gòu)在多個(gè)模塊中都有用
44、到,因此程序中專(zhuān)門(mén)新建一個(gè)頭文件Global.h,此頭文件里是程序中很多的宏和數(shù)據(jù)結(jié)構(gòu)的定義。在StdAfx.h文件包含Global.h,在程序其他地方都可以使用Global.h中的宏和定義的數(shù)據(jù)結(jié)構(gòu)。這樣處理還有一個(gè)好處,如果需要修改某些宏的值,可以直接在Global.h中修改,而不用到處去找宏的定義,方便和快捷。 4.2.2 程序配置文件 程序中很多信息需要保存,比如用戶(hù)名和熱鍵,因些程序用到了配置文件,默認(rèn)的配置文件名為conf.ini。程序用讀取和寫(xiě)入配置文件系列函數(shù)來(lái)管理此配置文件。 4.2.3 調(diào)試模塊 為了方便調(diào)試,在程序中添加了一個(gè)用于調(diào)試的類(lèi)CDebug,它具有的成員
45、變量和成員函數(shù)如下: class CDebug { private: CStringm_strMessage;/// 信息 public: CDebug(); CDebug( CString strMessage ); virtual ~CDebug(); }; 期中構(gòu)造和析構(gòu)函數(shù)如下: CDebug::CDebug( CString strMessage ) { m_strMessage = strMessage; CString strTrace; strTrace = "run in : " + m_strMessage + "\n"; TRACE(
46、 strTrace ); } CDebug::~CDebug() { CString strTrace; strTrace = "run out : " + m_strMessage + "\n"; TRACE( strTrace ); } 利用類(lèi)的構(gòu)造、析構(gòu)函數(shù)和類(lèi)的生命周期,我們可以很方便的設(shè)計(jì)如上的CDebug類(lèi),用法如下: { CDebug debug( “test〞 ); } 在函數(shù)或語(yǔ)句組的開(kāi)始處定義一個(gè)CDebug變量,當(dāng)程序運(yùn)行到變量定義處的時(shí)候,會(huì)打印出run in : test,當(dāng)程序執(zhí)行完函數(shù)或語(yǔ)句組時(shí),會(huì)打印出run out : test,這樣
47、我們就可以知道程序運(yùn)行到何處,極大的方便了我們對(duì)程序的調(diào)試。 4.2.4 主界面初始化 用過(guò) 的人都知道, 主面板總是處于其他程序的上面,而且 在任務(wù)欄沒(méi)有圖標(biāo),而是把圖標(biāo)放到了托盤(pán)區(qū),另外,我們還可以按Ctrl+Alt+Z默認(rèn)的快捷鍵隱藏和顯示 主面板。不但 是這樣處理的,很多聊天軟件都采用此種處理方式。本設(shè)計(jì)也不例外,同樣也要達(dá)到這樣的目的。 下面從各個(gè)方面來(lái)說(shuō)明本設(shè)計(jì)的處理方式: 〔1〕不在任務(wù)欄顯示圖標(biāo) CDialog dlgParent; dlgParent.Create( IDD_DIALOG_BG ); dlgParent.ShowWindo
48、w( SW_HIDE ); CInstantMessagingDlg dlg( &dlgParent ); m_pMainWnd = &dlg; ModifyStyleEx( WS_EX_APPWINDOW, 0 ); 上面代碼就達(dá)到了使程序主界面不在任務(wù)欄中顯示的目的。首先,我們創(chuàng)建一個(gè)對(duì)話(huà)框,并隱藏此對(duì)放框,然后把這個(gè)對(duì)話(huà)框作為主界面對(duì)話(huà)框的父窗口,然后在主界面對(duì)話(huà)框的初始化函數(shù)中修改其風(fēng)格,去掉WS_EX_APPWINDOW風(fēng)格。這樣,主界面就不會(huì)出現(xiàn)在任務(wù)欄里面了。 〔2〕將主界面放在最上層 將程序放到頂層,很多程序都有這功能,比如金山詞霸等,實(shí)現(xiàn)起來(lái)其實(shí)很簡(jiǎn)單,只用一條語(yǔ)
49、句就可以達(dá)到目的: SetWindowPos( &wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); 第一個(gè)參數(shù)就是將程序放到所有非頂層窗口的頂層,如果有多個(gè)程序都是頂層窗口,那么他們誰(shuí)在上面,就要看當(dāng)前誰(shuí)是激活的窗口。最后一個(gè)參數(shù),是用位或|組后起來(lái)的,從字面意思上我們就能理解到這是不移動(dòng)不改變大小的意思,忽略了當(dāng)中的4個(gè)參數(shù)。 〔3〕熱鍵的處理 設(shè)計(jì)中默認(rèn)的熱鍵是Ctrl+Alt+Z,當(dāng)然程序允許用戶(hù)自己定義熱鍵,自定義的熱鍵將保存在conf.ini文件中。熱鍵的功能可以隱藏、顯示主界面,有消息到達(dá)時(shí),按熱鍵也可以打開(kāi)聊天對(duì)話(huà)框。
50、 ::RegisterHotKey( m_hWnd, IDHOTKEY, m_wModifiers, m_wVirtualKeyCode ); 使用全局函數(shù)RegisterHotKey可以注冊(cè)熱鍵,如果注冊(cè)的熱鍵沒(méi)有被其他程序占用,那么注冊(cè)成功。注冊(cè)成功后,如果按熱鍵,那么程序就會(huì)承受到WM_HOTKEY消息,因此我們還需要自己處理WM_HOTKEY消息: void OnHotkey( WPARAM wParam, LPARAM lParam ); BEGIN_MESSAGE_MAP(CInstantMessagingDlg, CDialog) … ON_MESSAGE( WM_HO
51、TKEY, OnHotkey ) … //}}AFX_MSG_MAP END_MESSAGE_MAP() 在消息映射中,我們用OnHotkey()函數(shù)來(lái)處理WM_HOTKEY消息。 void CInstantMessagingDlg::OnHotkey( WPARAM wParam, LPARAM lParam ) { if( this->IsWindowVisible() ) { ShowWindow( SW_HIDE ); } else { ShowWindow( SW_SHOW ); ::SetForegroundWindow( m_hWnd ); } }
52、 在OnHotkey()函數(shù)中判斷主界面是否是可見(jiàn)的,如果是可見(jiàn)的那么隱藏起來(lái),否如此顯示,并且把主界面設(shè)為前景窗口。 〔4〕最小化和關(guān)閉按鈕的處理 我們希望單擊程序右上角的最小化按鈕時(shí),程序隱藏起來(lái),而單擊關(guān)閉按鈕時(shí),程序會(huì)提示是否退出,而不會(huì)悄無(wú)聲息的退出。 void CInstantMessagingDlg::OnSysmand(UINT nID, LPARAM lParam) { … if( nID == SC_MINIMIZE ) { this->ShowWindow( SW_HIDE); } else { CDialog::OnSysmand(nID, l
53、Param); } } void CInstantMessagingDlg::OnCancel() { if( IDOK == MessageBox( "要退出嗎?", "退出", MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2 ) ) { … DestroyWindow(); } } 在程序中處理OnSysmand()函數(shù)和OnCancel ()函數(shù)就實(shí)現(xiàn)了我們要的功能。 〔5〕托盤(pán)圖標(biāo)的顯示 至此,程序已不在任務(wù)欄顯示圖標(biāo),已是最頂層窗口,而且也已有熱鍵功能,但是還沒(méi)有實(shí)現(xiàn)托盤(pán)圖標(biāo)的顯示。實(shí)現(xiàn)托盤(pán)圖標(biāo)的代碼如下:
54、 NOTIFYICONDATAm_nid; HICON hIcon= AfxGetApp()->LoadIcon(STATE_ONLINE ); m_nid.hIcon= hIcon; m_nid.hWnd= m_hWnd; m_nid.cbSize= sizeof( NOTIFYICONDATA ); m_nid.uCallbackMessage= WM_SHELLNOTIFY; m_nid.uFlags= NIF_ICON | NIF_MESSAGE | NIF_TIP; m_nid.uID= IDR_MENU1; sprintf( m_nid.szTip, "即時(shí)聊天軟
55、件" ); Shell_NotifyIcon( NIM_ADD, &m_nid ); 這樣我們就在托盤(pán)區(qū)顯示了STATE_ONLINE的圖標(biāo),把鼠標(biāo)移動(dòng)到圖標(biāo)上一會(huì),還會(huì)出現(xiàn)“即時(shí)聊天軟件〞的提示框。如果你們對(duì)圖標(biāo)有單擊和雙擊等操作,程序會(huì)收到WM_SHELLNOTIFY消息,因此,我們還必須處理WM_SHELLNOTIFY消息。 void OnShellNotifyProc( WPARAM wParam, LPARAM lParam ); BEGIN_MESSAGE_MAP(CInstantMessagingDlg, CDialog) //{{AFX_MSG_MAP(CInstan
56、tMessagingDlg) … ON_MESSAGE( WM_SHELLNOTIFY, OnShellNotifyProc ) … //}}AFX_MSG_MAP END_MESSAGE_MAP() void CInstantMessagingDlg::OnShellNotifyProc( WPARAM wParam, LPARAM lParam ) { if( lParam == WM_LBUTTONDBLCLK ) { … } else if( lParam == WM_RBUTTONUP ) { … } } 與熱鍵處理一樣,OnShellNotifyP
57、roc()函數(shù)響應(yīng)我們對(duì)圖標(biāo)的操作,其中l(wèi)Param參數(shù)表示消息號(hào),在本設(shè)計(jì)中只處理左鍵雙擊〔顯示主界面〕和右鍵單擊〔彈出菜單〕。 在托盤(pán)添加圖標(biāo),退出程序前,如果沒(méi)有從托盤(pán)刪除圖標(biāo),那么托盤(pán)區(qū)的圖標(biāo)會(huì)一直保存下來(lái),直到鼠標(biāo)移過(guò)托盤(pán)區(qū)引起托盤(pán)區(qū)的重繪,這當(dāng)然不是我們所希望的結(jié)果。 void CInstantMessagingDlg::OnDestroy() { /// 刪除在托盤(pán)建立的圖標(biāo) ::Shell_NotifyIcon( NIM_DELETE, &m_nid ); CDialog::OnDestroy(); } 以上代碼在程序退出時(shí)調(diào)用,從托盤(pán)從刪除圖標(biāo)。 〔6〕只
58、允許運(yùn)行唯一實(shí)例 這點(diǎn)與 不同,在一臺(tái)機(jī)子上可以運(yùn)行多個(gè) ,但本程序只允許運(yùn)行一個(gè)實(shí)例。只允許運(yùn)行一個(gè)實(shí)例,有多種方法,本設(shè)計(jì)采用的是創(chuàng)建命名事件的方法: HANDLE hEvent = ::CreateEvent( NULL, FALSE, FALSE, "InstantMessaging" ); if( hEvent ) { if( ERROR_ALREADY_EXISTS == GetLastError() ) { return FALSE; } } 事件與普通變量不一樣,普通變量只在運(yùn)行的當(dāng)前程序中有效,而事件在整個(gè)系統(tǒng)中都有效。當(dāng)首次運(yùn)行程序時(shí),會(huì)創(chuàng)建一個(gè)
59、名為“InstantMessaging〞的事件,這個(gè)事件在系統(tǒng)X圍內(nèi)有效,當(dāng)再次運(yùn)行程序時(shí),程序會(huì)嘗試著創(chuàng)建同名的事件,因?yàn)橹耙呀?jīng)創(chuàng)建了這個(gè)事件,因此系統(tǒng)會(huì)返回之前創(chuàng)建事件的句柄,但GetLastError()會(huì)返回ERROR_ALREADY_EXISTS,明確需創(chuàng)建的事件之前已經(jīng)創(chuàng)建,為了保證只允許一個(gè)實(shí)例,這個(gè)實(shí)例就不再允許運(yùn)行,直接返回,退出程序。 4.2.5 主界面布局 程序主界面如圖4-1所示。 圖4-1 主界面 左上角顯示的是自己的頭像、狀態(tài)和昵稱(chēng);右上角的列表框是查找IP輸入框,下面是添加按鈕;在下面一點(diǎn)的列表框是自己的址列表框,顯示了自己的所有IP;主界面中央是用
60、戶(hù)列表框;最下面是4個(gè)功能按鈕。 用戶(hù)列表框是一列一列的顯示添加的好友,最左邊是好友的頭像;中部上邊是好友的昵稱(chēng),下面是好友的IP;右下角是刪除好友按鈕和攝像頭按鈕,當(dāng)然好友必須有攝像頭才會(huì)顯示攝像頭按鈕。 有兩種方式添加聯(lián)系人: 〔1〕在右上解的查找IP輸入框里輸入IP,然后單擊下面的添加按鈕。也可以從IP輸入框里選擇以前加過(guò)的好友IP。程序允許保存10個(gè)最近聯(lián)系人的IP,當(dāng)新添加聯(lián)系人時(shí),如果已保存了10個(gè)聯(lián)系人的IP,程序會(huì)按照時(shí)間的先后順序覆蓋之前的IP。在列表框展開(kāi)下拉列表后,可以按DELETE鍵刪除選定的IP。 〔2〕選定一個(gè)自己的IP,然后單擊“網(wǎng)段〞按鈕。此功能可以向選
61、定IP的IP段發(fā)送添加請(qǐng)求的消息,這相當(dāng)于批量添加好友的功能。 在主界面任何地點(diǎn)單擊左鍵不放開(kāi),可以拖動(dòng)程序;單擊右鍵,會(huì)彈出菜單,用戶(hù)選中相應(yīng)的菜單項(xiàng),可以執(zhí)行相應(yīng)的功能;在任何地點(diǎn)雙擊左鍵,可以打開(kāi)“個(gè)人設(shè)置〞對(duì)話(huà)框,如圖4-2所示。 圖4-2 設(shè)置對(duì)話(huà)框 最后一項(xiàng)“允許別人直接將我加為聯(lián)系〞的意思是別人添加我為好友時(shí),不會(huì)彈出請(qǐng)求對(duì)話(huà)框而直接加為好友。 單擊保存后,此對(duì)話(huà)框里的內(nèi)容會(huì)保存到config.ini配置文件中。運(yùn)行程序后,會(huì)從config.ini讀取用戶(hù)信息,并在主界面中作相應(yīng)的設(shè)置。 在主界面,添加、聊天室、傳送文件和白板按鈕都是自繪按鈕,可以顯示圖片,有提示能
62、力,當(dāng)鼠標(biāo)移動(dòng)到其上一會(huì)兒后,會(huì)彈出提示框,而且這些按鈕都具有XP風(fēng)格,既鼠標(biāo)滑過(guò)時(shí)會(huì)顯示不同的狀態(tài)。用戶(hù)列表框也是自繪的,普通的列表控件無(wú)法顯示我們所需的信息。自繪按鈕和自繪列表框會(huì)作為一個(gè)單獨(dú)的模塊來(lái)介紹,這兒就不作過(guò)多的介紹。 4.2.6 自繪按鈕 VC++6.0自帶的按鈕控件不具有XP風(fēng)格,而且也不能顯示圖像,作為一款好的軟件,應(yīng)該有個(gè)好的界面。在程序的主界面上,主要的按鈕都采用了自繪按鈕,而不使用自帶的按鈕控件。 AdvButton.h和AdvButton.cpp是自繪按鈕類(lèi)的頭文件和實(shí)現(xiàn)文件。 在自繪按鈕類(lèi)中定義了如下成員變量: intm_nState;/// 按鈕的狀態(tài)
63、 CBitmapm_bmpNormal;/// 正常圖標(biāo) CBitmapm_bmpHover;/// 焦點(diǎn)圖標(biāo) CBitmapm_bmpDown;/// 按如下圖標(biāo) CBitmapm_bmpDisable;/// 無(wú)效圖標(biāo) CToolTipCtrlm_pToolTipCtrl;/// 提示類(lèi) m_nState表示當(dāng)前按鈕的狀態(tài),可以為宏:NORMAL,HOVER,DOWN,DISABLE,分別表示按鈕正常狀態(tài)、處于焦點(diǎn)狀態(tài)、按下?tīng)顟B(tài)、無(wú)效狀態(tài),這4個(gè)宏的定義在實(shí)現(xiàn)文件。4個(gè)CBitmap的變量分別存儲(chǔ)4種狀態(tài)下的圖像。m_pToolTipCtrl是提示工具控件類(lèi),既是鼠標(biāo)在其上時(shí),
64、會(huì)彈出提示窗口。 要實(shí)現(xiàn)按鈕自繪,必須更新按鈕的風(fēng)格為自繪,可以在按鈕的屬性中更改,也可以使用代碼更改。重載PreSubclassWindow(),在這個(gè)函數(shù)中更改按鈕風(fēng)格并初始化m_pToolTipCtrl。 void CAdvButton::PreSubclassWindow() { ModifyStyle( 0, BS_OWNERDRAW ); CButton::PreSubclassWindow(); m_pToolTipCtrl.Create( this, TTS_ALWAYSTIP ); m_pToolTipCtrl.SetDelayTime( 100 ); CS
65、tring strText; GetWindowText( strText ); m_pToolTipCtrl.AddTool( this, strText ); } VC++6.0中的ClassWizard不能為我們添加鼠標(biāo)離開(kāi)的消息,只能為我們添加鼠標(biāo)移動(dòng)、單擊等消息,我們得自己為自繪按鈕添加上鼠標(biāo)離開(kāi)的消息。 TRACKMOUSEEVENT tme; tme.cbSize = sizeof( TRACKMOUSEEVENT ); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE; ::_TrackMouseEvent( &
66、tme ); 以上代碼告訴系統(tǒng),當(dāng)鼠標(biāo)離開(kāi)m_hWnd窗口時(shí),向這個(gè)窗口發(fā)送一條WM_MOUSELEAVE消息。下面的處理方式與熱鍵和托盤(pán)通知消息的處理方式一樣,自定義這個(gè)消息處理函數(shù)就行了。 自繪按鈕必須重載DrawItem()函數(shù),在DrawItem()函數(shù)中根據(jù)m_nState的值可以貼上不同的圖,表示按鈕的一不同狀態(tài)。 void CAdvButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if( lpDrawItemStruct->itemState & ODS_DISABLED ) { m_nState = DISABLE; } switch( m_nState ) { case NORMAL: DrawNORMAL(); break; case HOVER: DrawHOVER(); break; case DOWN: DrawDOWN(); break; case DISABLE: DrawDISABLE(); break; default: break; } }
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧汽貿(mào)的戰(zhàn)略規(guī)劃課件
- 農(nóng)藥產(chǎn)品化學(xué)登記評(píng)審中存在的問(wèn)題修改
- 職業(yè)適應(yīng)與發(fā)展
- 中國(guó)傳統(tǒng)思想和領(lǐng)導(dǎo)藝術(shù)
- 學(xué)習(xí)英語(yǔ)最好的方法課件
- 團(tuán)隊(duì)建設(shè)與管理教材(PPT 42頁(yè))
- 商務(wù)談判的準(zhǔn)備培訓(xùn)課件
- 單元吃奶和豆及其制品
- 氣管切開(kāi)護(hù)理
- 七上281有理數(shù)的乘法1
- 素質(zhì)拓展學(xué)分重要性
- 地產(chǎn)項(xiàng)目策劃廣告創(chuàng)意
- 華通檸檬渠道推廣活動(dòng)案
- 酸堿平衡紊亂的判讀
- 氣管插管的困難評(píng)估課件