MFC函数简单解释(更新至28日凌晨)
以該博文http://blog.csdn.net/column/details/megogame.html 為基礎,涉及到的每個都盡量解釋和說明其用法。
以下是流程圖,由于太大,請嘗試右鍵另存為查看。關于函數請跳過圖的部分繼續往下看
————————————————————————
函數或命令:
?
所屬類:
?
原型:
?
說明:
?
參考鏈接:
?
————————————————————————
函數或命令:
DC
所屬類:
?
原型:
?
說明:
device?context,叫設備環境或者設備描述表,是GDI(圖形設備接口)內部保存數據的一種數據結構。此結構中的屬性內容和特定的輸出設備(顯示器、打印機等)相關,屬性定義了GDI函數的工作細節。
總之,要使用GDI繪圖函數,就需要一個DC句柄。
MFC中把和DC相關的都封裝成類。CDC是一個抽象基類,可以訪問整個顯示器和打印機等,CClientDC類和窗口客戶區關聯,能用于顯示客戶區相關內容。
?
DC:?Device?Context,中文也叫設備上下文,通俗的理解叫窗口顯示描述設備也行;?CDC:?MFC中封裝了操作系統窗口輸出底層API的封裝類,如CDC的派生類CClientDC,用于窗口客戶區域的輸出。?
HDC:?VC++開發環境中的DC句柄類型,32比特的無符號整數類型,用來標識DC設備的句柄。?
設備上下文:看上面解釋的第一行。
?
在GDI中,DC(Device?context)是一個非常重要的概念。
?
有的書中,將DC翻譯為設備描述表(《Windows?程序設計?第五版》作者Charles?Petzold),
?
也有的書將DC翻譯為設備上下文。
?
到底什么是DC?
?
用現實中的例子來理解可能更容易些。
?
如果你喜歡畫畫,你得先準備了畫布,畫筆,顏料……
?
畫畫的環境搭建好了,你就可以畫畫了。
?
這個畫畫的環境,就是DC。
?
在圖形環境下,一切都是畫出來的,所以,你要準備好一個DC,才能在屏幕上畫畫。——寫字也是畫畫。
?
在畫畫的環境中,有哪些對象呢?
?
畫布——GDI對象之一:區域
?
畫筆——GDI對象之一:畫筆
?
顏料盒——GDI對象之一:調色板
?
如果要在畫筆上寫字的話,寫什么樣的字體呢?方正字體?徐靜蕾字體?——字體也是GDI對象之一。
?
有的畫筆比較粗,專用來刷大面積背景色的,這是刷子——GDI對象之一:刷子
?
如果你不想畫了,只想把別人畫好的畫,貼到你的畫布上,這也是可以的。——GDI對象之一:位圖。
?
所以,這里就有6種GDI對象可以用于DC。
?
現在開始畫畫了,你拿起了一只筆?!赪indows環境里,這叫選擇了一個畫筆對象:使用SelectOBject函數。當然,如果你沒帶筆也沒關系,Windows為你準備了幾只畫筆,你可以這樣申請系統提供的缺省畫筆:hPen?=?GetStockObject(WHITE_PEN);
?
如果你畫著畫著,覺得手中的筆用著不爽,可以換一只啊,沒關系的。——依舊是SelectObject()換筆。
?
當然,如果你走出了畫室,別完了把你的畫筆清除掉,要不畫室里全是筆啊,刷子啊,太亂了?!狣eleteObject()
參考鏈接:
http://wenda.so.com/q/1378648861067082?src=140
http://wenda.so.com/q/1365013199066107
?
?
————————————————————————
函數或命令:
CDC
所屬類:
?
原型:
?
說明:
①cdc相當于畫布,你可以使用筆、刷、位圖、字體等在畫筆上畫圖,就這么簡單
②是 HDC的封裝類???可以理解成這是一個?“畫家”???你可以給畫家準備好筆、刷子、位圖等等東西?畫的時候只要告訴畫家畫什么就行了??它會用你給的裝備開始繪畫...
?
參考鏈接:
http://bbs.csdn.net/topics/390636858?page=1
?
?
————————————————————————
函數或命令:
CDC?m_cacheDC;
所屬類:
CDC
原型:
?
說明:
聲明一個CDC對象。
CDC類定義的是設備上下文對象的類。
CDC對象提供處理顯示器、或打印機等設備上下文的成員函數,以及處理對象與窗口客戶區對應的顯示上下文的成員。
通過CDC對象的成員函數進行所有的繪圖。
?
| 類名 | 說明 |
| CClientDC | 窗口客戶區的設備描述環境,但應用在WM_PAINT消息之外的消息處理函數中 |
| CMetaFileDC | 圖元文件的設備描述環境,在創建可以回放的圖像時使用 |
| CPaintDC | 窗口用戶區的設備描述環境,在OnDraw()函數中來處理WM_PAINT消息 |
| CWindowDC | 在整個窗口內(不只是用戶區)繪圖的設備描述環境 |
?
專門用于在應用程序窗口客戶區繪圖的CPaintDC,是所有CDC子類中最常用的一個類。為了防止程序設計人員誤把繪圖代碼寫到其他位置,MFC規定,CPaintDC對象只在CView類(不過好像在windows的MFC里面,是CChildView類)的OnDraw()函數中有效。
?
系統每次創建應用程序窗口,及窗口需要刷新時,就會產生WM_PAINT消息,系統接收到這個消息就會自動調用OnDraw()函數。應用程序也可以調用相關函數來激活OnDraw(),因此程序中所有對窗口客戶區進行繪圖的代碼,都應該寫再這個函數中(指OnDraw())。
?
參考鏈接:
http://blog.csdn.net/cto_51/article/details/8828088
http://blog.csdn.net/akof1314/article/details/5439866(內含大量CDC成員及其作用說明)
?
————————————————————————
函數或命令:
WM_PAINT
所屬類:
?
原型:
?
說明:
應用程序通過處理該消息,來實現在窗口上的繪制工作。
(1)系統何時發送WM_PAINT消息?
①第一次創建一個窗口時;
②改變窗口大小時;
③當把窗口從另一個窗口背后移出時;
④當最大化或者最小化窗口時;
⑤其他。
這些動作由系統管理,應用只是被動的接受該消息,在消息處理函數中進行繪制操作,大多數的時候應用也需要能夠主動引發窗口動作中的繪制操作,比如當窗口顯示的數據改變的時候,這一般是通過InvalidateRect?和?InvalidateRgn函數來完成的。
?
參考鏈接:
http://blog.sina.com.cn/s/blog_5344089201009whk.html
?
————————————————————————
函數或命令:
m_bg.CreateCompatibleDC(NULL);
所屬類:
CDC
原型:
?
說明:
創建一個兼容的DC。他的參數是*CDC類型的,即是一個DC的指針,函數會繪制一個與參數提供的DC相兼容的DC。
如果參數為NULL,函數會自動創建和當前程序DC兼容的內存DC。
| 說明 | |
| 創建一個與特定設備場景一致的內存設備場景 | |
| 返回值 | |
| Long,新設備場景句柄,若出錯則為零 | |
| 參數表 | |
| 參數 | 類型及說明 |
| hdc | Long,設備場景句柄。新的設備場景將與它一致。也可能為0以創建一個與屏幕一致的設備場景 |
| 注解 | |
| 在繪制之前,先要為該設備場景選定一個位圖。不再需要時,該設備場景可用DeleteDC函數刪除。刪除前,其所有對象應回復初始狀態 | |
BitBlt(?//圖形拷貝
HMDC0,?//目標設備場景
x0,?y0?//目標左上角坐標
w,?h?//目標圖形寬、高
HMDC1,?//源設備場景
x1,?y1?//源左上角坐標
SRCCOPY?//拷貝方式,這里是直接拷貝
);
?
?
參考鏈接:
http://blog.csdn.net/ghevinn/article/details/28641219
?
————————————————————————
函數或命令:
CBitmap?m_bg;
所屬類:
CBitmap
原型:
?
說明:
類CBitmap封裝了Windows?GDI中的位圖,并且提供了操縱位圖的成員函數。
使用CBitmap對象之前,要先構造CBitmap對象,調用其中的一個初始化成員函數設置位圖對象的句柄。此后,就可以調用其他成員函數了。
?
這句命令的意思就是,聲明一個位圖對象(位圖對象名是m_bg),之后可以用CBitmap的成員函數,例如“.LoadBitmap(資源名)”可以用來加載某個資源(資源通過右鍵資源文件—添加—資源—Bitmap?來添加)。
?
參考鏈接:
?
————————————————————————
函數或命令:
m_bg.LoadBitmap(?資源名?)
所屬類:
CBitmap
原型:
.LoadBitmap(?)
說明:
資源名,實際上是資源的ID,在資源視圖下的Bitmap那一欄可以看到。是一個整型(int?id),也可以被修改。
貌似還有一種LoadImage()的方法,不懂。
另外,LoadBitmap()不能加載文件,只能加載資源。LoadImage貌似也是。
?
參考鏈接:
?
?
————————————————————————
函數或命令:
m_cacheBitmap.CreateCompatibleBitmap(cdc,?m_client.Width(),?m_client.Height());
所屬類:
CBitmap
原型:
函數原型:HBITMAP?CreateCompatibleBitmap(HDC?hdc,int?nWidth,int?nHeight);
說明:
該函數創建與指定的設備環境(DC)相兼容的位圖。
cdc是句柄;
m_client.Width()是位圖的寬度(x)
m_client.Height()是位圖的高度(y)
當位圖繪制時:
位圖的尺寸如果比窗口DC(客戶區,也就是繪制圖的區域)小,那么DC有一部分就沒圖。
如果位圖的尺寸比窗口DC大,那么一部分位圖就沒辦法顯示出來。
也就是說,和cdc->BitBlt(0,?0,?m_a.Width(),?m_a.Height(),?&m_cacheDC,?0,?0,?SRCCOPY);相比。
都是顯示一部分圖片。個人發現,影響內存占用的,是在cdc->BitBlt(xxx)這一步。不要覆蓋繪制。例如:
cdc->BitBlt(0,?0,?m_a.Width(),?m_a.Height()/2,?&m_cacheDC,?0,?0,?SRCCOPY);
cdc->BitBlt(0,?m_a.Height()/2,?m_a.Width(),?m_a.Height(),?&m_cacheDC,?0,?0,?SRCCOPY);
實測來看,這2個放一起。第二行第4個參數/2,會少占用一點內存(貌似)。
如果第一行第4個參數不除以2,那么第二行繪制的圖會閃爍(確定)。
但實測來看,每次調試占用的內存量會有浮動(即使沒修改任何程序代碼),不理解。
但具體我還是不是很明白。
附一個我自己寫的理解吧:
m_cacheCBitmap.CreateCompatibleBitmap(cdc,?m_a.Width(),?m_a.Height()/2);
//創建一個位圖,參數1:當前窗口的句柄,參數2:位圖的寬度,參數3:位圖的高度
....
cdc->BitBlt(0,?0,?m_a.Width(),?m_a.Height(),?&m_cacheDC,?0,?0,?SRCCOPY);
//這部分是繪制緩沖區(m_cacheDC)的圖片,寬度和高度是窗口(m_a獲取的是窗口)的寬度和高度
//不過寬度和高度換成更大的貌似也行(但如果更小的話,就繪制的是一部分了,其他就空出來了)
//個人覺得,這個和上面的m_cacheCBitmap.CreateCompatibleBitmap(cdc,?m_a.Width(),?m_a.Height());的區別在于
//這里的是繪制緩沖DC的尺寸,上面的緩沖DC指向的位圖的尺寸。然后在這里,把緩沖DC的位圖(通過&m_cacheDC)繪制在這里,繪制的窗口部分是m_a.Width()寬和m_a.Height()高
//也就是說,先有個位圖(他有一定尺寸),然后把這張位圖繪制在某個DC上,這個DC如果比這個位圖大,那么DC大于位圖的部分是沒法顯示的。如果位圖比DC小,那么位圖大出來的部分也是沒法顯示的。
//推測,如果DC大于位圖,那么DC可以在多出來的部分(設定坐標),再繪制其他位圖。
//如果DC小于位圖,那么DC如果繪制其他位圖的話,就覆蓋了之前的部分了(也就是前者是空的然后填充,后者是有然后覆蓋)
//理解為一張紙(位圖)在一個木板(DC)上的映射。
?
參考鏈接:
http://baike.so.com/doc/6084306-6297408.html
?
————————————————————————
函數或命令:
m_cacheDC.SelectObject?(&m_cacheCBitmap);
所屬類:
CDC
原型:
?
說明:
該函數選擇一對象到指定的(調用該函數的對象)DC中,該新對象替換先前相同類型的對象(如果不相同呢?)
理解為給DC選擇畫筆(畫什么,用什么畫,例如這里就是用位圖對象來繪制)。
?
參考鏈接:
http://wenda.so.com/q/1365013199066107
?
————————————————————————
函數或命令:
m_bg.Draw(m_cacheDC,?m_client);
所屬類:
CImage
原型:
?
說明:
繪制圖片,第一個參數是在哪繪制(CDC類對象m_cacheDC),第二個參數是繪制的相對坐標(CRect類對象,實際上有四個坐標left,?right,?top,?bottom)。
第一個參數也可以用*cdc(假如CDC?*cdc=this->GetDC();的話,cdc指針就是指向當前窗口)
第二個參數是第一個參數(提供的DC對象)的相對坐標。分別是left,?right,?top,?bottom。也就是其上下左右四個坐標的位置(假如和當前窗口的尺寸一樣,那么就和當前窗口一樣大),可以是負數(于是就只能顯示部分),也可以left比窗口的寬還大(于是就在窗口右邊的外面了)。總之,通過控制相對于DC的坐標,控制這張圖出現在哪里。
1.?m_hero.Draw(*cDC,100,400,60,60);??
Draw函數有多個重載類型,這里給出的是最常用的,參數分別表示要繪制的DC,起始x,起始y,寬度,高度。
?
參考鏈接:
?
?
————————————————————————
函數或命令:
cdc->BitBlt(0,?0,?m_a.Width(),?m_a.Height(),?&m_cacheDC,?0,?0,?SRCCOPY);
所屬類:
CDC
原型:
1.?BOOL?BitBlt(????????????
2.?????int?nXDest,???????//目的DC的起始x??
3.?????int?nYDest,???????//起始y??
4.?????int?nWidth,???????//寬度??
5.?????int?nHeight,??????//高度??
6.?????HDC?hdcSrc,???????//源DC??
7.?????int?nXSrc,????????//源DC起始x??
8.?????int?nYSrc,????????//起始y??
9.?????DWORD?dwRop???????//貼圖方式,大家設置為SRCCOPY就可以了??
10.?);??
?
說明:
大概就是說,繪制圖,先定繪制的范圍(前4個參數),
然后繪制的DC(第5個參數),
然后繪制DC的起始坐標(就是說從DC的哪個x、y坐標開始畫圖,例如從1,1開始畫,于是x坐標<1或者是y坐標是<1的DC的那部分就不會顯示了)(第6,7個參數),
最后是貼圖方式(第8個參數),關于第八個參數如下:
dwRop:光柵操作代碼
| ? |
dwRop有如下選擇:
| BLACKNESS???????????使用黑色填充目標區域 DSTINVERT??????????????目標矩陣區域顏色取反 MERGECOPY????????????使用與運算組合原設備矩形區域的顏色和目標設備的畫刷 MERGEPAINT???????????使用或運算將反向的源矩形區域的顏色和目標矩形區域的顏色合并 NOTSRCCOPY??????????復制源設備區域的反色到目標設備中 NOTSRCERASE????????使用或運算組合源設備區域與目標設備區域的顏色,然后對結果顏色取反 PATCOPY??????????????????復制源設備當前選中的畫刷到目標設備 PATINVERT???????????????使用異或運算組合目標設備選中的畫刷和目標設備區域的顏色 PATPAINT?????????????????通過或運算組合目標區域當前選中的畫刷和源設備區域反轉的顏色 SRCAND???????????????????使用與運算組合源設備和目標設備區域的顏色 SRCCOPY?????????????????直接復制源設備區域到目標設備中 SRCERASE???????????????使用與運算組合目標設備區域的反色與源設備區域的顏色 SRCINVERT??????????????使用異或運算組合源設備區域顏色和目標設備區域顏色 SRCPAINT?????????????????使用或運算組合源設備區域顏色和目標設備區域顏色 WHITENESS?????????????使用白色填充目標區域 |
?
?
參考鏈接:
http://blog.sina.com.cn/s/blog_7590da790101br23.html
?
————————————————————————
函數或命令:
ValidateRect(&m_client);
所屬類:
?
原型:
?
BOOL?ValidateRect(
HWND?hWnd,??????????//?窗口的句柄
CONST?RECT?*lpRect??//?指向RECT結構的指針
);
說明:
InvalidateRect(HWND)???使窗口無效???產生消息WM_PAINT;?
ValidateRect(HWND)使窗口有效???清除消息隊列中的WM_PAINT消息?
該函數更新指定窗口的無效矩形區域,使之有效。
InvalidateRect是將窗口中的一塊矩形區域標注為“無效”,系統會不斷向窗口發送WM_PAINT消息令其重繪。在響應WM_PAINT消息時,需要調用BeginPaint獲取DC來進行重繪。該函數會合并所有“無效”區域,對DC進行裁剪,將整個窗口標注為“有效”,清除WM_PAINT消息。DC經裁剪之后,在進行繪制時,超出DC范圍的操作將不被處理,所以即使在響應WM_PAINT消息時繪制的是整個窗口,而實際上繪制的也只是“無效”區域。恰當地使用InvalidateRect進行刷新比刷新整個窗口的效率要高。在WM_PAINT消息時,應盡量根據PAINTSTRUCT結構中rcPaint指定的矩形來處理重繪,減少執行不必要的代碼,從而提高效率。
個人感覺,大概就是如果某些地方需要重畫(比如說移動了窗口就是全部重畫,遮擋的窗口不被遮擋了,就是遮擋部分需要重畫),會被標記為無效區域,然后系統就觸發了WM_PAINT消息,這個消息的作用就是說告訴DC,要重畫啦。
然后函數BegainPaint(系統自己調用),就把所有無效區域合并到一起,在標注有效之后,進行重畫。而無效區域如果超出DC范圍(比如說圖比窗口大),超出的部分就不會被處理。
因為無效區域比全部窗口通常來說要小,因此只畫無效區域(也就是指定某區域要重畫),要比重畫整個窗口來說效率更高。
因此這里的有效,就是說不要去重畫(因為在緩沖位圖加載后已經重畫了,因此不需要讓某區域無效從而發送WM_PAINT消息去重畫)。
在OnPaint函數中釋放DC即ReleaseDC之前要加上ValidateRect(&m_client);這個函數的作用是使繪圖區變得有效。在windows中,如果我們的窗口被遮擋了什么的,窗口那部分就變得無效,就會產生WM_PAINT消息,當繪制完畢后,必須要使窗口變得有效,否則系統將周而復始的產生WM_PAINT消息,使得CPU占用率非常高,而且還會出現很多莫名其妙的問題,比如使用MessageBox會導致程序失去響應等。
參考鏈接:
http://blog.csdn.net/danxuezx/article/details/5088998
?
————————————————————————
函數或命令:
cacheDC.DeleteDC();
所屬類:
CDC
原型:
BOOL?DeleteDC(HDC?hdc);
說明:
注釋:如果一個設備上下文環境(DC)的句柄是通過調用GetDC函數得到的,那么應用程序不能刪除該設備上下文環境,它應該調用ReleaseDC函數來釋放該設備上下文環境。
由?CreateDC、CreateCopatibleDC?函數創建的設備上下文環境,只能使用DeleteDC來釋放。
在程序里,和上面的m_cache.CreateCompatibleDC(NULL);相對應,類似new和delete的關系。
參考鏈接:
http://blog.csdn.net/angussl/article/details/6527050
?
?
————————————————————————
函數或命令:
cacheCBitmap.DelectObject();
所屬類:
CBitmap
原型:
BOOL?DeleteObject(HGDIOBJ?hObject);
說明:
函數功能:該函數刪除一個邏輯筆、畫筆、字體、位圖、區域或者調色板,釋放所有與該對象有關的系統資源,在對象被刪除之后,指定的句柄也就失效了。
和上面的
m_cacheCBitmap.CreateCompatilbeBitmap(cdc,?m_client.Width(),?m_client.Height()?)
相對應。
也就是說,CBitmap類對象創建一個兼容的畫筆(這里的畫筆是位圖),在用完后就要釋放掉他。
參考鏈接:
?
?
?
————————————————————————
函數或命令:
ReleaseDC(cdc);
所屬類:
CChildView
原型:
?
說明:
如果一個DC的句柄,是通過getDC()?得到的,只能通過ReleaseDC()來釋放。
在本程序中,也就是指和CDC*?cdc=this->GetDC();?相呼應。
每個進程的GDI句柄數是有上限的
(MSDN:?The?number?of?DCs?is?limited?only?by?available?memory.?),貌似是10000個,超過上限后,進程再GetDC就會失敗。
getdc用戶向系統申請,用戶獲得了一個dc,同時,系統內部必然會記錄其資源已經做了什么樣的分配,你不釋放dc,并且放棄對該dc的控制(比如dc記錄在函數變量上,函數退出后,你的應用就失去了對該dc控制),那么,該dc變成了一個被占有而不可以用的資源,你不斷的申請dc,這樣資源就不斷被你占用,直到系統資源不足,大家完蛋。
?
也就是說,你問系統要一個DC,那么就用完后就得還回去,否則如果你丟掉(但系統記著你還借著呢),等你從系統那里借光了你的余額,你就再也不能借了。
參考鏈接:
http://bbs.csdn.net/topics/390537124
?
————————————————————————
函數或命令:
m_cacheDC.SetBkMode(TRANSPARENT);
所屬類:
CDC
原型:
WINGDIAPI int? ?WINAPI SetBkMode(__in HDC hdc, __in intmode);
hDC是句柄,mode是設置的模式。
不輸入第一個參數應該默認的是當前dc吧(不確定)
說明:
該命令表示將文字背景設為透明。
當在一個已有的圖像上面輸出文字時,有個很重要的問題是,文字不像手寫的文字那樣,單單是一個文字,而是一個矩形的圖像(觀察所得),輸入一串文字,其實就是把多個文字的圖像放一起。
這個圖像由兩部分組成,文字,和其背景。如果不輸入這行(設置為TRANSPARENT模式),則文字的背景不會變的透明(因此會遮擋背景圖像)。只有設置為TRANSPARENT模式后,才會只顯示文字。
模式分為兩種:TRANSPARENT和OPAQUE,前者是設置為透明,后者為用當前背景的畫刷輸出顯示文字的背景。
①在TRANSPARENT模式下(文字顏色已設置為紅色),圖像為:
②在OPAQUE模式下,背景畫刷不設置。則為:
③OPAQUE模式下,設置背景畫刷,目前無(因為我還不會設置背景畫刷)
參考鏈接:
?
?
————————————————————————
函數或命令:
m_cacheDC.SetTextColor(RGB(255, 0, 0));
所屬類:
CDC
原型:
?
說明:
設置輸出的文字的顏色。通過RGB三個參數(紅綠藍)控制顏色。范圍0~255,具體設置為多少在使用的時候查看相關的文章。
參考鏈接:
?
————————————————————————
函數或命令:
?m_cacheDC.TextOut(0,0,"發生碰撞");
所屬類:
CDC
原型:
?
說明:
該行命令在屏幕左上角(0,0)的位置輸出文字。
TextOut (hdc, x, y, psText, iLength) ;
hdc指的是窗口句柄,x,y指的是字符串在顯示區域的開始位置,psText參數是指向該字符串的指針,iLength是字符串的長度。
另外,按照查看的來看,可以將其設置為輸出文字+字符變量的形式,不過我沒看懂怎么做。等搞明白了來補充。
參考鏈接:
?
————————————————————————
函數或命令:
mciSendString("open res\\我在人民廣場吃炸雞.mp3 alias bgMusic", NULL, 0, NULL);
mciSendString("playbgMusic repeat", NULL, 0, NULL);
所屬類:
?
原型:
?
說明:
mciSendString是用來播放多媒體文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等
需要頭文件#include<mmsystem.h>。
需要導入聲音文件庫#pragmacomment(lib,"winmm.lib")//導入聲音頭文件庫
第一行命令:
①open表示打開媒體文件,媒體文件的地址是后面的res\\我在人民廣場吃炸雞.mp3 ;
②alias bgMusic表示將這個媒體文件的別名bgMusci,于是之后只需要調用別名就可以播放這個媒體文件了。
第二行命令:
①play表示播放某個媒體文件(bgMusic就是這個被播放的);
②repeat表示循環播放。
兩行命令后面的NULL,0,NULL表示什么尚不清楚。
參考鏈接:
http://baike.so.com/doc/6951002-7173403.html
————————————————————————
函數或命令:
CString
所屬類:
?
原型:
?
說明:
是一種數據類型。很大程度上簡化了MFC中的很多操作,使得MFC在做字符串操作的時候方便了很多。
位于頭文件<afx.h>中(但貌似MFC無需引用)。其作用包括以下:
①拼合字符串,可以像string類那樣,通過加號運算符,將兩個CString類對象之和賦值給某個CString類對象;
②格式化字符串。CString類對象的Format()方法。首先聲明一個CString類對象(例如CString m),然后m.Format(_T("Total is%d"),total); 這樣,可以不必擔心存放格式化或數據的緩沖區是否足夠大(例如total假如是個很大的數字,每多一位都要多占一個char大小的內存)。格式化也是一種將非字符串類型(例如int)的數據轉化為 CString類型的最常用技巧。例如將一個整數轉化為CString類型,可用如下方法:CString m; m.Format(_T("%d"),total);此時,m就是total的字符串類型了(例如1就成為了字符串的1,得記住,字符1的ASCNII碼,并不是1)
③轉換為int型。把CString類型的數據轉換為整數類型最簡單的方法就是使用標準的字符串到整數轉換例程(不懂)——具體看后面的參考鏈接;
④同char*類型轉化。在把字符串類型賦值給CString類型時,使用加號運算符中,至少加號左邊的是CString類型(或者對其使用強制轉換),或者兩個都是CString類型,才能將其結果賦值給另一個CString類型(因為此過程已使用加號運算符的重載函數)?;蛘?#xff0c;使用_T(字符串,帶雙引號); ,并將其賦值給CString類型(此時是Unicode字符),不使用_T也可以直接賦值。(更多請查看參考鏈接)
⑤⑥⑦請查看參考鏈接,我目前還沒接觸到其涉及到的知識,因此暫不深入。
參考鏈接:
http://baike.so.com/doc/5034329-5260837.html
?
————————————————————————
函數或命令:
AfxMessageBox和MessageBox
所屬類:
?
原型:
?
說明:
AfxMessageBox的函數原型
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp =(UINT) –1 );
根據說明,MFC情況下,應盡量使用AfxMessageBox()函數,因為這個全局的對話框最安全,也最方便。(在WIN32 SDK的情況下,只能使用MessageBox)
MFC中,能使用后者的情況下,都能使用前者(afx...)。
AfxMessageBox是MFC的全局函數,提供了多種重載形式(雖然我就看會了一種)。
以AfxMessageBox(bufpos,MB_OKCANCEL);為例:
這行代碼可以有三個參數,第一個參數為字符串,可以是CString類型的變量(字符串變量),也可以直接是字符串。這第一個字符串為輸出的內容。
第二個參數為按鈕(例如這里是按鈕是確定和取消),如果不填寫,則只有一個“確定”按鈕。如何利用不同的按鈕來做不同的事,還不太清楚,以后待補充。
第三個參數還沒搞懂怎么用。
參考鏈接:
http://blog.csdn.net/xhhjin/article/details/6456205
?
————————————————————————
函數或命令:
?
所屬類:
?
原型:
?
說明:
?
參考鏈接:
?
?
總結
以上是生活随笔為你收集整理的MFC函数简单解释(更新至28日凌晨)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火狐强制刷新_强制Firefox 3在W
- 下一篇: 使用阿里云的OSS图片上传,这里是用的上