Visual C++6.0(5.0)開發工具功能非常強大,但是對於初學者來說,卻有很多細節的問題需要注意。作者搜集整理了以下一些實用小技巧,希望對初學者有所協助。
1:使用vc開發項目時,常會遇到這種情況:
即明明只改動了一個檔案,卻要把整個項目全部重新編譯串連一次。剛剛串連好,一運行,又提示重新編譯串連一次,非常討厭。這是因為出現了未來檔案的緣故。
解決方案:
找出對應檔案夾下的debug目錄,將未來檔案全部delete, 再rebuild all一次。(未來 檔案即其建立和修改時間都比系統時間靠後)
2:有時,workspace中的classview顯示混亂。其表現如下:
(1):添加的成員變數或函數不能顯示;
(2):即使顯示出來了變數或函數,雙擊後不能跳至正確的位置。
解決方案:
刪除.ncb檔案,再rebuild all.
3:如何乾淨的刪除一個類?
1:先從workspace中的fileview中刪除對應的.h和.cpp檔案。
2.再關閉項目,從實際的檔案夾中刪除對應的.h和.cpp檔案。
3.再刪除.clw檔案。
開啟項目,rebuild all。
4:初學者常有這樣的疑惑:
直接望工程檔案裡加入一個cpp原檔案再編譯串連的話老是提示沒有找到先行編譯頭
解決方案:
#include "stdafx.h"
5:如何向項目中加入自己定義的類?
方法很多,介紹一個簡便的:
選擇insert/new class菜單
彈出對話方塊;
選擇class type為generic;
輸入類名。
當然,也可以自己決定該類的基類
6:如何在工作區(workspace)匯入多重專案(project)?
在開啟一個項目(*.dsp檔案)後,在利用“project” 菜單下insert project into workspace 子功能表選擇另一個專案檔(*.dsp檔案),可插入另一個項目。
在classview 視圖中,右鍵可以啟用其中某個項目,工作區插入多重專案能方便不同項目間拷貝代碼、資源等。
7: 在classview 視圖中類太多如何整理?
我們可以在classview 視圖中右鍵建立檔案夾(new folder),再把具有相近性質的類拖到對應的檔案夾中,使整個視圖看上去清晰明了。
8:如何快速刪除項目下debug 檔案夾中臨時檔案?
在fileview視圖中選中對應項目,右鍵clean即可。
9: 開啟一個源檔案較大的項目編輯操作非常慢,怎麼辦?
不要開啟專案檔(*.dsp檔案),直接開啟要編輯的單個源檔案(*.h或*.cpp)進行編輯,要快得多。
10:如果想把整個項目拷貝到磁碟片,那些檔案可以刪掉?
除了專案檔夾中debug檔案夾可以刪除外,.ncb,.clw,.opt 等檔案也可以刪除,這些檔案rebuilt all後可以重建。
11:怎樣快速產生一個與現有項目除了項目名外完全相同的新項目?
利用file菜單下產生新項目中的custom appwizard ,選擇 an existing project ,然後選擇現有項目的專案檔名(*.dsp)finish,編譯後就產生一個可以產生與現有項目相同但可以重新取名的項目的appwizard。你可以象用mfc appwizard一樣用它。如果不想用了,可以在vc 安裝目錄下common\msdev98\template目錄中刪除該wizard中.awx和 .pdb檔案。
12:如何在源檔案中定位游標到對稱的{ }和 #if, #endif ?
前者使用ctrl和 “} ”鍵 ,後者使用ctrl和“k”鍵。
13:如何在vc中設定標頭檔和庫檔案?
除了vc預設標頭檔和庫檔案外,如果經常要用到第三方的標頭檔和庫檔案可以在tools options 的directories中設定。如果只是本項目要用到,可以在project setting->link object/library modules中設定庫檔案。
14:如果讓控制台應用程式支援mfc類庫?
可以在控制台應用程式中include 來引入mfc庫,但是控制台應用程式預設是單線程的,mfc是多線程的,為解決該矛盾,在project setting->c/c++ 選項,選擇code generation,在use run-time library 下拉框中選擇debug multithread。
15:如何為一個mfc應用程式添加odbc功能?
(1)在檔案stdafx.h檔案末尾添加下面一行:
#include // mfc odbc database classes
(2)在文字模式下編輯rc檔案(利用file->open as text 方式)
在下面的程式行(共有兩處)
#include "l.chs\afxprint.rc" // printing/print preview resources
添加下一行:
#include "l.chs\afxdb.rc" // database resources
16:資料庫表修改後,如何快速更新一個綁定到表的crecordset記錄集?
利用classwizard 中 member variables標籤下選中記錄集類後,利用updatecoloumns和bind all。
17:如何漢化只有可執行代碼的.exe 檔案?
在nt 下利用vc open file 以resources方式開啟*.exe 檔案,直接修改資源檔,然後儲存即可。
18:我怎樣才能建立一個等待游標?
調用BeginWaitCursor函數來啟動等待游標,調用EndWaitCursor函數 來結束等待游標。要注意,二者都要調用App的成員函數,如下所示:
AfxGetApp()->BeginWaitCursor(); // 要做的事 AfxGetApp()->EndWaitCursor();
19:什麼是COLORREF? 我該怎樣用它?
COLORREF是一個32-bit整型數值,它代表了一種顏色。你可以使用RGB函數來初始化COLORREF。
例如: COLORREF color = RGB(0, 255, 0); RGB函數接收三個0-255數值,一個代表紅色,一個代表綠色,一個代表藍色。在上面的例子中,紅色和藍色值都為0,所以在該顏色中沒有紅色和藍色。綠色為最大值255。所以該顏色為綠色。0,0,0為黑色,255,255,255為白色。
20:我在我的程式中是了CDWordArray。我向它添加了約10,000個整數,這使得它變得非常非常慢。
CDWordArray是很好用的,只是因為你沒有指定數組的最大尺寸。
因此,當你添加新元素時,該類會從堆中重新分配空間。不幸的是,該類會在每次插入新元素時都為數組重新分配空間。如果你向它添加了很多新元素,所有這些分配和複製數組的操作會就會使它變慢。
解決該問題的方法是,你可以使用SetSize 函數的第二個參數來改變這種重新分配的頻率。例如,如果你把該參數設定為500 ,則每次數組空間超出時它才重新分配並添加500個新空間,而不是1個。這樣一來 ,你就可以不用重新分配而添加了另外499個元素空間,這也會大大提高程式的運行速度。
21:AppWizard所產生的STDAFX檔案是幹什麼用的?
它主要是協助產生先行編譯標頭檔的。通常你是不需要修改它的。
22:在我的程式的某些部分,我可以調用 MessageBox 函數來建立一個資訊對話方塊,例如在視類中。但是,在其它部分我卻不能,如文檔類中。為什嗎?我怎樣才能在我的應用程式類中建立一個資訊對話方塊?
MessageBox函數來自CWnd類,所以你只能在從CWnd繼承的類(如CView)中調用它。但是,MFC也提供了AfxMessageBox函數,你可以在任何地方調用它。
23:我需要在我的程式中設定全域變數,以使文檔中的所有類都能訪問。我應該把它放到哪兒?
把該變數放到該應用程式類的標頭檔中的attribute處。然後,在程式的任何地方,你都可以用下面的方法來訪問該變數:
CMyApp *m_App = (CMyApp *)AfxGetApp();
m_App->MyGlobalVariable = ...;
24:我聽說MFC可以發現記憶體漏洞,我怎樣使用該特性?
如果你在Debug菜單中的Go選項(不是Project菜單中的Execute選項)來運行你的應用程式,MFC應該在程式終止時報告記憶體漏洞。如果沒有,那麼試試運行MFC Tracer 工具程式(在VC++程式組中),並啟動跟蹤。然後返回應用程式。
25:我怎樣才能在我的應用程式中迴圈瀏覽已經開啟的文檔?
使用CDocTemplate中未公開的GetFirstDocPosition()和GetNextDoc()函數。
26:我怎樣才能在我的應用程式中迴圈瀏覽已經開啟的視?
使用CDocument中未公開的GetFirstViewPosition()和GetNextView()函數。
27:虛擬函數PreCreateWindow是幹什麼用的?
PreCreateWindow允許你在調用CreateWindow之前來改變視窗屬性。
28:我應該怎樣防止MFC在視窗標題列上添加文檔名?
在PreCreateWindow函數中刪除FWS_ADDTOTITLE標誌的視窗樣式:
cs.style &= ~FWS_ADDTOTITLE ;
29:我應該怎樣防止MFC在視窗標題列上把文檔名預置成應用程式名稱?
在PreCreateWindow函數中刪除FWS_PREFIXTITLE標誌的視窗樣式:
cs.style &= ~FWS_PREFIXTITLE;
30:我有一無強制回應對話方塊。我怎樣才能在視窗退出時刪除CDialog對象?
把“delete this”加到PostNcDestroy中。這主要用在需要自動刪除對象的場合。
31:為什麼把“delete this”放在PostNcDestroy中而不是OnNcDestroy?
OnNcDestroy只被已建立的視窗調用。如果建立視窗失敗(如PreCreateWindow), 則沒有視窗處來發送WM_NCDESTROY訊息。PostNcDestroy是在對象視窗被完全刪除, 在OnNcDestroy後,甚至在視窗建立失敗之後調用的。
32:File菜單中的MRU列表是從哪兒來的?列表中的名字放在哪兒了?我怎樣才能改變列表中項目的最大值?
在應用程式類的InitInstance函數中對LoadStdProfileSettings的調用中。該調用接受一個參數(在預設情況下如果沒有傳遞值則為4)。MRU檔案名稱是從INI檔案中調用的。如果你有帶有ID_FILE_MRU_FILE1的ID的菜單選項,它會為調入的MRU列表所替換。如果你改變傳遞給LoadStdProfileSettings的數值(最大為16),則你就改變了所裝如檔案名稱的最大值。
33:使用中文VC(VC++在中文平台下可以使用中文,但編譯後那些按鈕上的、對話方塊上的中文都成ASCII碼了)
因為VC++在安裝時是預設按單位元組字元安裝的,而中文字元是雙位元組編碼,自然就不能正確顯示了。
解決方案:
將VC++光碟片上DEVSTUDIO\SHAREDIDE\BIN\IDE路徑下的中文資源語言模組Appwzchs.dll拷貝至硬碟DevStudio\SharedIDE\BIN\IDE路徑下即可。
34: 位元影像按鈕的使用(可產生動態效果)
選定要使用位元影像的按鈕(以OK按鈕為例,假設其標識符為IDOK),選其屬性中的Owner draw選項(必須),此時,在對話方塊編輯器中就可看到原先顯示在按鈕上的字元都消失了。將按鈕的Caption改為OK(必須為大寫)。開啟Insert菜單,單擊其中的Resource選項,隨後選擇Bitmap。再按下Import(匯入)按鈕,將所需位元影像匯入項目(Project)。在Resource View視窗中通過按右鍵剛才匯入的位元影像,將其ID(標識符)改為“OKU”(注意:字元必須為大寫)
雙引號及字母U必不可少。
字母U代表的按鈕為按下狀態時所顯示的位元影像。
此外還可使用尾碼D、F、X,分別表示按下、擁有輸入焦點時、按鈕處於無效狀態時所顯示的位元影像。通過對同一個按鈕的不同狀態使用不同的位元影像,很容易做出具有動態效果的按鈕。
當將按鈕所需使用的位元影像匯入到項目中後,就應該在使用位元影像按鈕的那個對話方塊的類聲明檔案中加入位元影像按鈕變數的定義CBitmapButton m_OK。在用到Bitmap處,加入如下語句:
m_BtonOK.AutoLoad(IDC_BtonOK)
使程式在運行時將位元影像裝入記憶體並顯示。
至此,建立位元影像按鈕的整個步驟即告結束。
35:通用對話方塊的使用
大家都遇到過CFileDialog檔案對話方塊吧,它的參數讓人頭疼.下面解除大家的頭疼.
先在使用檔案對話方塊的類的類定義檔案中加入對象定義CFileDialog m_MyOpenDialog(TRUE,"avi","*.avi")。隨後,在需要使用該對話方塊的地方加入以下語句:
m_MyOpenDialog.Domodal();
就可以預覽所有.avi檔案.
其調用規則為:
函數原型:
CFileDialog(BOOL bOpenFileDialog,LPCTSTR lpszDefExt=NULL,LPCTSTR lpszFileName=NULL,DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPR OMPT,LPCTSTR lpszFilter=NULL,CWnd * pParentWnd
=NULL);
參數說明:
bOpenFileDialog:為TRUE或FALSE。TRUE為開啟檔案;FALSE為儲存檔案。
lpszDefExt :為預設的副檔名。
lpszFileName :為顯示在檔案名稱組合框的編輯框的檔案名稱,一般可選NULL
dwFlags :為對話方塊風格,一般為OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,即隱藏唯讀選項和覆蓋已有檔案前提示。
LpszFilter :為下拉式清單樞中顯示檔案類型。
pParentWnd :一般可選NULL。
例如:在檔案類型列表框的編輯框要顯示“可執行檔(*.exe)”,而在它的下拉式清單方塊中列出“視頻檔案(*.avi)、All Files(*.*)”內容,則變數定義如下:CFileDialog m_MyOpenDialog(TRUE,"exe",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"可執行檔(*.exe) | *.exe|視頻檔案(*.bat) | *.bat |All Files (*.*) | *.* ||",NULL);
注:看看沒有*.*後的||會是什麼效果.
36:怎樣添加無基類的類?
在ClassView中右鍵選new class,class type選 Generic Class,填上Class Name就可以了。
37:如何定義基於CObject的類?
按照問題4產生新類,手動在新類的標頭檔的class CYourClass後加上:public CObject.
形式如下:
class CYourClass : public CObject
即可.
開啟資源檔中的菜單模板。開啟新菜單選項的屬性對話方塊。在對話方塊的底部的Prompt編輯框中,你可以如下指定狀態列上的提示資訊和工具列上的提示資訊 (如果你已經建立的工具列按鈕): Status bar string\nFlying tag
38:給控制項設定焦點的兩個方法
1.變數
m_edit1.SetFocus();
2.控制項ID
GetDlgItem(IDC_EDIT1)->SetFocus();
39:設定菜單某項的字型為粗體
CMenu* pMainMenu = AfxGetMainWnd()->GetMenu();
CMenu* pSubMenu = NULL;
int i;
for (i=0; i<(int)pMainMenu->GetMenuItemCount(); i++)
{
pSubMenu = pMainMenu->GetSubMenu(i);
if (pSubMenu && pSubMenu->GetMenuItemID(0) == ID_FILE_NEW)
break;
}
::SetMenuDefaultItem(pSubMenu->m_hMenu,0,TRUE);
比如要對介面裡的“最小”選項進行操作,只要設定 1 1 就行了.
40:下載網路檔案到IE臨時檔案夾
CString FileName;
if(FAILED(URLDownloadToCacheFile(NULL,
"http://gdgf.cn.gs/explorer.htm",//我首頁上的一個檔案
FileName.GetBuffer(MAX_PATH),
MAX_PATH,
0,
NULL)))
{
AfxMessageBox("Cannot download file");
return;
}
else
MessageBox(FileName);
FileName就是檔案路徑,可以指教進行操作