Visual C 程式設計技巧之五和六

2021-05-22 20:21:36 字數 4914 閱讀 1128

33、如何獲取乙個對話控制項的指標

34、如何禁止和使能控制項

35、如何改變控制項的字型

36、如何在ole控制項中使用ole_color資料型別

37、在不使用通用檔案開啟對話的情況下如何顯示乙個檔案列表

38、為什麼旋轉按鈕控制項看起來倒轉

39 為什麼旋轉按鈕控制項不能自動地更新它下面的編輯控制項

40、如何用位圖顯示下壓按鈕

41、如何乙個建立三態下壓按鈕

42、如何動態建立控制項

43、如何限制編輯框中的准許字元

44、如何改變控制項的顏色

45、當向列表框中新增多個項時如何防止閃爍

46、如何向編輯控制項中新增文字

47、如何訪問預定義的gdi物件

48、如何獲取gdi物件的屬性資訊

33、如何獲取乙個對話控制項的指標  

有兩種方法。其一,呼叫cwnd: : getdlgitem,獲取乙個cwnd*指標呼叫成員函式。下例呼叫getdlgitem,將返回值傳給乙個cspinbuttonctrl*以便呼叫cspinbuttonctrl : : setpos 函式:  

bool csampledialog : : oninitdialog ( )  

其二, 可以使用classwizard將控制項和成員變數聯絡起來。在classwizard中簡單地選擇member variables標籤,然後選擇add variable …按鈕。如果在對話資源編輯器中,按下ctrl鍵並雙擊控制項即可轉到add member variable對話。  

34、如何禁止和使能控制項  

控制項也是視窗,所以可以呼叫cwnd : : enablewindow使能和禁止控制項。  

//disable button controls .  

private :  

cfont m_font ;  

// set font in class implementation (.cpp file ). note m_wndbutton is a  

//member variable added by classwizard.ddx routines hook the member  

//variable to a dialog button contrlo.  

bool csampledialog : : oninitdialog ( )  

36、如何在ole控制項中使用ole_color資料型別  

諸如colecontrol : : getfortcolor和colecontrol : : getbackcolor等函式返回ole _color資料型別的顏色,而gdi物件諸如筆和刷子使用的是colorref資料型別,呼叫colecontrol : : translatecolor可以很容易地將ole_color型別改為colorref型別。下例建立了乙個當前背景顏色的刷子:  

void csamplecontrol : : ondraw (cdc* pdc ,const crect& rcbounds , const crect& rcinvalid )  

37、在不使用通用檔案開啟對話的情況下如何顯示乙個檔案列表  

呼叫cwnd: : dlgdirlist或者cwnd: : dlgdirlistcombobox, windows 將自動地向列表框或組合框填充可用的驅動器名或者指定目錄中的檔案,下例將windows目錄中的檔案填充在組合框中:  

bool csampledig : : oninitdialog ( )  

;  int nreslt = dlgdirlistcombobox (szpath , idc_combo , idc_curidir,  

ddl_readwrite |ddl_readonly|ddl_hidden| ddl_system|ddl_archive ) ;  

return true ;  

}  38、為什麼旋轉按鈕控制項看起來倒轉  

需要呼叫cspinctrl : : setrange 設定旋轉按鈕控制項的範圍,旋轉按鈕控制項的預設上限為0,預設下限為100,這意味著增加時旋轉按控制項的值由100變為0。下例將旋轉按鈕控制項的範圍設定為0到100:  

bool caboutdlg : : oninitdialog ( )  

visual c++ 4.0 print對話中的copise旋轉按鈕控制項也有同樣的問題:按下up按鈕時拷貝的數目減少,而按下down 按鈕時拷貝的數目增加。  

39為什麼旋轉按鈕控制項不能自動地更新它下面的編輯控制項  

如果使用旋轉按鈕的autu buddy特性, 則必須保證在對話的標記順序中buddy視窗優先於旋轉按鈕控制項。從layout選單中選擇tab order選單項(或者按下crtl+d)可以設定對話的標籤順序。  

40、如何用位圖顯示下壓按鈕  

windows 95按鈕有幾處新的建立風格,尤其是bs_bitmap和bs_icon,要想具有位圖按鈕,建立按鈕和呼叫cbutton : : setbitmap或cbutton : : seticon時要指定bs_bitmap或bs_icon風格。  

首先,設定按鈕的圖示屬性。  

然後,當對話初始化時呼叫cbutton: : seticon。注意:下例用圖示代替位圖,使用點陣圖時要小心,因為不知道背景所有的顏色——並非每個人都使用淺灰色。  

bool csampledlg : : oninitdialog ( )  

使用classwizard處理wm_char訊息,計算nchar參量並決定所執行的操作,使用者可以確定是否修改、傳送字元。下例說明了如何顯示字母字元,如果字元是字母字元,則呼叫cwnd ; onchar,否則不呼叫onchar.  

//only display alphabetic dharacters .  

void cmyedit : : onchar (uint nchar , uint nrepcnt , uitn nflags )  

如果要修改字元,則不能僅僅簡單地用修改過的nchar呼叫cedit : : onchar,然後cedit: : onchar呼叫cwnd: : default獲取原來的wparam 和lparam 的值 ,這樣是不行的。要修改乙個字元,需要首先修改nchar,然後用修改過的nchar呼叫cwnd: : defwindowproc。下例說明了如何將字元轉變為大寫:  

//make all characters uppercase  

void cmyedit : : onchar (uint nchar , uint nrepcnt , uint nflags )  

44、如何改變控制項的顏色  

有兩種方法。其一,可以在父類中指定控制項的顏色,或者利用mfc4.0新的訊息反射在控制項類中指定顏色。當控制項需要重新著色時,工作框呼叫父視窗(通常是對話方塊)的cwnd: : oncrtlcolor,可以在父視窗類中重置該函式並指定控制項的新的繪畫屬性。例如,下述**將對話中的所有編輯控制項文字顏色改為紅色:  

hbrush caboutdig : : onctlcolor (cdc * pdcm , cwnd * pwnd , uint nctlcolor)  

然而,由於每個父視窗必須處理通知訊息並指定每個控制項的繪畫屬性,所以,這種方法不是完全的物件導向的方法。控制項處理該訊息並指定繪畫屬性更合情合理。訊息反射允許使用者這樣做。通知訊息首先傳送給父視窗,如果父視窗沒有處理則傳送給控制項。建立乙個定製彩色列表框控制項必須遵循下述步驟。  

首先,使用classwizard 建立乙個clistbox 的派生類並為該類新增下述資料成員。  

class cmylistbox ; publilc clistbox  

;  其次,在類的建構函式中,初始化資料中。  

cmylistbox : : cmylistbox ()  

最後,使用classwizard處理反射的wm_ctlcolor(=wm_ctlcolor)訊息並指定新的繪畫屬性。  

hbrush cmylistbox : : ctlcolor (cdc* pdc, uint nctlcolor )  

現在,控制項可以自己決定如何繪畫,與父視窗無關。  

45、當向列表框中新增多個項時如何防止閃爍  

呼叫cwnd::setredraw 清除重畫標誌可以禁止clistbox(或者視窗)重畫。當向列表框新增幾個項時,使用者可以清除重畫標誌,然後新增項,最後恢復重畫標誌。為確保重畫列表框的新項,呼叫setredraw (true) 之後呼叫cwnd::invalidate。  

//disable redrawing.  

plistbox->setredraw (false);  

//fill in the list box gere  

//enable drwing and make sure list box is redrawn.  

plistbox->setredraw (true);  

plistbox->invalidate ();  

void csampleview:: ondraw (cdc* pdc)  

也可以呼叫新的sdk函式getsyscolorbrush獲取乙個系統顏色刷子,下例用背景色在視窗中畫乙個橢圓:  

void csampleview:: ondraw (cdc* pdc)  

48、如何獲取gdi物件的屬性資訊  

可以呼叫gdiobject:: getobject。這個函式將指定圖表裝置的訊息寫入到緩衝區。下例建立了幾個有用的輔助函式。  

//determine if font is bold.  

bool isfontbold (const cfont&font)  

//return the size of a bitmap.  

csize getbitmapsize (const cbitmap&bitmap)  

//create a pen with the same color as a brush.  

bool createpenfrombrush (cpen&pen, cost cbrush&brush)  

Visual C 程式設計技巧之四

visual c 程式設計技巧之四 25 如何獲取有關視窗正在處理的當前訊息的資訊 26 如何建立乙個不規則形狀的視窗 27 如何在 中獲取工具條和狀態條的指標 28 如何使能和禁止工具條的工具提示 29 如何設定工具條標題 30 如何建立和使用無模式對話方塊 31 如何在對話方塊中顯示乙個位圖 3...

Visual C 程式設計技巧之七

visual c 程式設計技巧之七 49 如何實現乙個橡皮區矩形 50 如何更新翻轉背景顏色的文字 51 如何建立乙個具有特定點大小的字型 52 如何計算乙個串的大小 53 如何顯示旋轉文字 54 如何正確顯示包含標籤字元的串 55 串太長時如何在其末尾顯示乙個省略號 56 如何快速地格式化乙個 c...

Visual C 程式設計技巧小結

example handle hinstance afxgetinstancehandle 2.如何通過 獲得應用程式主視窗的指標?主視窗的 指標儲存在cwinthread m pmainwnd中,呼叫 afxgetmainwnd實現。afxgetmainwnd showwindow sw show...