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

正文內(nèi)容

用c語言寫聊天工具,類似于qq(編輯修改稿)

2025-06-13 13:53 本頁面
 

【文章內(nèi)容簡介】 ,窗口上有圖片、按鈕、文字等等,這些都是程序的部分,這樣就是程序的資源。程序沒有進(jìn)入內(nèi)存運(yùn)行的時(shí)候,我們就叫它可執(zhí)行文件吧,在磁盤保存的時(shí)候,并不只是保存了程序運(yùn)行的代碼部分(即cpu指令部分),還有一些圖片、字符、按鈕、圖標(biāo)并不是在代碼段的??蓤?zhí)行文件的大致機(jī)構(gòu)如下圖一個(gè)可執(zhí)行文件是很復(fù)雜的,這里就簡單的畫這么一個(gè)難看的圖,知道資源所在的大概位置,能理解程序的執(zhí)行部分和知道程序的圖標(biāo)是從哪來的就可以了。今天我們只是修改鼠標(biāo)的指針,所以用到的資源,只有鼠標(biāo)的光標(biāo)資源而已。資源的源文件是以rc為擴(kuò)展名的腳本文件(仍然是C語言格式的,很簡單),最后用連接器,把res文件和obj文件連接到一起就成了我們的程序exe文件了,現(xiàn)在知道了程序編譯后要連接了吧。光標(biāo)的圖片格式有兩中cur和ani的。這個(gè)文件我在魔域的圖片庫里面找到了就復(fù)制到,當(dāng)前項(xiàng)目目錄下。// written by xhk include //資源文件要用到的圖文件define CUR 0x1000 //定義資源的ID,為整型idCUR CURSOR //用到的光標(biāo)圖案寫完后,在命令提示符下進(jìn)入目錄,輸入rc ,回車,就是編譯生成的二進(jìn)制資源件。接下來就該編寫代碼了,來應(yīng)用這個(gè)資源文件,其實(shí)代碼和上節(jié)所寫代碼很相似的,只是稍微加以修改而已。include define CUR 0x1000 //預(yù)定義光標(biāo)的id//回調(diào)函數(shù)LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam){ switch(Msg)//處理消息過程,什么是消息,下節(jié)再講 { case WM_DESTROY://響應(yīng)鼠標(biāo)單擊關(guān)閉按鈕事件 PostQuitMessage(0)。//退出消息隊(duì)列,至于什么是消息隊(duì)列,下節(jié)說 return 0。//退出函數(shù) } return DefWindowProc(hWnd,Msg,wParam,lParam)。}//主函數(shù)int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){ char *cName = myWindow。 WNDCLASSEX wc。 HWND hWnd。 MSG Msg。 = 0。 = 0。 = sizeof(WNDCLASSEX)。 = (HBRUSH)GetStockObject(WHITE_BRUSH)。//通過函數(shù)來設(shè)置一個(gè)白色的背景,這里大家設(shè)置為NULL看看,會(huì)很有趣的 = LoadCursor(hInstance,MAKEINTRESOURCE(CUR))。//這里改了,來載入光標(biāo)資源 = NULL。//不設(shè)置 = NULL。//不設(shè)置 = hInstance。//當(dāng)前程序的句柄,hInstance是有系統(tǒng)給傳遞的 = WinProc。//窗口處理過程的回調(diào)函數(shù)。 =(LPSTR)cName。//窗口類的名字。 = NULL。//目錄名,不設(shè)置 = CS_HREDRAW | CS_VREDRAW。 RegisterClassEx(amp。wc)。//在系統(tǒng)中注冊(cè) hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,cName,我的窗口我喜歡,WS_OVERLAPPEDWINDOW, 200,100,600,400,NULL,NULL,hInstance,NULL)。//創(chuàng)建窗口,窗口標(biāo)題為我的窗口我喜歡 if(hWnd == NULL) {//容錯(cuò)處理 MessageBox(NULL,There39。s an Error,Error Title,MB_ICONEXCLAMATION|MB_OK)。 return 0。 } ShowWindow(hWnd,nShowCmd)。//顯示窗口 UpdateWindow(hWnd)。 //下面是對(duì)消息的循環(huán)處理,大家先不必管這些,下節(jié)課我會(huì)細(xì)說的 while(GetMessage(amp。Msg,NULL,0,0)) { TranslateMessage(amp。Msg)。//翻譯消息 DispatchMessage(amp。Msg)。//分派消息 } return 。},,然后在命令行下進(jìn)入它們所在的目錄 ,輸入命令:linke /subsystem:windows ??吹搅税桑?dāng)鼠標(biāo)移入窗口的時(shí)候,光標(biāo)就變成了那個(gè)手型圖案了, 這和魔域的是一樣的。到現(xiàn)在想想一個(gè)特效又咋地,不還是一句一句代碼寫出來的,而特效和普通程序往往只有數(shù)據(jù)代碼不同而已。網(wǎng)絡(luò)游戲的界面很好看,也只不過是資源文件用的比較多而已,而且計(jì)算量很大,所以網(wǎng)游總是很占內(nèi)存的,因?yàn)閳D片、聲音文件都很大,而且變換比較多、快,就比較占用資源了。其實(shí)再好的程序,只要有了思路,就能寫出來,而且寫出來也難的,是不是,今天大家應(yīng)該會(huì)有點(diǎn)收獲了,都會(huì)設(shè)計(jì)個(gè)性的鼠標(biāo)光標(biāo)了,比起以前學(xué)習(xí)C的東西,應(yīng)該有一種層次感了吧。這些東西都比較接近系統(tǒng)了,所以學(xué)了之后,你對(duì)Windows系統(tǒng)也會(huì)有很深的了解的。如果各位看官看到本節(jié)還有興趣繼續(xù)看下去,那么這對(duì)小人就是一種支持,小人在此謝過了;如果看官覺得看這些沒有半點(diǎn)收獲,那么請(qǐng)看官不要再勉強(qiáng)自己看下去了,免得浪費(fèi)看官大人的寶貴時(shí)間,那是小人所承擔(dān)不起的。總之了,要想寫好程序,就得多練,編譯連接過程中很容易發(fā)現(xiàn)錯(cuò)誤的所在,那么這時(shí)你解決一個(gè)錯(cuò)誤你就提高一次,解決的錯(cuò)誤越多越快,你就學(xué)的越多越快。終于后來你會(huì)發(fā)現(xiàn),你太難找到錯(cuò)誤了,那么恭喜你,你已經(jīng)升級(jí)為大蝦了,已經(jīng)完全脫離了菜菜級(jí)了。希望大家繼續(xù)努力! 在窗口上寫上“Hello World”這一節(jié)我們乘勝追擊,來繼續(xù)深入學(xué)習(xí)下,學(xué)習(xí)窗口處理時(shí)間的東東。 也許你以前聽說過,windows系統(tǒng)是消息驅(qū)動(dòng)的,可是可能根本就不知道什么消息,更不知道什么消息驅(qū)動(dòng)了。其實(shí)什么是消息呢,說白了就是我們點(diǎn)鼠標(biāo)擊鍵盤而程序發(fā)生反應(yīng),消息是一種數(shù)據(jù),就是我們點(diǎn)鼠標(biāo)擊鍵盤后,系統(tǒng)把我們的操作封裝到數(shù)據(jù)中,然后發(fā)送給程序,讓程序?qū)ξ覀凕c(diǎn)鼠標(biāo)擊鍵盤的動(dòng)作做出反應(yīng),當(dāng)然程序也可以置之不理。Windows可是一個(gè)多任務(wù)的系統(tǒng),而且同時(shí)可能產(chǎn)生很多的擊鍵動(dòng)作,那么同時(shí)可能能會(huì)有很多消息,windows系統(tǒng)為了更好的管理維護(hù)這些消息,就把這些消息加入消息隊(duì)列中,消息隊(duì)列其實(shí)就是消息的集合。學(xué)過VB的人知道,VB中的程序是事件驅(qū)動(dòng)的,因?yàn)橐话愣际前l(fā)生時(shí),調(diào)用相應(yīng)的事件處理函數(shù),所以整個(gè)處理過程都好像是事件引發(fā)的一樣。這里的事件就是指我們擊鍵的動(dòng)作等。學(xué)過JAVA的人知道,JAVA中有事件適配器,來捕獲相應(yīng)的事件,并交給相應(yīng)的處理方法進(jìn)行處理。其實(shí)三種語言的處理過程也都是大同小異,只不過JAVA和VB把這些處理過程給封裝了,VB尤其封裝的更厲害,所以編程者不必考慮和知道這中間的細(xì)節(jié)問題,仍然可以編寫出實(shí)用的程序,但正是由于細(xì)節(jié)的原因,用VB的開發(fā)的程序并不能高效地處理問題。而C語言本身就是面向過程的語言,所以這一過程可以用C語言更好地表現(xiàn)出來,這也是我用C而不用C++的原因之一。通過前幾節(jié)的學(xué)習(xí),我們知道了,在窗口程序中都有一個(gè)處理窗口的函數(shù),其實(shí)所有的消息將會(huì)得到怎樣的處理,都是此函數(shù)安排的?,F(xiàn)在大家再回去看看那個(gè)程序代碼和注釋,相信應(yīng)該能明白些了吧。系統(tǒng)產(chǎn)生的消息是不斷的,但是中間是有間隔的,程序要想知道有沒有自己的消息,得不停地去問系統(tǒng),問系統(tǒng)當(dāng)前有沒有屬于自己的消息,這就需要一個(gè)循環(huán)來實(shí)現(xiàn)了。下面先看下前兩節(jié)種用到的消息循環(huán)代碼: while(GetMessage(amp。Msg,NULL,0,0)) { TranslateMessage(amp。Msg)。//翻譯消息 DispatchMessage(amp。Msg)。//分派消息 }Windows為消息定義一種新的數(shù)據(jù)類型MSG,用于保存消息的相關(guān)信息。在windows中GetMessage函數(shù)從消息隊(duì)列種取得消息,填寫好MSG結(jié)構(gòu)并返回,如果獲取的消息是WM_QUIT消息,則退出循環(huán)。TranslateMessage將MSG結(jié)構(gòu)傳給Windows進(jìn)行一些鍵盤消息的轉(zhuǎn)換,當(dāng)有鍵盤按下或者放開時(shí),Windows產(chǎn)生WM_KEYDOWN和WM_KEYUP或WM_SYSKEYDOWN和WM_SYSKEYUP消息(像WM_KEYDOWN這些都是微軟定義的一些宏,是什么意思,看字面意思就可以知道了),但是這些消息的參數(shù)種包含的是按鍵的掃描碼(暫時(shí)不用理會(huì)),轉(zhuǎn)換成常用的ASCII碼要經(jīng)過查表,很不方便,TranslatMessage遇到鍵盤消息則將掃描碼轉(zhuǎn)換成ASCII碼并在消息隊(duì)列種插入WM_CHAR或WM_SYSCHAR消息,參數(shù)就是轉(zhuǎn)換好的ASCII碼,如此一來,要處理鍵盤消息的話只要是處理WM_CHAR消息就好了。菊與刀非鍵盤消息TranslateMessage則不做處理。最后,由DispatchMessage將消息發(fā)送到窗口對(duì)應(yīng)的窗口過程去處理。窗口過程返回后DispatchMessage函數(shù)才返回,然后開始新一輪的消息循環(huán)。想想我們這節(jié)的目的是為了在潔白的窗口種寫下“Hello World”,那么我們?cè)趺磥砹粝挛覀兊墓P跡呢?窗口我們是能做出來了,那么怎么在上面寫東西呢,等等,在上面寫東西的前提是不是窗口做出來之后,當(dāng)初我是這么想的,后來看到別人的代碼才知道原來可以在窗口繪制的過程就繪制“Hello world”了。Windows有時(shí)真是個(gè)細(xì)心的家伙,把窗口創(chuàng)建到顯示的一瞬間又給劃分了很多小的過程。在繪制窗口時(shí),Windows會(huì)產(chǎn)生WM_PAINT消息,那么我們?cè)诘玫竭@個(gè)個(gè)消息的時(shí)候,來留下我們的筆跡,豈不就是下手最早的時(shí)刻。其實(shí)Windows在屏幕上輸出文字和圖像是一樣的,都是在屏幕上畫,和我們?cè)诩埳袭媹D和寫字是一樣的,都是用筆來畫的,只不過用的筆不一樣而已,如果牽強(qiáng)用一支筆去做所有的工作,效果并不會(huì)理想的。Windows的筆也是這樣的,不過這些筆是函數(shù)而已,畫圖和畫文字的函數(shù)不一樣而已。下面就接著上節(jié)修改的代碼繼續(xù)修改,必要的注釋和改變的地方我會(huì)標(biāo)明的include define CUR 0x1000 //預(yù)定義光標(biāo)的idHDC hDC。//HDC是指設(shè)備上下文(暫時(shí)不用管,只要能這樣用就可以了)的句柄//PAINTSTRUCT要繪制的信息,詳情請(qǐng)登陸().aspx//了解下就可以了,沒什么重要的東西PAINTSTRUCT paint。RECT rect。//RECT用來存儲(chǔ)窗口信息的結(jié)構(gòu),只要是窗口的坐標(biāo)、寬度和高度。//回調(diào)函數(shù)LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam){ switch(Msg)//處理消息過程,什么是消息,下節(jié)再講 { case WM_PAINT: //BginPaint做些繪畫的開始工作,填充PAINSTURCT結(jié)構(gòu),返回設(shè)備上下文(暫時(shí)不用理解)句柄 hDC=BeginPaint(hWnd,amp。paint)。 //GetClientRect用來獲取窗口所在客戶區(qū)的位置大小信息 GetClientRect(hWnd,amp。rect)。 //DrawText就是Windows用來“畫字”的筆了,DT_*之類是指文字的樣式,看字面意思也能看懂的 //有多少樣式呢,可以查看這里 //本例中是單線、水平居中和豎直居中。 DrawText(hDC,Hello World!,1,amp。rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER)。 //EndPaint就是做些收尾的工作了。 EndPaint(hWnd,amp。paint)。 break。 case WM_DESTROY://響應(yīng)鼠標(biāo)單擊關(guān)閉按鈕事件 PostQuitMessage(0)。//退出消息隊(duì)列,至于什么是消息隊(duì)列,下節(jié)說 return 0。//退出函數(shù) } return DefWindowProc(hWnd,Msg,wParam,lParam)。}//主函數(shù)int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){ char *cName = myWindow。 WNDCLASSEX wc。 HWND hWnd。 MSG Msg。 = 0。 = 0。 = sizeof(WNDCLASSEX)。 = (HBRUSH)GetStockObject(WHITE_BRUSH)。//通過函數(shù)來設(shè)置一個(gè)白色的背景,這里大家設(shè)置為NULL看看,會(huì)很有趣的 = LoadCursor(hInstance,MAKEINTRESOURCE(CUR))。//這里改了,來載入光標(biāo)資源 = NULL。//不設(shè)置 = NULL。//不設(shè)置 = hInstance。//當(dāng)前程序的句柄,hInstance是有系統(tǒng)給傳遞的 = WinProc。//窗口處理過程的回調(diào)函數(shù)。 =(LPSTR)cName。//窗口類的名字。
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1