1. 程式人生 > >【轉】MFC 常用

【轉】MFC 常用

1、在資料庫操作時,將系統自動生成的CTime替換成COleDateTime。

2、在操作ACCESS資料庫時,字串的標識是:單引號;日期/時間型別的標識是:#

3、將 DDX_FieldDateTimeCtrl(pDX, IDC_PUBLISHDATE, m_pSet->m_publishDate,m_pSet);  替換成:
         DDX_DateTimeCtrl(pDX, IDC_PUBLISHDATE, m_pSet->m_publishDate);
注:這是VC6裡的一個老BUG,好像SP6裡也是那樣。

4、遇到ClassView裡的某個類突然丟失時可以把專案資料夾下的副檔名為.ncb和.opt的兩個檔案刪掉,再重新開啟專案。
     遇到類下的成員函式定位不準,即雙擊該函式時並不能準確定位到指定位置時,可以把debug或release(這要視你當時選擇的MODE來定)下的副檔名為:.pch的檔案刪掉;如還不行,就再把上面兩個檔案也一起刪掉,再不行,,我也搞不定了,只好建議你跑出門去,對著天空大喊三聲:“神啊,救救我吧!”

5、如果你很喜歡VC6的auto-complete功能,而發覺他與系統的Ctrl+Space輸入法衝突了,建議如下:
     Menu“Tools”->“Customize”->"Keyword",選擇分類為:"All commands",滑鼠點選all commands裡面,敲擊“comple...”就出來了,在右側重新新增一個“Shift+Space”並Assign就行了。
    這一點VC6要比delphi6好,在delphi6及以後的版本里,autocomplete功能已經做的很好了,當然以前的版本嗎, autocomplete慢的跟什麼似的,但很遺憾,我至今未找到能夠自定義快捷方式的地方,好像只能用"Ctrl+Space",哪位大蝦知道告訴我,另外delphi6下也可以Ctrl+J,這個VC6裡沒有,不過裝了Visual Assist6就行了。

6、建議你使用VC6編輯的關鍵字顏色自定義功能,或者你可以使用Visual Assist6啟動顏色功能。即使你不喜歡自定義顏色,那有一個顏色,我還是建議你自定義一下:
Menu"Tools"->"OPtions"->"Format"
Color:Number  Foreground:red,不然是很容易搞混:'0'和'o'的,尤其是在VC6的預設字型下。

7.檢測程式中的括號是否匹配 
    把游標移動到需要檢測的括號(如大括號{}、方括號[]、圓括號()和尖括號<>)前面,鍵入快捷鍵“Ctrl+]”。如果括號匹配正確,游標就跳到匹配的括號處,否則游標不移動,並且機箱喇叭還會發出一聲警告聲。 
[注:當一個函式體的內容過長時,全部選中,可以把游標移動到函式體的{處,按下Ctrl+},即可全部選中]

8.檢視一個巨集(或變數、函式)的巨集定義
    把游標移動到你想知道的一個巨集上,就比如說最常見的DECLARE_MAP_MESSAGE上按一下F12(或右鍵選單中的Go To Defition Of…),如果沒有建立Browse files,會出現提示對話方塊,確定,然後就會跳到定義那些東西的地方。
[注:這個功能還是比較常用的,不過感覺熱鍵並不如滑鼠選擇的快]

9格式化一段亂七八糟的原始碼
    選中那段原始碼,按ATL+F8。 
[注:選中一段程式碼,按下Tab,或shift+Tab,右(或左)移一個TAb]

10.在編輯狀態下發現成員變數或函式不能顯示
    刪除該專案副檔名為.ncb檔案,重新開啟該專案。
[注:我上次說的不是很準確,.opt裡面可能存有你在Classview新建的資料夾資訊,刪除的話那些分類資料夾資訊也一併刪除了]

11.如何整理ClassView檢視中大量的類
    可以在classview 檢視中右鍵新建資料夾(new folder),再把具有相近性質的類拖到對應的資料夾中,使整個檢視看上去清晰明瞭。
[注:事實上,我也見到在FileView裡用資料夾分類的,我的感覺是:可能是為了避免在Classviews裡出現如上述的部分函式丟失的情況吧,畢竟VC6有時並不是很穩定,當然這兩種方法各有利弊的,我目前一般是傾向於前者的]

12.定位預處理指定
    在原始檔中定位游標到對稱的#if, #endif,使用Ctrl+K。

13.如何新增系統中Lib到當前專案
    在Project ¦ Settings ¦ Link ¦ Object/library modules:輸入Lib名稱,不同的Lib之間用空格格開。
[注:或者這樣,#pragma comment(lib,"yourlib.lib")]

14.如何新增系統中的標頭檔案(.h)到當前專案。
    #include <FileName.h>,告訴編譯到VC系統目錄去找;使用#include "FileName.h",告訴編譯在當前目錄找。

15.如何在Studio使用匯編除錯
    在WorkBench的Debugger狀態下按CTRL+F7。

16.怎樣處理ClassWiZard找不到的系統訊息
    如果要在ClassWizard中處理WM_NCHITTEST等系統訊息,請在ClassWizard中Class Info頁中將Message filter改為Window就有了。
[注:主要是classwizard預設的是toponthemost]

17.如何幹淨的刪除一個類
    先從Workspace中的FileView中刪除對應的.h和.cpp檔案,再關閉專案,從實際的資料夾中刪除對應的.h和.cpp檔案與.clw檔案。

18.如果讓控制檯應用程式支援mfc類庫
    可以在控制檯應用程式中include 來引入mfc庫,但是控制檯應用程式預設是單執行緒的,mfc是多執行緒的,為解決該矛盾,在project setting->c/c++ 選項,選擇code generation,在use run-time library 下拉框中選擇debug multithread。

19.如何漢化只有可執行程式碼的.exe 檔案
    在nt下利用vc open file 以resources方式開啟*.exe 檔案,直接修改資原始檔,然後儲存即可。
[注:我一般是用exescope編輯的]

附:VC專案檔案說明

.opt 工程關於開發環境的引數檔案。如工具條位置等資訊;

.aps (AppStudio File),資源輔助檔案,二進位制格式,一般不用去管他;

.clw ClassWizard資訊檔案,實際上是INI檔案的格式,有興趣可以研究一下.有時候ClassWizard出問題,手工修改CLW檔案可以解決.如果此檔案不存在的話,每次用ClassWizard的時候繪提示你是否重建;

.dsp (DeveloperStudio Project):專案檔案,文字格式,不過不熟悉的話不要手工修改.dsw(DeveloperStudio Workspace)是工作區檔案,其他特點和DSP差不多;

.plg 是編譯資訊檔案,編譯時的error和warning資訊檔案(實際上是一個html檔案),一般用處不大.在Tools->Options裡面有個選項可以控制這個檔案的生成;

.hpj (Help Project)是生成幫助檔案的工程,用microsfot  Help Compiler可以處理; 

.mdp (Microsoft DevStudio Project)是舊版本的專案檔案,如果要開啟此檔案的話,會提示你是否轉換成新的DSP格式;

.bsc 是用於瀏覽專案資訊的,如果用Source Brower的話就必須有這個檔案.如果不用這個功能的話,可以在Project Options裡面去掉Generate Browse Info File,可以加快編譯速度;

.map 是執行檔案的映像資訊紀錄檔案,除非對系統底層非常熟悉,這個檔案一般用不著;

.pch (Pre-Compiled File)是預編譯檔案,可以加快編譯速度,但是檔案非常大;

.pdb (Program Database)記錄了程式有關的一些資料和除錯資訊,在除錯的時候可能有用;

.exp 只有在編譯DLL的時候才會生成,記錄了DLL檔案中的一些資訊.一般也沒什麼用;

.ncb 無編譯瀏覽檔案(no compile browser)。當自動完成功能出問題時可以刪除此檔案。build後會自動生成。


VC++的連結錯誤LNK2001


       學習VC++時經常會遇到連結錯誤LNK2001,該錯誤非常討厭,因為對於程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其LNK2001錯誤,常常使人不明其所以然。如果不深入地學習和理解VC++,要想改正連線錯誤LNK2001非常困難。
  初學者在學習VC++的過程中,遇到的LNK2001錯誤的錯誤訊息主要為:
  unresolved external symbol “symbol”(不確定的外部“符號”)。
  如果連線程式不能在所有的庫和目標檔案內找到所引用的函式、變數或標籤,將產生此錯誤訊息。一般來說,發生錯誤的原因有兩個:一是所引用的函式、變數不存在、拼寫不正確或者使用錯誤;其次可能使用了不同版本的連線庫。
  以下是可能產生LNK2001錯誤的原因:
  一.由於編碼錯誤導致的LNK2001。
  1.不相匹配的程式程式碼或模組定義(.DEF)檔案能導致LNK2001。例如,如果在C++ 原始檔內聲明瞭一變數“var1”,卻試圖在另一檔案內以變數“VAR1”訪問該變數,將發生該錯誤。
  2.如果使用的行內函數是在.CPP檔案內定義的,而不是在標頭檔案內定義將導致LNK2001錯誤。
  3.呼叫函式時如果所用的引數型別同函式宣告時的型別不符將會產生LNK2001。
  4.試圖從基類的建構函式或解構函式中呼叫虛擬函式時將會導致LNK2001。
  5.要注意函式和變數的可公用性,只有全域性變數、函式是可公用的。
  靜態函式和靜態變數具有相同的使用範圍限制。當試圖從檔案外部訪問任何沒有在該檔案內宣告的靜態變數時將導致編譯錯誤或LNK2001。
  函式內宣告的變數(區域性變數) 只能在該函式的範圍內使用。
  C++ 的全域性常量只有靜態連線效能。這不同於C,如果試圖在C++的多個檔案內使用全域性變數也會產生LNK2001錯誤。一種解決的方法是需要時在標頭檔案中加入該常量的初始化程式碼,並在.CPP檔案中包含該標頭檔案;另一種方法是使用時給該變數賦以常數。
  二.由於編譯和連結的設定而造成的LNK2001
  1.如果編譯時使用的是/NOD(/NODEFAULTLIB)選項,程式所需要的執行庫和MFC庫在連線時由編譯器寫入目標檔案模組, 但除非在檔案中明確包含這些庫名,否則這些庫不會被連結進工程檔案。在這種情況下使用/NOD將導致錯誤LNK2001。
  2.如果沒有為wWinMainCRTStartup設定程式入口,在使用Unicode和MFC時將得到“unresolved external on [email protected]”的LNK2001錯誤資訊。
  3.使用/MD選項編譯時,既然所有的執行庫都被保留在動態連結庫之內,原始檔中對“func”的引用,在目標檔案裡即對“__imp__func” 的引用。如果試圖使用靜態庫LIBC.LIB或LIBCMT.LIB進行連線,將在__imp__func上發生LNK2001;如果不使用/MD選項編譯,在使用MSVCxx.LIB連線時也會發生LNK2001。
  4.使用/ML選項編譯時,如用LIBCMT.LIB連結會在_errno上發生LNK2001。
  5.當編譯除錯版的應用程式時,如果採用發行版模態庫進行連線也會產生LNK2001;同樣,使用除錯版模態庫連線發行版應用程式時也會產生相同的問題。
  6.不同版本的庫和編譯器的混合使用也能產生問題,因為新版的庫裡可能包含早先的版本沒有的符號和說明。
  7.在不同的模組使用內聯和非內聯的編譯選項能夠導致LNK2001。如果建立C++庫時打開了函式內聯(/Ob1或/Ob2),但是在描述該函式的相應標頭檔案裡卻關閉了函式內聯(沒有inline關鍵字),這時將得到該錯誤資訊。為避免該問題的發生,應該在相應的標頭檔案中用inline關鍵字標誌行內函數。
  8.不正確的/SUBSYSTEM或/ENTRY設定也能導致LNK2001。
  其實,產生LNK2001的原因還有很多,以上的原因只是一部分而已,對初學者來說這些就夠理解一陣子了。但是,分析錯誤原因的目的是為了避免錯誤的發生。LNK2001錯誤雖然比較困難,但是隻要注意到了上述問題,還是能夠避免和予以解決的。