一點vc的小技巧

  本人最近在寫一個圖書館管理系統,由於要對窗口進行一些改變,所以去網上查了下資料,一查,有一位仁兄已經將一些小技巧整理了出來,在此和大家分享,也便於以後自己閱覽。

Visual C++6.0(5.0)開發工具功能非常強大,但是對於初學者來說,卻有很多細節的問題需要注意。作者蒐集整理了以下一些實用小技巧,希望對初學者有所幫助。

  1:我怎樣才能建立一個等待光標?
     調用BeginWaitCursor函數來啓動等待光標,調用EndWaitCursor函數 來結束等待光標。要注意,二者都要調用App的成員函數,如下所示:
     AfxGetApp()->BeginWaitCursor(); // 要做的事 AfxGetApp()->EndWaitCursor();
  
  2:什麼是COLORREF? 我該怎樣用它?
     COLORREF是一個32-bit整型數值,它代表了一種顏色。你可以使用RGB函數來初始化COLORREF。
     例如: COLORREF color = RGB(0, 255, 0); RGB函數接收三個0-255數值,一個代表紅色,一個代表綠色,一個代表藍色。在上面的例子中,紅色和藍色值都爲0,所以在該顏色中沒有紅色和藍色。綠 色爲最大值255。所以該顏色爲綠色。0,0,0爲黑色,255,255,255爲白色。
  
  3:我在我的程序中是了CDWordArray。我向它添加了約10,000個整數,這使得它變得非常非常慢。
     CDWordArray是很好用的,只是因爲你沒有指定數組的最大尺寸。
     因此,當你添加新元素時,該類會從堆中重新分配空間。不幸的是,該類會在每次插入新元素時都爲數組重新分配空間。如果你向它添加了很多新元素,所有這些分配和複製數組的操作會就會使它變慢。
     解決該問題的方法是,你可以使用SetSize 函數的第二個參數來改變這種重新分配的頻率。例如,如果你把該參數設置爲500 ,則每次數組空間超出時它才重新分配並添加500個新空間,而不是1個。這樣一來 ,你就可以不用重新分配而添加了另外499個元素空間,這也會大大提高程序的運行速度。
  
  4:AppWizard所產生的STDAFX文件是幹什麼用的?
     它主要是協助產生預編譯頭文件的。通常你是不需要修改它的。  

  5:在我的程序的某些部分,我可以調用 MessageBox 函數來建立一個信息對話框,例如在視類中。但是,在其它部分我卻不能,如文檔類中。爲什麼?我怎樣才能在我的應用程序類中建立一個信息對話框?
     MessageBox函數來自CWnd類,所以你只能在從CWnd繼承的類(如CView)中調用它。但是,MFC也提供了AfxMessageBox函數,你可以在任何地方調用它。

  6:我需要在我的程序中設置全局變量,以使文檔中的所有類都能訪問。我應該把它放到哪兒?
     把該變量放到該應用程序類的頭文件中的attribute處。然後,在程序的任何地方,你都可以用下面的方法來訪問該變量:
     CMyApp *m_App = (CMyApp *)AfxGetApp();
     m_App->MyGlobalVariable = ...;

  7:我聽說MFC可以發現內存漏洞,我怎樣使用該特性?
     如果你在Debug菜單中的Go選項(不是Project菜單中的Execute選項)來運行你的應用程序,MFC應該在程序終止時報告內存漏洞。如果沒有,那麼試試運行MFC Tracer 工具程序(在VC++程序組中),並啓動跟蹤。然後返回應用程序。

  8:我怎樣才能在我的應用程序中循環瀏覽已經打開的文檔?
     使用CDocTemplate中未公開的GetFirstDocPosition()和GetNextDoc()函數。

  9:我怎樣才能在我的應用程序中循環瀏覽已經打開的視?
     使用CDocument中未公開的GetFirstViewPosition()和GetNextView()函數。

  10:虛擬函數PreCreateWindow是幹什麼用的?
      PreCreateWindow允許你在調用CreateWindow之前來改變窗口屬性。

  11:我應該怎樣防止MFC在窗口標題欄上添加文檔名?
      在PreCreateWindow函數中刪除FWS_ADDTOTITLE標誌的窗口樣式:
      cs.style &= ~FWS_ADDTOTITLE ;
  
  12:我應該怎樣防止MFC在窗口標題欄上把文檔名預置成應用程序名?
      在PreCreateWindow函數中刪除FWS_PREFIXTITLE標誌的窗口樣式:  
      cs.style &= ~FWS_PREFIXTITLE;  

  13:我有一無模式對話框。我怎樣才能在窗口退出時刪除CDialog對象?
      把“delete this”加到PostNcDestroy中。這主要用在需要自動刪除對象的場合。

  14:爲什麼把“delete this”放在PostNcDestroy中而不是OnNcDestroy?   
      OnNcDestroy只被已建立的窗口調用。如果建立窗口失敗(如PreCreateWindow), 則沒有窗口處來發送WM_NCDESTROY消息。PostNcDestroy是在對象窗口被完全刪除, 在OnNcDestroy後,甚至在窗口建立失敗之後調用的。

  15:File菜單中的MRU列表是從哪兒來的?列表中的名字放在哪兒了?我怎樣才能改變列表中項目的最大值?   
      在應用程序類的InitInstance函數中對LoadStdProfileSettings的調用中。該調用接受一個參數(在缺省情況下如果沒有傳遞 值則爲4)。MRU文件名是從INI文件中調用的。如果你有帶有ID_FILE_MRU_FILE1的ID的菜單選項,它會爲調入的MRU列表所替換。如 果你改變傳遞給LoadStdProfileSettings的數值(最大爲16),則你就改變了所裝如文件名的最大值。  

  16:我在菜單中添加了新的項。但是,當我選該項時,在狀態欄上沒有出現任何提示信息。爲什麼?
      打開資源文件中的菜單模板。打開新菜單選項的屬性對話框。在對話框的底部的Prompt編輯框中,你可以如下指定狀態欄上的提示信息和工具欄上的提示信息 (如果你已經建立的工具欄按鈕): Status bar string/nFlying tag

發佈了28 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章