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

正文內(nèi)容

計(jì)算機(jī)優(yōu)秀畢業(yè)論文正稿-閱讀頁

2025-07-04 13:05本頁面
  

【正文】 按鈕的狀態(tài),可以為宏:NORMAL,HOVER,DOWN,DISABLE,分別表示按鈕正常狀態(tài)、處于焦點(diǎn)狀態(tài)、按下狀態(tài)、無效狀態(tài),這4個宏的定義在實(shí)現(xiàn)文件。m_pToolTipCtrl是提示工具控件類,既是鼠標(biāo)在其上時,會彈出提示窗口。重載PreSubclassWindow(),在這個函數(shù)中更改按鈕風(fēng)格并初始化m_pToolTipCtrl。 CButton::PreSubclassWindow()。 ( 100 )。 GetWindowText( strText )。 }VC++,只能為我們添加鼠標(biāo)移動、單擊等消息,我們得自己為自繪按鈕添加上鼠標(biāo)離開的消息。 = sizeof( TRACKMOUSEEVENT )。 = TME_LEAVE。tme )。下面的處理方式與熱鍵和托盤通知消息的處理方式一樣,自定義這個消息處理函數(shù)就行了。void CAdvButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if( lpDrawItemStructitemState amp。 } switch( m_nState ) { case NORMAL: DrawNORMAL()。 case HOVER: DrawHOVER()。 case DOWN: DrawDOWN()。 case DISABLE: DrawDISABLE()。 default: break。當(dāng)鼠標(biāo)滑過或單擊按鈕時,更改m_nState的值,然后調(diào)用Invalidate(),強(qiáng)制按鈕重繪。lpDrawItemStructitemState的值表示了當(dāng)前按鈕的狀態(tài),可以檢測lpDrawItemStructitemState,如果按鈕是無效狀態(tài),則設(shè)置m_nState為DISABLE,否則不作改變。在TransparentBlt()最后一個參數(shù)中指定掩碼色,貼圖時掩碼色就不會貼出來。 /// 主對話框CImageList m_imageList。 /// 攝像頭激活的序號int m_nDelIcon。 /// 當(dāng)前選中用戶序號與自繪按鈕類似,在PreSubclassWindow()函數(shù)中更改列表框的風(fēng)格為自繪:void CFriendsListCtrl::PreSubclassWindow() { ModifyStyle( 0, LVS_OWNERDRAWFIXED )。}重載MeasureItem()函數(shù)更改列表框每一項(xiàng)的高度:void CFriendsListCtrl::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ){lpMeasureItemStructitemHeight = DEFAULT_FRIENDSLIST_HEIGHT。列表框中的鼠標(biāo)離開消息與自繪按鈕的實(shí)現(xiàn)是同一個原理,這兒就不再贅述。鼠標(biāo)在好友列表框上移動時,判斷鼠標(biāo)是否在刪除或攝像頭(如果有攝像頭)按鈕范圍內(nèi),如果在,就設(shè)置m_nDelIcon或m_nCamera為當(dāng)前項(xiàng)的序號,否則就設(shè)置m_nCurSel為當(dāng)前項(xiàng)的序號。如果是單擊,先判斷m_nDelIcon、m_nCamera值,如果不為1,則選中了刪除或攝像頭按鈕,調(diào)主對框相應(yīng)函數(shù)執(zhí)行相應(yīng)操作。在自繪時,為了防止閃爍,程序用到了雙緩沖技術(shù)?!『糜压芾砗糜压芾戆ㄌ砑雍糜?、刪除好友以及與好友保持連接。首先,對話框定義監(jiān)聽Socket并初始化:CListeningSocket *m_pLisSocket。m_pLisSocketCreate( DEFAULT_PORT, SOCK_DGRAM )。如果可以添加此好友,則向此好友發(fā)起請求加為好友的請求:/// 定義數(shù)據(jù)包DATAPACKET dataPacket。/// 設(shè)置請求的用戶結(jié)構(gòu)USER user。 = m_wFace。()。BYTE *pSendData = new BYTE[ uDataLength ]。dataPacket, sizeof( DATAPACKET ) )。user, sizeof( USER ) )。delete pSendData。向好友發(fā)起請求的數(shù)據(jù)中,還包括自己的USER數(shù)據(jù)。在OnListeningReceive()函數(shù)中,根據(jù)DATAPACKET的mand值來進(jìn)行相應(yīng)的處理,這就是添加為好友的流程,先得到發(fā)起請求的USER,再調(diào)用AddRequest()函數(shù)做相應(yīng)處理。如果拒絕加為好友,則向發(fā)送者發(fā)送拒絕的消息。請求者添加好友流程圖,如圖43所示。收到請求是否允許將好友添加到數(shù)組和列表框中并發(fā)送允許消息發(fā)送拒絕消息TF圖44 好友收到請求流程圖 刪除好友刪除好友比較簡單,在服務(wù)器端向要刪除的好友發(fā)送命令為OFFLINE的消息,然后從好友數(shù)組和好友列表框中刪除此好友。另外,當(dāng)用戶改變自己的狀態(tài)為下線狀態(tài)或關(guān)閉程序時,會調(diào)用SendOffLineMessage()函數(shù)向所有好友發(fā)送下線消息,并刪除所有的好友。好友收到請求保持連接的消息后,會發(fā)送回應(yīng)保持連接的消息。在下一次定時器到的時候,程序檢查臨時好友列表,在臨時好友列表中的好友都是沒有回應(yīng)的的好友,這些好友可能是因?yàn)槌绦虿徽jP(guān)閉而未向其他好友發(fā)送下線通知,程序就可以將這些好友刪除。在OnTimer()函數(shù)中進(jìn)行如下處理:/// 保持接連if( TIMER_CONNECT == nIDEvent ) { /// 刪除沒有回應(yīng)的聯(lián)系人 for( int nIndex = 0。 nIndex++ ) { USER userDel = ( nIndex )。 ( nIndex )。 } } ()。 nIndex ()。 DATAPACKET dataPacket。 /// 分配空間 UINT uDataLength = sizeof( DATAPACKET )。 memcpy( pSendData, amp。 m_pLisSocketSendTo( pSendData, uDataLength, DEFAULT_PORT, )。 ( )。本系統(tǒng)用到了Microsoft Rich Textbox Control ,此控件支持RTF(Rich Text Format)格式的內(nèi)容,包括不同顏色、不同字體字號的文本和圖片。為了解決這個問題,如果沒有注冊,程序會先注冊,代碼如下:HKEY hKey。hKey ) != ERROR_SUCCESS ) { HINSTANCE hLib = LoadLibrary( )。 } else { //獲取注冊函數(shù)DllRegisterServer地址 FARPROC lpDllEntryPoint。 /// lpDllEntryPoint()。圖45 聊天對話框聊天對話框用的Socket是主對話框的m_pLisSocket,當(dāng)要發(fā)送消息時,調(diào)用主對話框的SendPreChatMessage()函數(shù),主對話框接收到聊天消息時調(diào)用聊天對話框的ReceiveMessage()函數(shù)。CRichText m_rtSend。 CString strTime = ( %H:%M:%S )。 /// 發(fā)送聊天消息 m_pMainDlgSendPreChatMessage( m_userChat, strTime, strSend )。然后調(diào)用主對話框的SendPreChatMessage()函數(shù)向m_userChat好友發(fā)送聊天消息。 ( %s(%s) %s\r\n , , , szTime )。 ( strText )。 …}因?yàn)榱奶煊玫腟ocket是主對話框的m_pLisSocket,因此是主對話框接收到的聊天消息。如果與此IP的聊天窗口打開的,就直接調(diào)用ReceiveMessage()把消息放入接收文本框中,如果聊天窗口沒有打開,則把消息追加到CMapStringToOb類型的變量m_mapIPToChat中,并在托盤區(qū)動態(tài)顯示用戶的頭像。所以在發(fā)送這種大數(shù)據(jù)量的消息時,本程序采用的分包發(fā)送的方式。UDP可以發(fā)送的最大數(shù)據(jù)量可以由下面的代碼得到:WSADATA wsaData。wsaData )){ AfxMessageBox(IDP_SOCKETS_INIT_FAILED)。}初始化WinSocket后,WSADATA結(jié)構(gòu)中就有我們需要的信息。聊天對話框發(fā)送消息時調(diào)用主對話框的SendPreChatMessage()函數(shù),這個函數(shù)并不是一下子將消息發(fā)送出去,而是將消息保存起來,只發(fā)送一個通知消息告訴對方有數(shù)據(jù)需要發(fā)送,這個通知消息中帶有消息的時間的消息的長度。然后向消息發(fā)送者發(fā)送請求接收第一個數(shù)據(jù)包的請求。對方接收到消息數(shù)據(jù)包后,把消息放入到接收消息的臨時空間,并判斷數(shù)據(jù)是否接收完畢。如果接收完畢,播放聲音,并判斷與此IP對應(yīng)的聊天窗口是否打開,是則調(diào)用ReceiveMessage()把消息放入到接收消息文本框,否則把消息保存起來,并動態(tài)顯示托盤的圖標(biāo),等待用戶打開聊天窗口時再把消息放到接收文本框。勾選上“關(guān)閉時保存聊天記錄”,關(guān)閉聊天對話框會聊天記錄會自動保存在形如“()”的文件中,文件名由聊天開始時間、IP、昵稱組成?!×奶焓夷K聊天室模塊設(shè)計(jì)目的是為多人共同聊天提供一個便捷的環(huán)境,由一人創(chuàng)建聊天室之后,可以將多個好友加進(jìn)聊天室,使得多個用戶實(shí)現(xiàn)簡單的通信需求。聊天室也只能發(fā)送普通文本消息,所以聊天室的開發(fā)相比聊天來說,相對簡單,但是設(shè)計(jì)目的與聊天也有所不同。圖46 聊天室服務(wù)器界面服務(wù)器右邊兩個列表框分別表示在聊天室里的好友、不在聊天室里的好友;客戶端右邊的列表框表示在聊天室中的好友。這也是聊天室的一個好處。用戶創(chuàng)建聊天室時,創(chuàng)建端口為CHATROOM_SERVER_PORT的UDP套接定,把自己加入到聊天室好友列表里,同時也把自己添加的所有好友加入到未進(jìn)入聊天室好友列表中。SendUserCommandToIP( CHATROOM_ADDREQUEST, , DEFAULT_PORT, amp。以上代碼就是向好友user發(fā)送加入聊天室請求,因?yàn)樵诩尤肓奶焓抑?,這些好友并沒有創(chuàng)建聊天室客戶端SOCKET,所以必須向主對話框的m_pLisSocket套接字發(fā)送消息,這從DEFAULT_PORT端口號就可以看出來。單擊向下的按鈕,會刪除聊天室好友列表框中選定的好友,并向他們發(fā)送被踢出聊天室的消息:SendUserCommandToIP( CHATROOM_CLIENT_KICKED, , CHATRO OM_CLIENT_PORT, NULL )。當(dāng)聊天室服務(wù)器關(guān)閉時,會向所有聊天室好友發(fā)送關(guān)閉聊天室的消息:for( int nIndex = 1。 nIndex++ ){ USER user = ( nIndex )。 }聊天室好友列表里第一個是自己,不必要給自己發(fā)送消息,因此nIndex是從1開始的。在服務(wù)器創(chuàng)建的時候,限制過發(fā)送文本框的字?jǐn)?shù):( MAXDATAPACKETLENGTH sizeof( DATAPACKET ) sizeof( CHATROOMMESSAGEINFO ) )。 nIndex ()。SendTextToIP( , CHATROOM_CLIENT_PORT, strSend, )。 nIndex1 ()。 if( 0 == strcmp( , ) ) { continue。}以上就是服務(wù)器的主要功能。聊天室客戶端如圖47所示。在客戶端打開的同時,限制發(fā)送文本框的最大字?jǐn)?shù),創(chuàng)建客戶端SOCKET,端口號為CHATROOM_CLIENT_PORT的UDP??蛻舳岁P(guān)閉時,會向服務(wù)器發(fā)送客戶端關(guān)閉的消息??蛻舳私拥椒?wù)器發(fā)來的聊天消息時,處理也很簡單,直接將聊天消息加入到接收消息文本框。服務(wù)器在當(dāng)中起到了中轉(zhuǎn)的作用,所有消息都經(jīng)過服務(wù),服務(wù)器向所有好友發(fā)送消息,就算聊天室中的好友不能互相連接,只要能連接到服務(wù)器,他們就可以一起聊天。文件傳送支持?jǐn)帱c(diǎn)續(xù)傳,這是本程序的一個亮點(diǎn)。一個線程負(fù)責(zé)將一個文件傳送給一個好友。圖48 傳輸文件界面單擊添加按鈕會打開選擇文件對話框,選擇好要發(fā)送的文件后,會彈出一個好友列表框,要求選擇需要發(fā)送的好友,選擇了好友后,程序會把發(fā)送文件信息添加到傳輸入文件對話框中,并向接收者發(fā)起傳送文件的請求,如果接收者拒絕接收文件,在傳輸文件對話框的相應(yīng)項(xiàng)的速度列就會顯示“拒絕”,如果接收者接受文件,文件傳送正式開始。用戶打開文件傳輸功能,彈出傳輸文件對話框,在初始對話框的時候,除了初始化傳輸文件列表框,還會創(chuàng)建一個端口號為SENDFILESSERVER_PORT的TCP套按字m_pSFServerSocket,并設(shè)置此套接字為監(jiān)聽狀態(tài)。如果接收者拒絕接收文件,列表框的相應(yīng)項(xiàng)的速度列會被設(shè)置為“拒絕”。 m_pSFServerSocketAccept( sfSocket )。 pSFSThreadSetSendFilesServerDlg( this )。 pSFSThreadResumeThread()。}在此函數(shù)中先定義一個CSendFilesSocket類型的變量sfSocket,m_pSFServerSocket接收此WinSocket,就與接收都連接起來了。在線程中也有一個CSendFilesSocket類型的成員變量,將這兒的sfSocket分離掉套接字句柄,附加到線程中的相同類型的成員變量上。在傳輸入文件對話框中選中某些傳輸信息,單擊“刪除”按鈕,會
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1