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è)論文(參考版)

2025-06-30 18:49本頁面
  

【正文】 因?yàn)槌绦蛑С謹(jǐn)帱c(diǎn)續(xù)傳,因此接收者首先會(huì)通知CSendFilesServerThread線程要發(fā)送的文件、大小、已經(jīng)發(fā)送的大小,之后線程會(huì)打開需傳送的文件,并定位到已。如果接受者停止了接收文件或者文件傳輸完成,相應(yīng)的線程也會(huì)調(diào)用RefreshListBox()函數(shù)及時(shí)的刷新列表框。在傳輸文件對(duì)話框中設(shè)置了一個(gè)定時(shí)器,用于刷新列表框。發(fā)送數(shù)據(jù)的功能就由這個(gè)線程來處理了。然后此函數(shù)再創(chuàng)建了一個(gè)線程,并把此線程加入到線程列表中。 ( pSFSThread )。 pSFSThreadAttachSocket( () )。 CSendFilesServerThread *pSFSThread = ( CSendFilesServerThread * )AfxBeginThread( RUNTIME_CLASS( CSendFilesServerThread ), 0, 0, CREATE_SUSPENDED, NULL )。如果接收者接收文件,接收者會(huì)先向pSFServerSocket發(fā)起連接,程序重載pSFServerSocket的OnAccept()函數(shù),在此函數(shù)中調(diào)用傳輸文件服務(wù)器對(duì)話框的OnAccept()函數(shù):void CSendFilesServerDlg::OnAccept(){ CSendFilesSocket sfSocket。當(dāng)用戶選擇好傳送的文件和傳送的好友后,傳送信息會(huì)加入到列表框,并調(diào)用主對(duì)話框的SendFilesNotify()函數(shù)向這些好友發(fā)送傳送文件的消息,此消息中還包括文件名和文件長(zhǎng)度。下面詳細(xì)介紹服務(wù)器端的工作過程:傳送文件用到的是TCP連接,因?yàn)閭魉臀募仨毐WC傳輸?shù)臄?shù)據(jù)不能丟失也不能有誤。傳送文件服務(wù)器界面如圖48所示。文件傳送模塊用到了多線程,可以實(shí)現(xiàn)多個(gè)文件、多個(gè)用戶之間的傳輸?!魉臀募K傳送文件模塊的設(shè)計(jì)目的是為了方便用戶之間的文件傳送。以上就是聊天室的設(shè)計(jì)方法??蛻舳税l(fā)送消息時(shí),先將發(fā)送的消息加入到接收消息文本框,然后將消息發(fā)往服務(wù)器,由服務(wù)器將消息發(fā)到各個(gè)聊天室好友。當(dāng)服務(wù)器踢出客戶端,或服務(wù)器關(guān)閉時(shí),彈出對(duì)話框提示用戶,并清空聊天室好友,設(shè)置發(fā)送文本框不可用。圖47 聊天室客戶界面首先,主對(duì)話框接受到CHATROOM_ADDREQUEST消息,彈出對(duì)話框詢問用戶是否進(jìn)入好友創(chuàng)建的聊天室,如果用戶拒絕加入則不用處理此消息,如果用戶同意加入聊天室,那么就彈出聊天室客戶端??蛻舳说奶幚肀确?wù)器要簡(jiǎn)單一些,客戶端只有在聊天室列表中的好友,客戶端也只向服務(wù)器發(fā)送消息,不用向其他聊天室好友發(fā)送消息。 } SendTextToIP( , CHATROOM_CLIENT_PORT, strSend, )。 nIndex1++ ){ USER userSend = ( nIndex1 )。}聊天室服務(wù)器接收到消息時(shí),會(huì)將接收到的消息加入到聊天室接收文本框,并將消息發(fā)給所有在聊天室中的好友,除了向服務(wù)器發(fā)送消息的好友外:for( int nIndex1 = 1。 nIndex++ ){ USER user = ( nIndex )。因此,發(fā)送的消息長(zhǎng)度不會(huì)超過UDP可以發(fā)送的數(shù)據(jù)最大值,發(fā)送消息時(shí)直接一次發(fā)送就行:for( int nIndex = 1。當(dāng)創(chuàng)建聊天室的用戶發(fā)送聊天消息時(shí),服務(wù)器將文本消息發(fā)給所有聊天室好友。 SendUserCommandToIP( CHATROOM_SERVER_CLOSED, , CHATROOM_CLIENT_PORT, NULL )。 nIndex ()。這兒是發(fā)往CHATROOM_CLIENT_PORT端口的消息,因?yàn)閷⒁獎(jiǎng)h除的好友已經(jīng)打開了聊天室,而且創(chuàng)建了聊天室客戶端的SOCKET,可以接收發(fā)往這個(gè)端口的消息。如果好友接受了請(qǐng)求,接受請(qǐng)求的好友就會(huì)從未進(jìn)入聊天室聊表框移到聊天室好友列表框。userSelf )。在未進(jìn)入聊天室好友列表中選定要添加進(jìn)入聊天室的好友,單擊向上的按鈕,會(huì)向這些選定好的好友發(fā)送加入聊天室的請(qǐng)求。聊天室服務(wù)器和客戶端各使用一個(gè)SOCKET,創(chuàng)建的是UDP套接字,有自己的端口號(hào)。用戶創(chuàng)建聊天室可以把自己的所有好友都加入到聊天室,這些好友發(fā)的消息可以被所有在聊天室中的好友共享,即使這些好友之間可能并不能互相訪問。聊天室服務(wù)器如圖46所示。聊天室分為服務(wù)器和客戶端,每個(gè)用戶只能創(chuàng)建一個(gè)聊天室,也只能加入一個(gè)聊天室。打開“聊天記錄”按鈕,可以選擇保存的聊天記錄,在接收文本框內(nèi)會(huì)顯示打開選擇的聊天記錄。聊天對(duì)話框還有記錄和打開聊天記錄的功能。如果沒有接收完畢,繼續(xù)請(qǐng)求發(fā)送下一個(gè)消息數(shù)據(jù)包。消息發(fā)送者收到請(qǐng)求發(fā)送消息的消息后,會(huì)把相應(yīng)的數(shù)據(jù)包發(fā)送給聊天對(duì)方。對(duì)方接收到這個(gè)通知消息時(shí),會(huì)根據(jù)接收到的消息長(zhǎng)度分配一個(gè)接收消息的臨時(shí)空間,并把接收到的消息時(shí)間也保存。主對(duì)話框定義了一變量,在用UDP發(fā)送數(shù)據(jù)的時(shí)候,就可以根據(jù)這個(gè)值的大小來確定分包的大小。 return FALSE。if (!AfxSocketInit( amp。上面提到了發(fā)送的最大數(shù)據(jù)長(zhǎng)度,m_pLisSocket是創(chuàng)建的UDP套接字,不像TCP一樣可以發(fā)送隨意大小的數(shù)據(jù),UDP套接字只能發(fā)送小于一定大小的數(shù)據(jù)。聊天消息包括文字格式和圖像信息,因此發(fā)送的數(shù)據(jù)可能很大,會(huì)超過Socket發(fā)送的最大數(shù)據(jù)長(zhǎng)度,這樣如果直接發(fā)送,會(huì)因?yàn)閿?shù)據(jù)長(zhǎng)度過大,而導(dǎo)致發(fā)送失敗。主對(duì)話框接收到聊天消息后,根據(jù)消息發(fā)送的來源IP來處理消息。 ( szMessage )。 /// 設(shè)置接收框 ( ().GetLength() )。接收到的消息主要代碼如下:void CChatDlg::ReceiveMessage( LPCSTR szTime, LPCSTR szMessage ){ CString strText。}單擊“發(fā)送”按鈕或CTRL+ENTER鍵,程序會(huì)調(diào)用OnSend()函數(shù),首先得到發(fā)送的時(shí)間和發(fā)送的內(nèi)容,得到的是RTF格式的內(nèi)容,因此strSend中還包括了文字的格式和圖片信息。 … CString strSend = ()。發(fā)送消息的主要代碼如下:void CChatDlg::OnSend() { CTime time = CTime::GetCurrentTime()。聊天對(duì)話框中定的發(fā)送和接收富文本框變量為:CRichText m_rtReceived。 }}聊天對(duì)話框,如圖45所示。 lpDllEntryPoint = GetProcAddress( hLib, DllRegisterServer )。 /// 控件不存在 if( !hLib ) { MessageBox( )。if( RegOpenKeyEx( HKEY_CLASSES_ROOT, \\CLSID, 0, KEY_READ, amp。要使用此控件,系統(tǒng)中必須注冊(cè)了此控件,如果未注冊(cè)此控件,那么打開聊天對(duì)話框時(shí)程序會(huì)死掉。 }} 聊天模塊聊天模塊提供的是兩個(gè)已連接好友之間的聊天服務(wù),其聊天內(nèi)容既可以是文字聊天也可以是圖片聊天。 delete pSendData。dataPacket, sizeof( DATAPACKET ) )。 BYTE *pSendData = new BYTE[ uDataLength ]。 = REQUEST_KEEPCONNECT。 nIndex++ ) { USER user = ( nIndex )。 /// 分別發(fā)送保持連接的消息,將發(fā)送過的IP加入到m_strlstKeepConnent for( nIndex = 0。 nIndex。 if( ( ) ) { ( nIndex )。 nIndex ()。在程序初始化時(shí)設(shè)置一定時(shí)器:SetTimer( TIMER_CONNECT, DEFAULT_REFRESH_TIME, NULL )。程序收到回應(yīng)保持連接的消息后,會(huì)從臨時(shí)好友列表中刪除對(duì)應(yīng)的好友?!∨c好友保持連接此功能用到了定時(shí)器,間隔一定時(shí)間向所有好友發(fā)起請(qǐng)求保持連接的消息,并把發(fā)送過此消息的好友添加到一個(gè)臨時(shí)好友列表中。在客戶端接受到OFFLINE的網(wǎng)絡(luò)消息時(shí),得到發(fā)送此消息的IP,然后從好友數(shù)據(jù)和好友列表框中刪除與此IP相等的好友。添加好友對(duì)方是否允許將好友添加到數(shù)組和列表框中彈出提示框TF圖43 添加好友流程圖好友收到請(qǐng)求的流程圖,如圖44所示。否則先把發(fā)起者的USER信息加入到好友列表中,再向請(qǐng)求者發(fā)送允許加為好友的消息,消息中包括自己的USER信息。在AddRequest()函數(shù)中,先進(jìn)行相應(yīng)的判斷,如果具備加為好友的條件,根據(jù)是否允許直接加為好友的值是否彈出提示對(duì)話框。向?qū)Ψ桨l(fā)起請(qǐng)求后,對(duì)方的m_pLisSocket就會(huì)調(diào)用OnReceive()函數(shù),程序中重載了CListeningSocket類的OnReceive()函數(shù),在OnReceive()中調(diào)用主對(duì)對(duì)話框的OnListeningReceive()函數(shù)來接收網(wǎng)絡(luò)數(shù)據(jù)。/// 發(fā)送請(qǐng)求m_pLisSocketSendTo( pSendData, uDataLength, DEFAULT_PORT, strFriendIP )。memcpy( pSendData + sizeof( DATAPACKET ), amp。memcpy( pSendData, amp。/// 分配空間UINT uDataLength = sizeof( DATAPACKET ) + sizeof( USER )。memcpy( , ( MAXNICKNAMELENGTH + 1 ), MAXNICKNAMELENGTH + 1 )。 = m_bCamera。 = REQUEST_ADD。在添加按鈕的響應(yīng)函數(shù)中先判斷IP地址是否合法,是否是自己的IP,是否已經(jīng)添加此好友。m_pLisSocket = new CListeningSocket( this )?!√砑雍糜?,這一節(jié)介紹的是具體的實(shí)現(xiàn)。雙緩沖技術(shù),就是先創(chuàng)建一個(gè)與目標(biāo)設(shè)備兼容的內(nèi)存設(shè)備上下文,在內(nèi)存設(shè)置上下文中畫圖或進(jìn)行其他處理,操作完成了,再一并把內(nèi)存設(shè)備上下文的內(nèi)容貼到目標(biāo)設(shè)備上,這樣就可以有效的防止閃爍。在DrawItem()函數(shù)中,先得到額外的附加數(shù)據(jù),既是添加項(xiàng)時(shí)作為參數(shù)傳遞的USER類型的變量,然后再根據(jù)m_nCurSel、m_nDelIcon和m_nCamera的值自繪。用戶雙擊鼠標(biāo)時(shí),調(diào)用主對(duì)框的相應(yīng)函數(shù),并把項(xiàng)的序號(hào)傳給此函數(shù)。在向好友列表框中添加好友時(shí),主對(duì)話框調(diào)用好友列表框的AddUser()函數(shù),參數(shù)為USER結(jié)構(gòu)體,這個(gè)參數(shù)作為列表項(xiàng)的額外數(shù)據(jù),這樣重繪的時(shí)候再讀取出這個(gè)額外數(shù)據(jù)就可以得到這一項(xiàng)的用戶信息。},表示好友列表框每項(xiàng)的高度。 … CListCtrl::PreSubclassWindow()。 /// 刪除按鈕激活的序號(hào)int m_nCurSel。 /// 頭像圖像列表int m_nCamera。定義的成員變量如下:CInstantMessagingDlg *m_pMainDlg。要使用此函數(shù),必須導(dǎo)入 ,在程序使用如下語句導(dǎo)入:pragma ment( lib, C:\\Program Files\\Microsoft Visual Studio\\VC98\\Lib\\  ) 自繪好友列表框普通的列表控件無法滿足程序的要求,程序要求好友列表框可以顯示好友的頭像、好友昵稱、好友IP和刪除、攝像頭按鈕。在畫按鈕的狀態(tài)時(shí),使用到了TransparentBlt()函數(shù),這個(gè)函數(shù)可以貼透明位圖。要使按鈕無效,必須調(diào)用EnableWindow( FALSE )函數(shù)來更改按鈕的狀態(tài),我們也就無法更改m_nState的值。 }}DrawNORMAL() 、DrawHOVER ()、DrawDOWN() 、DrawDISABLE()分別畫按鈕的4種狀態(tài)。 break。 break。 break。 break。 ODS_DISABLED ) { m_nState = DISABLE。自繪按鈕必須重載DrawItem()函數(shù),在DrawItem()函數(shù)中根據(jù)m_nState的值可以貼上不同的圖,表示按鈕的一不同狀態(tài)。以上代碼告訴系統(tǒng),當(dāng)鼠標(biāo)離開m_hWnd窗口時(shí),向這個(gè)窗口發(fā)送一條WM_MOUSELEAVE消息。::_TrackMouseEvent( amp。 = m_hWnd。TRACKMOUSEEVENT tme。 ( this, strText )。 CString strText。 ( this, TTS_ALWAYSTIP )。void CAdvButton::PreSubclassWindow() { ModifyStyle( 0, BS_OWNERDRAW )。要實(shí)現(xiàn)按鈕自繪,必須更新按鈕的風(fēng)格為自繪,可以在按鈕的屬性中更改,也可以使用代碼更改。4個(gè)CBitmap的變量分別存儲(chǔ)4種狀態(tài)下的圖像。 /// 無效圖標(biāo)CToolTipCtrl m_pToolTipCtrl。 /// 焦點(diǎn)圖標(biāo)CBitmap m_bmpDown。 /// 按鈕的狀態(tài)CBitmap m_bmpNormal?!∽岳L按鈕VC++,而且也不能顯示圖像,作為一款好的軟件,應(yīng)該有個(gè)好的界面。用戶列表框也是自繪的,普通的列表控件無法顯示我們所需的信息。運(yùn)行程序后,并在主界面中作相應(yīng)的設(shè)置。圖42 設(shè)置對(duì)話框最后一項(xiàng)“允許別人直接將我加為聯(lián)系”的意思是別人添加我為好友時(shí),不會(huì)彈
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1