Time of Update: 2018-12-05
將一個項目由vc6轉到vc7下面,ON_NOTIFY的NMTOOLBAR老是提示錯誤,找了老半天,才找到以下一遍文章,自己留為備用。。vc6->vc7 (NMTOOLBAR->NMHDR)void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)vc7:error C2440: “static_cast” : 無法從“void (__thiscall CMainFrame::* )(NMTOOLBARA
Time of Update: 2018-12-05
擷取檔案表徵圖的方法:1、通過檔案路徑,擷取關聯的表徵圖.並顯示在對話方塊上..SHFILEINFO m_sfi;memset(&m_sfi,0,sizeof(SHFILEINFO));SHGetFileInfo( m_strPath ,0 ,&m_sfi,size(SHFILEINFO),SHGFI_ICON|SHGFI_LARGEICON);CStatic* pStatic = (CStatic*) GetDlgItem(IDC_STATIC); HICON hIcon=m_
Time of Update: 2018-12-05
在某個同事留下的網路作業碼中,如果使用者試圖從網路開啟一個實際並不存在的URL, 走到InternetOpenUrl這步,應用程式就一命嗚呼了。這個API並沒有按照文檔上說的那樣返回一個NULL給檔案HANDLE,而是完全停止回應。他嘗試使用InternetSetOption來設定逾時的時限,代碼裡這樣寫DWORD n = 10000;InternetSetOption(p->Internet, INTERNET_OPTION_CONNECT_TIMEOUT, &n,
Time of Update: 2018-12-05
以前還真沒在上面較過真,結果今天就被鄙視了,特地記下來。先看程式:int main(){int a = -6;unsigned int b = 4;if(a+b > 0)printf("a+b>0\n");//這句話被列印elseprintf("a+b<0\n");int z = a+b;if(z > 0)printf("z>0");elseprintf("z<0");//這句話被列印}下面解釋一下原因:當int和unsigned
Time of Update: 2018-12-05
靜態庫函數和資料被編譯進一個二進位檔案(.LIB)。在使用靜態庫下,在編譯串連可執行檔時,連結器從庫中複製這些函數和資料,並把它們和應用程式的其他模組組合起來建立最終的可執行檔(.EXE)。當產品發布時,只需要發布可執行檔,不需要發布使用的靜態庫。它的特點在於:1.編譯後的可執行檔包含了所需要的函數的代碼,佔用磁碟空間較大。(但是可以避免出現使用者的電腦上沒有你開發時所用的庫的尷尬情形。)2.如果多個調用相同庫的進程在記憶體中同時運行,記憶體中會存放多份相同的代碼。動態庫在使用動態庫的時候,往往
Time of Update: 2018-12-05
l1s is line 1 start, l1f is line 1 finish, the rest goes accordingly.bool vec2LinesIntersect ( Vector2 l1s, Vector2 l1f, Vector2 l2s, Vector2 l2f ){ Vector2 v1 = l1f - l1s; Vector2 v2 = l2s - l1s;Vector2 v3 = l2f - l1s; Real crossProd1 =
Time of Update: 2018-12-05
我們只介紹幾種簡單的處理序間通訊機制:剪下板、匿名管道、具名管道、匿名管道和油槽。平時大家都用過剪下板,比如選中記事本上的一段文字,然後Ctrl+C複製到剪下板上,然後在word中按下Ctrl+V,將其複製。這其實完成了兩個進程之間的通訊:從記事本到word。實際上,剪下板是系統維護管理的一段記憶體地區,當在一個進程中複製資料時,是將資料複製到這個記憶體地區,而在另一個進程中粘貼資料時,是從這個記憶體地區中取出資料,然後顯示在視窗上。下面我們寫一個樣本程式來實現剪下板的功能。首先是程式的外觀:一
Time of Update: 2018-12-05
這一章主要講的是運算子與運算式,裡面還是有些值得注意的,首先是當運算子的左右運算元類型不同時,會發生隱式的類型轉換,轉換時會把較低的類型提高為較高的類型。但也有特例:float不會自動提升為double。當參與運算的兩個數一個是sigined 另一個是unsigned時,就比較麻煩了,雖然我們都聽過整型提升:int a = -1;unsigned int b = 1;if(a >
Time of Update: 2018-12-05
float f = 1.3f;那麼它是如何儲存在32電腦中的呢?我們知道一個float佔4個位元組,也就是32位。且intel處理器是小端的。低位在高位元組,高位在低位元組。為了討論方便,我們先求出1.3對應的浮點數的32bit的表示,然後再調換位元組的順序。首先,將1.3轉化為2進位:整數位就是正常求法,對於小數位,則是*2,如果大於1為1,小於1為0:1.010011001100110011001100110011……後面省略不寫了。其次,將其轉化為以2為底的“科學計數法”:1.010011
Time of Update: 2018-12-05
位元組序有兩種:小端位元組序:低位元組在低地址中,高位元組在高地址中。這種位元組序又稱為主機位元組序,intel的cpu使用的就是這種位元組序。大端位元組序:低位元組在高地址中,高位元組在低地址中。這種位元組序又稱為網路位元組序,socket傳輸時就需要使用這種位元組序。假設我們的32位整數0x12345678是從起始位置為0x00的地址開始存放,則://0x000x010x020x03 //78563412(小端)//12345678(大端)因此,我們可以這樣判斷:int
Time of Update: 2018-12-05
全面系統的講解函數了。首先映入我眼帘的是一種奇怪的函式宣告方式:main(){double sum, atof(char []);//函式宣告char line[MAXLINE];int getline(char line[], int max);sum = 0;while (getline(line, MAXLINE) > 0)printf("\t%g\n", sum += atof(line));return 0;}它在main函數中聲明了自己編寫的atof(char
Time of Update: 2018-12-05
首先,菜單是一種資源,在資源檢視中,我們可以找到預設的單文檔應用程式的菜單。然後還有一些概念性的東西需要交代清楚:整個菜單上的那些“檔案”、“編輯”、“查看”等等內容,稱為“頂層菜單”,雙擊它們,你會發現它們沒有ID,而且它們是“彈出”的,它們不能響應命令;而點擊子功能表的“開啟”、“建立”等內容,可以響應命令這些內容稱為功能表項目。我們發現,不論是建立的菜單,還是子功能表,在最後總有一個虛線框起來的空位置,雙擊它,就能以所見即所得 (WYSIWYG)的方式增加它們。你也可以在已有的菜單上雙擊,
Time of Update: 2018-12-05
const與指標結合const與指標結合有兩種情況:一個常指標:指向不能變;指向常對象的指標:可以指向其他的變數,但這些變數必須是const類型。怎麼區別它們呢?const在*左邊,則是一個指向常對象的指標,而const在*的右邊,則是指標的指向不能變。舉個例子:int a = 10;int b = 5;const int *pa = &a;//(*pa) = 10;指標指向的對象是常量,不能通過指標修改對象int * const pb = &b;//pb =
Time of Update: 2018-12-05
對於函數的預設實參,我們一般都是放在函數的聲明中的,而在定義中並不指定預設實參:在標頭檔中聲明函數://test.hvoid func(int i = 0);而在對應的源檔案中實現函數://test.cppvoid func(int
Time of Update: 2018-12-05
先看代碼:class Student{public:Student(int i, string nm):schoolNumber(i),name(nm){}void getInfo()const{cout<<"name: "<<name<<endl<<"SchoolNumber: "<<schoolNumber<<endl;}void setInfo(string nm, int id){name =
Time of Update: 2018-12-05
什麼是HOOK編程?這得從Windows訊息機制說起:當在應用程式視窗內點擊滑鼠左鍵時,作業系統會感知這一事件,然後把訊息放到應用程式的訊息響應隊列中,應用程式通過GetMessage讀取訊息,然後通過DispatchMessage將訊息調度給作業系統,作業系統會調用在設計視窗類別時指定的應用程式視窗過程函數對訊息進行處理。假如我們希望對某個特殊的訊息進行屏蔽,比如希望這個應用程式不響應斷行符號和空格訊息,就需要截獲所有訊息,然後進行判斷,如果是這兩種訊息,則將它們屏蔽掉。為了實現這個功能,我們
Time of Update: 2018-12-05
其實這一部分的內容本該是放在網路編程之前的。但是由於網路編程比較重要就先看了。所謂的文檔序列化,解決的是這麼一類問題:對於記憶體中的變數,當程式結束時就會消失,我們有沒有辦法把它們的結果記錄在硬碟上,當程式結束,我們重新啟動程式時,有沒有辦法重新載入這些儲存在硬碟上的對象呢?我們首先考慮的是CFile對象。但是,因為CFile在讀寫時始終要求的是字串buffer,相對比較麻煩,MFC為我們提供了一個更簡單的類CArchive來實現檔案的讀寫。使用CArchive對象時需要注意的是:1.這個對象必
Time of Update: 2018-12-05
這一章講控制流程,基本就是if-else、while、do-while、switch-case之類的。基本的東西大家都懂。需要強調的是在預設狀態下,if-else語句中的else是與之前最近的if匹配的,所以如果這不是你的本意,那麼最好加上大括弧括起來。其實我幾乎不會犯這個錯誤,因為我寫程式時,習慣於即便if後面只有一條語句,我也會打上括弧(這個習慣好像是看C++primer上養成的)。書中給出了一個shell排序演算法的程式void shellsort(int V[], int n){int
Time of Update: 2018-12-05
這一條款也被稱作:寧可用編譯器替換前置處理器。從以下幾方面說明:(最開始的那一段似乎跟編譯原理有關,我是不懂的,就不說了):對於一般用#defined定義的常量,可以使用const類型代替。但是要注意兩種特殊情況:假如我們要在標頭檔中定義一個不能被修改的字串,那麼需要使用const char* const類型的指標:char a = 'A';char b = 'B';char* const pa1 = &b;//pa1 = &a;表明指標的指向不能變*pa1 =
Time of Update: 2018-12-05
考慮到內容的連貫性,我對幾乎重寫了這篇部落格,在這一小節,主要介紹線程以及線程間的同步,而把那個聊天工具放到下一節。什麼是程式?程式是計算計指令的集合,它以檔案的形式儲存在磁碟上。什麼是進程?進程是一個正在啟動並執行程式的執行個體,是一個程式在其自身的地址空間內中的一次執行活動。因此,一個程式可以對應多個進程,比如我們可以把自己編寫的簡單的“hello, world”程式執行很多遍。進程是資源申請、調度很啟動並執行基本單位,因此:#include <stdio.h>int a = 0