freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于vc的企業(yè)內(nèi)部通信軟件的設(shè)計(jì)與實(shí)現(xiàn)計(jì)算機(jī)優(yōu)秀畢業(yè)論文(文件)

2024-07-18 18:49 上一頁面

下一頁面
 

【正文】 信技術(shù),而WINDOWS有完善成熟的網(wǎng)絡(luò)通信接口,以及與VC++,加之相類似的更大規(guī)模的INTERNET通信工具產(chǎn)品也已有例在先,所以這個(gè)程序的開發(fā)可行性在技術(shù)上是完全可行的。第二,介紹本軟件的詳細(xì)設(shè)計(jì)。總體功能傳輸文件白板聊天室發(fā)送基本聊天信息保持連接發(fā)送圖片信息發(fā)送文本信息圖41 總體功能框圖本軟件的總體功能主要?jiǎng)澐譃槲鍌€(gè)模塊:(1) 基本聊天模塊:兩個(gè)用戶端的基本聊天信息發(fā)送,這些基本聊天信息包括文本和圖片。(3) 白板模塊:多個(gè)用戶端之間的白板信息傳送。本文件傳輸功能用可以支持?jǐn)帱c(diǎn)續(xù)傳文件。這樣處理還有一個(gè)好處,如果需要修改某些宏的值,而不用到處去找宏的定義,方便和快捷。 /// 信息public: CDebug()。期中構(gòu)造和析構(gòu)函數(shù)如下:CDebug::CDebug( CString strMessage ){ m_strMessage = strMessage。}CDebug::~CDebug(){ CString strTrace。}在函數(shù)或語句組的開始處定義一個(gè)CDebug變量,當(dāng)程序運(yùn)行到變量定義處的時(shí)候,會(huì)打印出run in : test,當(dāng)程序執(zhí)行完函數(shù)或語句組時(shí),會(huì)打印出run out : test,這樣我們就可以知道程序運(yùn)行到何處,極大的方便了我們對(duì)程序的調(diào)試。下面從各個(gè)方面來說明本設(shè)計(jì)的處理方式:(1)不在任務(wù)欄顯示圖標(biāo)CDialog dlgParent。dlgParent )。上面代碼就達(dá)到了使程序主界面不在任務(wù)欄中顯示的目的。wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE )。熱鍵的功能可以隱藏、顯示主界面,有消息到達(dá)時(shí),按熱鍵也可以打開聊天對(duì)話框。BEGIN_MESSAGE_MAP(CInstantMessagingDlg, CDialog) … ON_MESSAGE( WM_HOTKEY, OnHotkey ) … //}}AFX_MSG_MAPEND_MESSAGE_MAP()在消息映射中,我們用OnHotkey()函數(shù)來處理WM_HOTKEY消息。 }}在OnHotkey()函數(shù)中判斷主界面是否是可見的,如果是可見的那么隱藏起來,否則顯示,并且把主界面設(shè)為前景窗口。 }}void CInstantMessagingDlg::OnCancel() { if( IDOK == MessageBox( 要退出嗎?, 退出, MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2 ) ) { … DestroyWindow()。HICON hIcon = AfxGetApp()LoadIcon( STATE_ONLINE )。 = WM_SHELLNOTIFY。Shell_NotifyIcon( NIM_ADD, amp。void OnShellNotifyProc( WPARAM wParam, LPARAM lParam )。m_nid )。只允許運(yùn)行一個(gè)實(shí)例,有多種方法,本設(shè)計(jì)采用的是創(chuàng)建命名事件的方法:HANDLE hEvent = ::CreateEvent( NULL, FALSE, FALSE, InstantMessaging )?!≈鹘缑娌季殖绦蛑鹘缑嫒鐖D41所示。也可以從IP輸入框里選擇以前加過的好友IP。此功能可以向選定IP的IP段發(fā)送添加請(qǐng)求的消息,這相當(dāng)于批量添加好友的功能。運(yùn)行程序后,并在主界面中作相應(yīng)的設(shè)置。 自繪按鈕VC++,而且也不能顯示圖像,作為一款好的軟件,應(yīng)該有個(gè)好的界面。 /// 按鈕的狀態(tài)CBitmap m_bmpNormal。 /// 無效圖標(biāo)CToolTipCtrl m_pToolTipCtrl。要實(shí)現(xiàn)按鈕自繪,必須更新按鈕的風(fēng)格為自繪,可以在按鈕的屬性中更改,也可以使用代碼更改。 ( this, TTS_ALWAYSTIP )。 ( this, strText )。 = m_hWnd。以上代碼告訴系統(tǒng),當(dāng)鼠標(biāo)離開m_hWnd窗口時(shí),向這個(gè)窗口發(fā)送一條WM_MOUSELEAVE消息。 ODS_DISABLED ) { m_nState = DISABLE。 break。 break。要使按鈕無效,必須調(diào)用EnableWindow( FALSE )函數(shù)來更改按鈕的狀態(tài),我們也就無法更改m_nState的值。要使用此函數(shù),必須導(dǎo)入 ,在程序使用如下語句導(dǎo)入:pragma ment( lib, C:\\Program Files\\Microsoft Visual Studio\\VC98\\Lib\\  ) 自繪好友列表框普通的列表控件無法滿足程序的要求,程序要求好友列表框可以顯示好友的頭像、好友昵稱、好友IP和刪除、攝像頭按鈕。 /// 頭像圖像列表int m_nCamera。 … CListCtrl::PreSubclassWindow()。在向好友列表框中添加好友時(shí),主對(duì)話框調(diào)用好友列表框的AddUser()函數(shù),參數(shù)為USER結(jié)構(gòu)體,這個(gè)參數(shù)作為列表項(xiàng)的額外數(shù)據(jù),這樣重繪的時(shí)候再讀取出這個(gè)額外數(shù)據(jù)就可以得到這一項(xiàng)的用戶信息。在DrawItem()函數(shù)中,先得到額外的附加數(shù)據(jù),既是添加項(xiàng)時(shí)作為參數(shù)傳遞的USER類型的變量,然后再根據(jù)m_nCurSel、m_nDelIcon和m_nCamera的值自繪。 添加好友,這一節(jié)介紹的是具體的實(shí)現(xiàn)。在添加按鈕的響應(yīng)函數(shù)中先判斷IP地址是否合法,是否是自己的IP,是否已經(jīng)添加此好友。 = m_bCamera。/// 分配空間UINT uDataLength = sizeof( DATAPACKET ) + sizeof( USER )。memcpy( pSendData + sizeof( DATAPACKET ), amp。在AddRequest()函數(shù)中,先進(jìn)行相應(yīng)的判斷,如果具備加為好友的條件,根據(jù)是否允許直接加為好友的值是否彈出提示對(duì)話框。添加好友對(duì)方是否允許將好友添加到數(shù)組和列表框中彈出提示框TF圖43 添加好友流程圖好友收到請(qǐng)求的流程圖,如圖44所示?!∨c好友保持連接此功能用到了定時(shí)器,間隔一定時(shí)間向所有好友發(fā)起請(qǐng)求保持連接的消息,并把發(fā)送過此消息的好友添加到一個(gè)臨時(shí)好友列表中。在程序初始化時(shí)設(shè)置一定時(shí)器:SetTimer( TIMER_CONNECT, DEFAULT_REFRESH_TIME, NULL )。 if( ( ) ) { ( nIndex )。 /// 分別發(fā)送保持連接的消息,將發(fā)送過的IP加入到m_strlstKeepConnent for( nIndex = 0。 = REQUEST_KEEPCONNECT。dataPacket, sizeof( DATAPACKET ) )。 }} 聊天模塊聊天模塊提供的是兩個(gè)已連接好友之間的聊天服務(wù),其聊天內(nèi)容既可以是文字聊天也可以是圖片聊天。if( RegOpenKeyEx( HKEY_CLASSES_ROOT, \\CLSID, 0, KEY_READ, amp。 lpDllEntryPoint = GetProcAddress( hLib, DllRegisterServer )。聊天對(duì)話框中定的發(fā)送和接收富文本框變量為:CRichText m_rtReceived。 … CString strSend = ()。接收到的消息主要代碼如下:void CChatDlg::ReceiveMessage( LPCSTR szTime, LPCSTR szMessage ){ CString strText。 ( szMessage )。聊天消息包括文字格式和圖像信息,因此發(fā)送的數(shù)據(jù)可能很大,會(huì)超過Socket發(fā)送的最大數(shù)據(jù)長度,這樣如果直接發(fā)送,會(huì)因?yàn)閿?shù)據(jù)長度過大,而導(dǎo)致發(fā)送失敗。if (!AfxSocketInit( amp。主對(duì)話框定義了一變量,在用UDP發(fā)送數(shù)據(jù)的時(shí)候,就可以根據(jù)這個(gè)值的大小來確定分包的大小。消息發(fā)送者收到請(qǐng)求發(fā)送消息的消息后,會(huì)把相應(yīng)的數(shù)據(jù)包發(fā)送給聊天對(duì)方。聊天對(duì)話框還有記錄和打開聊天記錄的功能。聊天室分為服務(wù)器和客戶端,每個(gè)用戶只能創(chuàng)建一個(gè)聊天室,也只能加入一個(gè)聊天室。用戶創(chuàng)建聊天室可以把自己的所有好友都加入到聊天室,這些好友發(fā)的消息可以被所有在聊天室中的好友共享,即使這些好友之間可能并不能互相訪問。在未進(jìn)入聊天室好友列表中選定要添加進(jìn)入聊天室的好友,單擊向上的按鈕,會(huì)向這些選定好的好友發(fā)送加入聊天室的請(qǐng)求。如果好友接受了請(qǐng)求,接受請(qǐng)求的好友就會(huì)從未進(jìn)入聊天室聊表框移到聊天室好友列表框。 nIndex ()。當(dāng)創(chuàng)建聊天室的用戶發(fā)送聊天消息時(shí),服務(wù)器將文本消息發(fā)給所有聊天室好友。 nIndex++ ){ USER user = ( nIndex )。 nIndex1++ ){ USER userSend = ( nIndex1 )。客戶端的處理比服務(wù)器要簡(jiǎn)單一些,客戶端只有在聊天室列表中的好友,客戶端也只向服務(wù)器發(fā)送消息,不用向其他聊天室好友發(fā)送消息。當(dāng)服務(wù)器踢出客戶端,或服務(wù)器關(guān)閉時(shí),彈出對(duì)話框提示用戶,并清空聊天室好友,設(shè)置發(fā)送文本框不可用。以上就是聊天室的設(shè)計(jì)方法。文件傳送模塊用到了多線程,可以實(shí)現(xiàn)多個(gè)文件、多個(gè)用戶之間的傳輸。下面詳細(xì)介紹服務(wù)器端的工作過程:傳送文件用到的是TCP連接,因?yàn)閭魉臀募仨毐WC傳輸?shù)臄?shù)據(jù)不能丟失也不能有誤。如果接收者接收文件,接收者會(huì)先向pSFServerSocket發(fā)起連接,程序重載pSFServerSocket的OnAccept()函數(shù),在此函數(shù)中調(diào)用傳輸文件服務(wù)器對(duì)話框的OnAccept()函數(shù):void CSendFilesServerDlg::OnAccept(){ CSendFilesSocket sfSocket。 pSFSThreadAttachSocket( () )。然后此函數(shù)再創(chuàng)建了一個(gè)線程,并把此線程加入到線程列表中。在傳輸文件對(duì)話框中設(shè)置了一個(gè)定時(shí)器,用于刷新列表框。因?yàn)槌绦蛑С謹(jǐn)帱c(diǎn)續(xù)傳,因此接收者首先會(huì)通知CSendFilesServerThread線程要發(fā)送的文件、大小、已經(jīng)發(fā)送的大小,之后線程會(huì)打開需傳送的文件,并定位到已。如果接受者停止了接收文件或者文件傳輸完成,相應(yīng)的線程也會(huì)調(diào)用RefreshListBox()函數(shù)及時(shí)的刷新列表框。發(fā)送數(shù)據(jù)的功能就由這個(gè)線程來處理了。 ( pSFSThread )。 CSendFilesServerThread *pSFSThread = ( CSendFilesServerThread * )AfxBeginThread( RUNTIME_CLASS( CSendFilesServerThread ), 0, 0, CREATE_SUSPENDED, NULL )。當(dāng)用戶選擇好傳送的文件和傳送的好友后,傳送信息會(huì)加入到列表框,并調(diào)用主對(duì)話框的SendFilesNotify()函數(shù)向這些好友發(fā)送傳送文件的消息,此消息中還包括文件名和文件長度。傳送文件服務(wù)器界面如圖48所示?!魉臀募K傳送文件模塊的設(shè)計(jì)目的是為了方便用戶之間的文件傳送??蛻舳税l(fā)送消息時(shí),先將發(fā)送的消息加入到接收消息文本框,然后將消息發(fā)往服務(wù)器,由服務(wù)器將消息發(fā)到各個(gè)聊天室好友。圖47 聊天室客戶界面首先,主對(duì)話框接受到CHATROOM_ADDREQUEST消息,彈出對(duì)話框詢問用戶是否進(jìn)入好友創(chuàng)建的聊天室,如果用戶拒絕加入則不用處理此消息,如果用戶同意加入聊天室,那么就彈出聊天室客戶端。 } SendTextToIP( , CHATROOM_CLIENT_PORT, strSend, )。}聊天室服務(wù)器接收到消息時(shí),會(huì)將接收到的消息加入到聊天室接收文本框,并將消息發(fā)給所有在聊天室中的好友,除了向服務(wù)器發(fā)送消息的好友外:for( int nIndex1 = 1。因此,發(fā)送的消息長度不會(huì)超過UDP可以發(fā)送的數(shù)據(jù)最大值,發(fā)送消息時(shí)直接一次發(fā)送就行:for( int nIndex = 1。 SendUserCommandToIP( CHATROOM_SERVER_CLOSED, , CHATROOM_CLIENT_PORT, NULL )。這兒是發(fā)往CHATROOM_CLIENT_PORT端口的消息,因?yàn)閷⒁獎(jiǎng)h除的好友已經(jīng)打開了聊天室,而且創(chuàng)建了聊天室客戶端的SOCKET,可以接收發(fā)往這個(gè)端口的消息。userSelf )。聊天室服務(wù)器和客戶端各使用一個(gè)SOCKET,創(chuàng)建的是UDP套接字,有自己的端口號(hào)。聊天室服務(wù)器如圖46所示。打開“聊天記錄”按鈕,可以選擇保存的聊天記錄,在接收文本框內(nèi)會(huì)顯示打開選擇的聊天記錄。如果沒有接收完畢,繼續(xù)請(qǐng)求發(fā)送下一個(gè)消息數(shù)據(jù)包。對(duì)方接收到這個(gè)通知消息時(shí),會(huì)根據(jù)接收到的消息長度分配一個(gè)接收消息的臨時(shí)空間,并把接收到的消息時(shí)間也保存。 return FALSE。上面提到了發(fā)送的最大數(shù)據(jù)長度,m_pLisSocket是創(chuàng)建的UDP套接字,不像TCP一樣可以發(fā)送隨意大小的數(shù)據(jù),UDP套接字只能發(fā)送小于一定大小的數(shù)據(jù)。主對(duì)話框接收到聊天消息后,根據(jù)消息發(fā)送的來源IP來處理消息。 /// 設(shè)置接收框 ( ().GetLength() )。}單擊“發(fā)送”按鈕或CTRL+ENTER鍵,程序會(huì)調(diào)用OnSend()函數(shù),首先得到發(fā)送的時(shí)間和發(fā)送的內(nèi)容,得到的是RTF格式的內(nèi)容,因此st
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1