版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Windows系統(tǒng)編程課程設(shè)計(jì)計(jì)算機(jī)科學(xué)學(xué)院08級自動化一班08064021劉欣然Windows系統(tǒng)編程課程設(shè)計(jì)計(jì)算機(jī)科學(xué)學(xué)院08級自動化一班08064021劉欣然 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院Windows系統(tǒng)編程課程設(shè)計(jì)報(bào)告題目:簡易聊天室程序之服務(wù)器系統(tǒng)專業(yè)自動化學(xué)生姓名劉欣然班級學(xué)號自動化1班08064021完成日期2010.12.30課題名稱簡易聊天室程序之服務(wù)器系統(tǒng)二、課題內(nèi)容和要求1、內(nèi)容:了解Windows編程的基礎(chǔ)知識,掌握MFC應(yīng)用程序的基本知識加深對數(shù)據(jù)庫的掌握和運(yùn)用掌握用VC++開發(fā)應(yīng)用程序的的一般步驟和方法進(jìn)一步加強(qiáng)C++的編程能力和對程序結(jié)構(gòu)的理解5.基本掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思路和方法2.要求:運(yùn)用MFC編程方法制作一個簡單網(wǎng)絡(luò)聊天室的系統(tǒng),可以自定義服務(wù)器端口,即時顯示在線好友的IP地址,在服務(wù)器上顯示好友的上線下線信息,顯示在線好友發(fā)送消息的內(nèi)容、具體時間,顯示并可以向客戶端發(fā)送信息。了解Windows編程的基礎(chǔ)知識,掌握MFC應(yīng)用程序的基本知識;基本掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思路和方法;掌握用VC++開發(fā)應(yīng)用程序的一般步驟和方法;系統(tǒng)以Windows標(biāo)準(zhǔn)菜單界面方式工作,運(yùn)行界面友好,演示程序以用戶和計(jì)算機(jī)的對話方式進(jìn)行程序的功能建立一個基于對話框的MFC,要設(shè)置權(quán)限,即設(shè)置一個登陸的對話框。進(jìn)入系統(tǒng)以后能夠展示出一個普通的汽車公司售票系統(tǒng),能夠?qū)崿F(xiàn)售票等基本功能。輸入輸出的要求采用界面選擇與編輯框兩種輸入方式,輸出結(jié)果直接顯示在售票對話框中。輸入的數(shù)據(jù)必須符合程序所規(guī)定的合法輸入方式,對不合法的信息輸入將提示無法處理。4.綜合應(yīng)用使用界面編程、網(wǎng)絡(luò)、數(shù)據(jù)庫、文件系統(tǒng)、線程和進(jìn)程、異常處理等知識。特別是數(shù)據(jù)庫的應(yīng)用,用來存儲數(shù)據(jù)和提供數(shù)據(jù)。對于網(wǎng)絡(luò)主要進(jìn)行網(wǎng)絡(luò)通信,連接客戶端和服務(wù)器端。采取模塊化方式進(jìn)行程序設(shè)計(jì),要求程序的功能設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及整體結(jié)構(gòu)設(shè)計(jì)合理三、開發(fā)工具介紹隨著計(jì)算機(jī)的廣泛應(yīng)用,辦公無紙化正在越來越普及,傳統(tǒng)的手工信息管理已顯然不能滿足人們的需求,這就需要一種適應(yīng)潮流的新的管理系統(tǒng)的出現(xiàn),員工信息管理與考勤系統(tǒng)就是用VisualC++開發(fā)的Access數(shù)據(jù)庫管理系統(tǒng)。
Access數(shù)據(jù)庫是一個關(guān)系數(shù)據(jù)庫,在VisualC++中,可以用SQL語句實(shí)現(xiàn)對它的操作。本系統(tǒng)的建表是直接在Access中進(jìn)行,而對表的操作則在VisualC++中通過編程進(jìn)行。VisualC++是一種編程開發(fā)非常靈活的工具。有兩種編程方法:其一是WINDOWS
API函數(shù),另一種就是使用MFC。VisualC++與數(shù)據(jù)庫連接的一種方式是MFCODBC連接VisualStudio2010是微軟亞太研發(fā)集團(tuán)服務(wù)器與開發(fā)工具事業(yè)部成立以來參與的最大開發(fā)項(xiàng)目。超過100位工程師在為VisualStudio2010的多個重要模塊設(shè)計(jì)中貢獻(xiàn)了他們的智慧與心血。在.NETFramework4.0中為WindowsForms架構(gòu)設(shè)計(jì)運(yùn)行時和設(shè)計(jì)時的新功能;對SharePoint、Silverlight、WPF、WCF、WF等多個平臺提供更多工具支持;大大增強(qiáng)VisualStudio中的各種基本開發(fā)工具,例如C++編譯和鏈接工具,并行開發(fā)工具中的調(diào)試器和性能探視器;為更好地支持團(tuán)隊(duì)開發(fā),提供全新的UML建模工作組件、模型瀏覽器和建模工程等。Microsoft為單獨(dú)工作或在小型團(tuán)隊(duì)中的專業(yè)開發(fā)人員提供了兩種選擇,VisualStudio2005ProfessionalEdition和用于MicrosoftOffice系統(tǒng)的VisualStudio2005工具。每種版本都在標(biāo)準(zhǔn)版的特性上進(jìn)行了擴(kuò)展,包括用于遠(yuǎn)程服務(wù)程序開發(fā)和調(diào)試、SQLServer2005開發(fā)的工具,以及完整的、沒有限制的開發(fā)環(huán)境。每種產(chǎn)品都可以單獨(dú)購買或打包定購。專業(yè)開發(fā)人員喜歡自由的使用.NETFramework2.0,它是一種穩(wěn)健的、功能齊備的開發(fā)環(huán)境,支持創(chuàng)建擴(kuò)展VisualStudio集成開發(fā)環(huán)境的工具。MFC借助C++的優(yōu)勢為Windows開發(fā)開辟了一片新天地,同時也借助ApplicationWizzard使開發(fā)者擺脫離了那些每次都必寫基本代碼,借助ClassWizard和消息映射使開發(fā)者擺脫了定義消息處理時那種混亂和冗長的代碼段。更令人興奮的是利用C++的封裝功能使開發(fā)者擺脫Windows中各種句柄的困擾,只需要面對C++中的對象,這樣一來使開發(fā)更接近開發(fā)語言而遠(yuǎn)離系統(tǒng).利用C++的封裝性開發(fā)者可以更容易理解和操作各種窗口對象;利用C++的派生性開發(fā)者可以減少開發(fā)自定義窗口的時間和創(chuàng)造出可重用的代碼;利用虛擬性可以在必要時更好的控制窗口的活動。而且C++本身所具備的超越C語言的特性都可以使開發(fā)者編寫出更易用,更靈活的代碼。PlatformSDK。這才是VisualC++和整個VisualStudio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,PlatformSDK是以MicrosoftC/C++編譯器為核心(不是VisualC++,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說到DeveloperStudio沒有編譯程序的功能,那么這項(xiàng)工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成VisualStudio的基石。vc++是Windows平臺上的C++編程環(huán)境,學(xué)習(xí)VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、COM等的知識,難度比較大。Windows下編程需要了解Windows的消息機(jī)制以及回調(diào)(callback)函數(shù)的原理;MFC是Win32API的包裝類,需要理解文檔視圖類的結(jié)構(gòu),窗口類的結(jié)構(gòu),消息流向等等;COM是代碼共享的二進(jìn)制標(biāo)準(zhǔn),需要掌握其基本原理等等。VC作為一個主流的開發(fā)平臺一直深受編程愛好者的喜愛,但是很多人卻對它的入門感到難于上青天,究其原因主要是大家對他錯誤的認(rèn)識造成的,嚴(yán)格的來說VC++不是門語言,雖然它和C++之間有密切的關(guān)系,如果形象點(diǎn)比喻的話,可以C++看作為一種”工業(yè)標(biāo)準(zhǔn)”,而VC++則是某種操作系統(tǒng)平臺下的”廠商標(biāo)準(zhǔn)”,而”廠商標(biāo)準(zhǔn)”是在遵循”工業(yè)標(biāo)準(zhǔn)”的前提下擴(kuò)展而來的。
VC++應(yīng)用程序的開發(fā)主要有兩種模式,一種是WINAPI方式,另一種則是MFC方式,傳統(tǒng)的WINAPI開發(fā)方式比較繁瑣,而MFC則是對WINAPI再次封裝,所以MFC相對于WINAPI開發(fā)更具備效率優(yōu)勢。Windows系統(tǒng)是一個消息驅(qū)動的OS:1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)。當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時系統(tǒng)都會發(fā)送消息到某一個窗口。例如當(dāng)菜單轉(zhuǎn)中之后會有WM_COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam))是命令的ID號,對菜單來講就是菜單ID。當(dāng)然用戶也可以定義自己的消息名稱,也可以利用自定義消息來發(fā)送通知和傳送數(shù)據(jù)。2、誰將收到消息:一個消息必須由一個窗口接收。在窗口的過程(WNDPROC)中可以對消息進(jìn)行分析,對自己感興趣的消息進(jìn)行處理。例如你希望對菜單選擇進(jìn)行處理那么你可以定義對WM_COMMAND進(jìn)行處理的代碼,如果希望在窗口中進(jìn)行圖形輸出就必須對WM_PAINT進(jìn)行處理。3、未處理的消息到那里去了:M$為窗口編寫了默認(rèn)的窗口過程,這個窗口過程將負(fù)責(zé)處理那些你不處理消息。正因?yàn)橛辛诉@個默認(rèn)窗口過程我們才可以利用Windows的窗口進(jìn)行開發(fā)而不必過多關(guān)注窗口各種消息的處理。例如窗口在被拖動時會有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。4、窗口句柄:說到消息就不能不說窗口句柄,系統(tǒng)通過窗口句柄來在整個系統(tǒng)中唯一標(biāo)識一個窗口,發(fā)送一個消息時必須指定一個窗口句柄表明該消息由那個窗口接收。而每個窗口都會有自己的窗口過程,所以用戶的輸入就會被正確的處理。例如有兩個窗口共用一個窗口過程代碼,你在窗口一上按下鼠標(biāo)時消息就會通過窗口一的句柄被發(fā)送到窗口一而不是窗口二。設(shè)計(jì)思路模擬QQ聊天室系統(tǒng),制作一個服務(wù)器對話框,當(dāng)客戶端A登陸或下線時,顯示A上線下線的消息以及具體時間,A發(fā)送消息時,顯示消息的內(nèi)容和具體的時間。并可以轉(zhuǎn)發(fā)A消息的內(nèi)容。服務(wù)器本身也能發(fā)送消息,顯示消息內(nèi)容及具體時間。計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)發(fā)展至今已經(jīng)大大超越了人們當(dāng)初的預(yù)想,無論是人們?nèi)粘5墓ぷ鬟€是學(xué)習(xí),我們都越來越多的依靠到互聯(lián)網(wǎng)。各種實(shí)時性的聊天娛樂軟件也同時誕生,而且為我們的即時通訊帶來了眾多的方便,比如說大家所熟知的騰訊QQ、微軟的MSN、移動的Fetion等,都是做的比較成功的實(shí)時聊天工具。隨著網(wǎng)絡(luò)的日益普及,各種聊天工具也層出不窮,但當(dāng)我們學(xué)習(xí)了《TCP/IP協(xié)議與網(wǎng)絡(luò)編程》這門課程之后,我們便會覺得,其實(shí)要實(shí)現(xiàn)簡單的網(wǎng)絡(luò)通訊其實(shí)并不難。接下來的課程設(shè)計(jì)就是針對一個簡單的網(wǎng)絡(luò)聊天程序,利用MFC為開發(fā)工具,實(shí)現(xiàn)基本的通訊功能。此程序主要分為兩部分:服務(wù)器端和客戶端。服務(wù)器端用于提供一個網(wǎng)絡(luò)端口,等待客戶端發(fā)出請求,登錄到此服務(wù)端,然后進(jìn)行網(wǎng)絡(luò)通訊和消息的轉(zhuǎn)發(fā);客戶端可通過服務(wù)器端的IP地址發(fā)送連接請求,然后登陸聊天室。在服務(wù)器端的成員列表欄中會顯示在線的所有人名單,有人退出聊天室,成員列表會自動除名。服務(wù)器端同時也提供了成員之間的私聊功能,此時服務(wù)器端作為一個轉(zhuǎn)發(fā)站,進(jìn)行消息的轉(zhuǎn)發(fā)。整個程序的主體使用了CSocket類的方法,實(shí)現(xiàn)了網(wǎng)絡(luò)通訊聊天。整個程序設(shè)計(jì)為兩個部分:服務(wù)器(ChatRoomServer)和客戶端(ChatRoom)多人聊天的關(guān)鍵在于要將每個客戶端發(fā)送過來的消息分發(fā)給所有其他客戶端,為了解決這個問題,在服務(wù)器程序中建立一個套接口鏈表,用來保存所有與客戶端建立了連接的服務(wù)端口。下面描述了多人聊天的實(shí)現(xiàn)原理:當(dāng)客戶端ClientN向?qū)?yīng)的服務(wù)端口N發(fā)送了消息Message,服務(wù)端口N將Message復(fù)制給所有套接口列表(USERLIST)中的套接口緩沖區(qū),然后向每個服務(wù)端口發(fā)送WRITE消息,使每個服務(wù)端口將Message發(fā)送給對應(yīng)的客戶端。這樣,所有客戶端就都獲得了Message消息,實(shí)現(xiàn)了多人聊天功能。BOOLCClientSocketList::Sends(char*buff,intn){CClientSocket*curr=Head; while(curr) {curr->Send(buff,n); curr=curr->Next;} returntrue;}USERLIST表時多人聊天程序的核心,它是一個動態(tài)變化的鏈表,為空表示沒有客戶端建立了連接,不為空時每個元素就代表有一個客戶端與服務(wù)器建立了連接。以下程序是私聊功能的實(shí)現(xiàn):BOOLCClientSocketList::OnlySend(char*buff,intn,intwho){ CClientSocket*curr=Head; while(curr&&who>0) {curr=curr->Next; who--;} curr->Send(buff,n); returntrue;}五、流程圖(或功能模塊圖)開始開始開始綁定綁定是否成功?開始偵聽啟動線程判斷是否有客戶端連接?獲取客戶端數(shù)量,向每個連接客戶端循環(huán)發(fā)送和接收信息判斷哪一個客戶端斷開連接?停止對該客戶端發(fā)送和接收消息結(jié)束是否是否測試數(shù)據(jù)及其結(jié)果分析WINDOWS環(huán)境下有三個客戶端,分別是老師、劉欣然、譚斌文,和一個服務(wù)器,他們互相通信的結(jié)果在服務(wù)器對話框顯示如下:客戶端劉欣然登陸成功:七、調(diào)試過程中的問題程序詳細(xì)設(shè)計(jì)//服務(wù)器Dlg.cpp:實(shí)現(xiàn)文件//#include"stdafx.h"#include"服務(wù)器.h"#include"服務(wù)器Dlg.h"#include"afxdialogex.h"#include<io.h>#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif//用于應(yīng)用程序“關(guān)于”菜單項(xiàng)的CAboutDlg對話框classCAboutDlg:publicCDialogEx{public: CAboutDlg();//對話框數(shù)據(jù) enum{IDD=IDD_ABOUTBOX}; protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//實(shí)現(xiàn)protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogEx(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)END_MESSAGE_MAP()//C服務(wù)器Dlg對話框C服務(wù)器Dlg::C服務(wù)器Dlg(CWnd*pParent/*=NULL*/) :CDialogEx(C服務(wù)器Dlg::IDD,pParent){ m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidC服務(wù)器Dlg::DoDataExchange(CDataExchange*pDX)//給變量賦相應(yīng)控件的ID值{ CDialogEx::DoDataExchange(pDX); DDX_Control(pDX,IDC_EDIT1,m_edit1); DDX_Control(pDX,IDC_EDIT2,m_edit2); DDX_Control(pDX,IDC_BUTTON1,m_button); DDX_Control(pDX,IDC_LIST1,m_list); }BEGIN_MESSAGE_MAP(C服務(wù)器Dlg,CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,&C服務(wù)器Dlg::OnBnClickedButton1) ON_BN_CLICKED(IDCANCEL,&C服務(wù)器Dlg::OnBnClickedCancel) ON_EN_CHANGE(IDC_EDIT2,&C服務(wù)器Dlg::OnEnChangeEdit2)END_MESSAGE_MAP()//C服務(wù)器Dlg消息處理程序BOOLC服務(wù)器Dlg::OnInitDialog(){ CDialogEx::OnInitDialog(); //將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。 //IDM_ABOUTBOX必須在系統(tǒng)命令范圍內(nèi)。 ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { BOOLbNameValid; CStringstrAboutMenu; bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //設(shè)置此對話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動 //執(zhí)行此操作 SetIcon(m_hIcon,TRUE); //設(shè)置大圖標(biāo) SetIcon(m_hIcon,FALSE); //設(shè)置小圖標(biāo) //TODO:在此添加額外的初始化代碼 count=0; m_list.InsertColumn(0,"消息");//消息欄 m_list.SetColumnWidth(0,435);//設(shè)置消息輸出框的初始位置和寬度 m_edit1.SetLimitText(99);//限制消息輸入框的輸入字符 m_edit2.SetWindowText("服務(wù)器");//初始化用戶姓名框 for(inti=0;i<50;i++)// msgsock[i]=NULL; //設(shè)定地址 serv.sin_addr.s_addr=htonl(INADDR_ANY);//儲存任何IP地址 serv.sin_family=AF_INET; serv.sin_port=5000;//設(shè)置端口為(5000); addlen=sizeof(serv); m_button.EnableWindow(FALSE); //創(chuàng)建socket sock=socket(AF_INET,SOCK_STREAM,0); //綁定 if(bind(sock,(sockaddr*)&serv,addlen)) { m_edit1.SetWindowText("綁定錯誤"); } else { //m_list.InsertItem(count++,inet_ntoa(serv.sin_addr)); m_edit1.SetWindowText("服務(wù)器創(chuàng)建成功"); //開始偵聽 listen(sock,5);//設(shè)置最多能偵聽5個線程 AfxBeginThread(&thread,0);//調(diào)用線程 } returnTRUE;//除非將焦點(diǎn)設(shè)置到控件,否則返回TRUE}voidC服務(wù)器Dlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID,lParam); }}//如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼//來繪制該圖標(biāo)。對于使用文檔/視圖模型的MFC應(yīng)用程序,//這將由框架自動完成。voidC服務(wù)器Dlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//用于繪制的設(shè)備上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0); //使圖標(biāo)在工作區(qū)矩形中居中 intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //繪制圖標(biāo) dc.DrawIcon(x,y,m_hIcon); } else { CDialogEx::OnPaint(); }}//當(dāng)用戶拖動最小化窗口時系統(tǒng)調(diào)用此函數(shù)取得光標(biāo)//顯示。HCURSORC服務(wù)器Dlg::OnQueryDragIcon(){ returnstatic_cast<HCURSOR>(m_hIcon);}//服務(wù)器線程UINTthread(LPVOIDp){ charbuff[100];//定義長度為100的字符數(shù)組用來容納輸入框輸入的內(nèi)容 CSizesize; size.cx=0; size.cy=30;//初始化信息顯示框的輸出位置 ints=1,msgcount,loop=1,flag=0; C服務(wù)器Dlg*dlg=(C服務(wù)器Dlg*)AfxGetApp()->GetMainWnd(); msgcount=dlg->getcount();//獲得客戶端數(shù)量 if(msgcount==-1) loop=0; if(loop) { s=1; dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen)); if(dlg->msgsock[msgcount]==INVALID_SOCKET) { dlg->m_edit1.SetWindowText("Erroraccept"); } else { AfxBeginThread(thread,0);//啟動線程 dlg->SetForegroundWindow();//激活信息窗口 dlg->m_list.InsertItem(dlg->count++,"連接成功"); dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));//連接成功之后在信息框顯示客戶端的IP dlg->m_list.Scroll(size); dlg->m_button.EnableWindow(TRUE);//允許輸入框操作 while(s!=SOCKET_ERROR) { //循環(huán)接收數(shù)據(jù) s=recv(dlg->msgsock[msgcount],buff,100,0); dlg->SetForegroundWindow(); if(s!=SOCKET_ERROR) { dlg->m_list.InsertItem(dlg->count++,buff);//換行后插入新信息 dlg->m_list.Scroll(size); dlg->sendtoall(dlg->msgsock[msgcount],buff); } } send(dlg->msgsock[msgcount],"Disconnected",100,0); dlg->m_list.InsertItem(dlg->count++,"Disconnected"); dlg->m_list.Scroll(size); dlg->msgsock[msgcount]=NULL; for(inti=0;i<50;i++) if(dlg->msgsock[i]!=NULL) flag=1; if(flag!=1) dlg->m_button.EnableWindow(FALSE); closesocket(dlg->msgsock[msgcount]); } } //終止線程 AfxEndThread(0); return0;}//發(fā)送數(shù)據(jù)voidC服務(wù)器Dlg::OnBnClickedButton1(){ //TODO:在此添加控件通知處理程序代碼 /////////gettime/////////////////////////////////CTimet=CTime::GetCurrentTime();//獲取當(dāng)前電腦時間CStringstr; str.Format("(%d-%d-%d",t.GetYear(),t.GetMonth(),t.GetDay());//時間格式str+=t.Format("%H:%M:%S)"); char*time1; time1=(LPSTR)(LPCTSTR)str;//將時間轉(zhuǎn)換為字符型 charallsend[200]; charinmessage[100]; m_edit2.GetWindowText(allsend,200);//讀取用戶名 strcat(allsend,":"); m_edit1.GetWindowText(inmessage,100);//讀取輸入框內(nèi)容 strcat(allsend,inmessage); strcat(allsend,time1); m_edit1.SetWindowText(""); m_list.InsertItem(count++,allsend);//新一行顯示的位置 CSizesize; size.cx=0; size.cy=30; m_list.Scroll(size); if(*inmessage==NULL)//不允許發(fā)送空消息 { AfxMessageBox("發(fā)送消息不可以為空"); return; }else { //循環(huán)向所有客戶發(fā)送信息 for(inti=0;i<50;i++) { if(msgsock[i]!=NULL) { send(msgsock[i],allsend,100,0); } } }}C服務(wù)器Dlg::~C服務(wù)器Dlg(){ for(inti
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《安全感悟分享》課件
- 《職業(yè)適應(yīng)與發(fā)展》課件
- 《生產(chǎn)安全事故應(yīng)急》課件
- 2024教師發(fā)言稿(34篇)
- 藝術(shù)與人生和社會的關(guān)系
- 單位管理制度匯編大全【人事管理】
- 單位管理制度分享合集【人員管理篇】十篇
- 單位管理制度分享大合集【人員管理】十篇
- 單位管理制度范文大合集【員工管理篇】十篇
- 單位管理制度呈現(xiàn)大全【人員管理】
- TSG-T7001-2023電梯監(jiān)督檢驗(yàn)和定期檢驗(yàn)規(guī)則宣貫解讀
- 河南省平頂山市魯山縣2023-2024學(xué)年二年級上學(xué)期期末語文試卷
- 中原文化(歷史篇)智慧樹知到期末考試答案2024年
- 金蝶軟件旗艦版月底結(jié)賬作業(yè)流程操作
- (正式版)JBT 14762-2024 電動摩托車和電動輕便摩托車用閥控式鉛酸蓄電池
- 勞動教育智慧樹知到期末考試答案2024年
- 大疆慧飛無人機(jī)考試題庫附有答案
- 初中歷史統(tǒng)編九年級材料論述題觀點(diǎn)整合(世界史)【學(xué)案】
- 2023-2024學(xué)年宜賓市數(shù)學(xué)九年級上冊期末考試試題(含解析)
- 熱電廠檢修方案
- 2024年江蘇省高中學(xué)業(yè)水平考試合格考生物試卷試題(含答案詳解)
評論
0/150
提交評論