MFC組件消息及函數(shù)_第1頁
MFC組件消息及函數(shù)_第2頁
MFC組件消息及函數(shù)_第3頁
MFC組件消息及函數(shù)_第4頁
MFC組件消息及函數(shù)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、6.1傳統(tǒng)控件在上一課的表5.1已經(jīng)列出了Windows的傳統(tǒng)控件及其對應(yīng)的控件類。在這些控件中,讀者應(yīng)該重點(diǎn)掌握命令按鈕、選擇框、單選按鈕、編輯框、列表框和組合框。.1.1 傳統(tǒng)控件的控件通知消息控件通過向父窗口發(fā)送控件通知消息來表明發(fā)生了某種事件例如,當(dāng)用戶在按鈕上單擊鼠標(biāo)時(shí),按鈕控件會向父窗口發(fā)送BN_CLICKED消息傳統(tǒng)控件的通知消息實(shí)際上是通過WM_COMMAND消息發(fā)給父窗口的(滾動條除外),在該消息的wParam中含有通知消息碼(如BN_CLICKED)和控件的ID,在lParam中則包含了控件的句柄利用ClassWizard可以很容易地為控件通知消息加入消息映射和消息處理函數(shù)

2、,這在上一章中已經(jīng)演示過了傳統(tǒng)控件的消息映射宏是ON_XXXX,其中XXXX表示通知消息碼,如BN_CLICKEDON_XXXX消息映射如下所示,該宏有兩個(gè)參數(shù),一個(gè)是控件的ID,一個(gè)是消息處理函數(shù)名ON_XXXX(nID, memberFxn)消息處理函數(shù)的聲明應(yīng)該有如下形式:afx_msg void memberFxn( );例如,某按鈕的BN_CLICKED消息的消息映射及其處理函數(shù)的聲明如下所示ON_BN_CLICKED(IDC_ADD,OnAdd)afx_msg void OnAdd( );有時(shí),為了處理方便,需要把多個(gè)ID連續(xù)的控件發(fā)出的相同消息映射到同一個(gè)處理函數(shù)上這就要用到ON

3、_CONTROL_RANGE宏ON_CONTROL_RANGE消息映射宏的第一個(gè)參數(shù)是控件消息碼,第二和第三個(gè)參數(shù)分別指明了一組連續(xù)的控件ID中的頭一個(gè)和最后一個(gè)ID,最后一個(gè)參數(shù)是消息處理函數(shù)名。例如,要處理一組單選按鈕發(fā)出的BN_CLICKED消息,相應(yīng)的消息映射如下所示:ON_CONTROL_RANGE(BN_CLICKED, IDC_FIRST, IDC_LAST, OnRadioClicked)函數(shù)OnRadioClicked的聲明如下,該函數(shù)比上面的OnAdd多了一個(gè)參數(shù)nID以說明發(fā)送通知消息的控件IDafx_msg void OnRadioClicked(UINT nID);C

4、lassWizard不支持ON_CONTROL_RANGE宏,所以需要手工建立消息映射和消息處理函數(shù)提示:事實(shí)上,在使用ClassWizard時(shí)只要運(yùn)用一個(gè)小小的技巧,就可以把不同控件的通知消息映射到同一個(gè)處理函數(shù)上,也可以把一個(gè)控件的不同通知消息映射到同一個(gè)處理函數(shù)上這個(gè)技巧就是在用ClassWizard創(chuàng)建消息處理函數(shù)時(shí),指定相同的函數(shù)名即可此方法的優(yōu)點(diǎn)在于控件的ID不必是連續(xù)的,缺點(diǎn)是處理函數(shù)沒有nID參數(shù),因而不能確定是哪一個(gè)控件發(fā)送的消息6.1.2 靜態(tài)控件靜態(tài)控件包括靜態(tài)正文(Static Text)和圖片控件(Picture)。靜態(tài)正文控件用來顯示正文。圖片控件可以顯示位圖、圖標(biāo)

5、、方框和圖元文件,在圖片控件中顯示圖片的好處是不必操心圖片的重繪問題。靜態(tài)控件不能接收用戶的輸入。在上一章中,讀者已經(jīng)用過靜態(tài)正文和組框控件。圖片控件的例子可以在AppWizard創(chuàng)建的IDD_ABOUTBOX對話框模板中找到,在該模板中有一個(gè)圖片控件用來顯示圖標(biāo)。靜態(tài)控件的主要起說明和裝飾作用。MFC的CStatic類封裝了靜態(tài)控件。CStatic類的成員函數(shù)Create負(fù)責(zé)創(chuàng)建靜態(tài)控件,該函數(shù)的聲明為BOOL Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xf

6、fff );參數(shù)lpszText指定了控件顯示的正文。dwStyle指定了靜態(tài)控件的風(fēng)格,表6.1顯示了靜態(tài)控件的各種風(fēng)格,dwStyle可將這些風(fēng)格組合起來。rect是一個(gè)對RECT或CRect結(jié)構(gòu)的引用,用來說明控件的位置和尺寸。pParentWnd指向父窗口,該參數(shù)不能為NULL。nID則說明了控件的ID。如果創(chuàng)建成功,該函數(shù)返回TRUE,否則返回FALSE表6.1 靜態(tài)控件的風(fēng)格控件風(fēng)格含義SS_BLACKFRAME指定一個(gè)具有與窗口邊界同色的框(缺省為黑色)。SS_BLACKRECT指定一個(gè)具有與窗口邊界同色的實(shí)矩形(缺省為黑色)。SS_CENTER使顯示的正文居中對齊,正文可以回繞

7、。SS_GRAYFRAME指定一個(gè)具有與屏幕背景同色的邊框。SS_GRAYRECT指定一個(gè)具有與屏幕背景同色的實(shí)矩形。SS_ICON使控件顯示一個(gè)在資源中定義的圖標(biāo),圖標(biāo)的名字有Create函數(shù)的lpszText參數(shù)指定。SS_LEFT左對齊正文,正文能回繞。SS_LEFTNOWORDWRAP左對齊正文,正文不能回繞。SS_NOPREFIX使靜態(tài)正文串中的&不是一個(gè)熱鍵提示符。SS_NOTIFY使控件能向父窗口發(fā)送鼠標(biāo)事件消息。SS_RIGHT右對齊正文,可以回繞。SS_SIMPLE使靜態(tài)正文在運(yùn)行時(shí)不能被改變并使正文顯示在單行中。SS_USERITEM指定一個(gè)用戶定義項(xiàng)。SS_WHITEFR

8、AME指定一個(gè)具有與窗口背景同色的框(缺省為白色)。SS_WHITERECT指定一個(gè)具有與窗口背景同色的實(shí)心矩形(缺省為白色)。除了上表中的風(fēng)格外,一般還要為控件指定WS_CHILD和WS_VISIBLE窗口風(fēng)格。一個(gè)典型的靜態(tài)正文控件的風(fēng)格為WS_CHILD|WS_VISIBLE|SS_LEFT。對于用對話框模板編輯器創(chuàng)建的靜態(tài)控件,可以在控件的屬性對話框中指定表6.1中列出的控件風(fēng)格。例如,可以在靜態(tài)正文控件的屬性對話框中選擇Simple,這相當(dāng)于指定了SS_SIMPLE風(fēng)格。Cstatic類主要的成員函數(shù)在表6.2中列出??梢岳肅Wnd類的成員函數(shù)GetWindowText,SetWi

9、ndowText和GetWindowTextLength等函數(shù)來查詢和設(shè)置靜態(tài)控件中顯示的正文表6.2 CStatic類的主要成員函數(shù)函數(shù)聲明用途HBITMAP SetBitmap( HBITMAP hBitmap );指定要顯示的位圖。HBITMAP GetBitmap( ) const;獲取由SetBitmap指定的位圖。HICON SetIcon( HICON hIcon );指定要顯示的圖標(biāo)。HICON GetIcon( ) const;獲取由SetIcon指定的圖標(biāo)。HCURSOR SetCursor( HCURSOR hCursor );指定要顯示的光標(biāo)圖片。HCURSOR Get

10、Cursor( );獲取由SetCursor指定的光標(biāo)。HENHMETAFILE SetEnhMetaFile( HENHMETAFILE hMetaFile );指定要顯示的增強(qiáng)圖元文件。HENHMETAFILE GetEnhMetaFile( ) const;獲取由SetEnhMetaFile指定的圖元文件。靜態(tài)控件較簡單,故這里就不舉例說明了。6.1.3 按鈕控件按鈕是指可以響應(yīng)鼠標(biāo)點(diǎn)擊的小矩形子窗口。按鈕控件包括命令按鈕(Pushbutton)、檢查框(Check Box)、單選按鈕(Radio Button)、組框(Group Box)和自繪式按鈕(Owner-draw Button

11、)。命令按鈕的作用是對用戶的鼠標(biāo)單擊作出反應(yīng)并觸發(fā)相應(yīng)的事件,在按鈕中既可以顯示正文,也可以顯示位圖。選擇框控件可作為一種選擇標(biāo)記,可以有選中、不選中和不確定三種狀態(tài)。單選按鈕控件一般都是成組出現(xiàn)的,具有互斥的性質(zhì),即同組單選按鈕中只能有一個(gè)是被選中的。組框用來將相關(guān)的一些控件聚成一組自繪式按鈕是指由程序而不是系統(tǒng)負(fù)責(zé)重繪的按鈕。按鈕主要是指命令按鈕、選擇框和單選按鈕。后二者實(shí)際上是一種特殊的按鈕,它們有選擇和未選擇狀態(tài)。當(dāng)一個(gè)選擇框處于選擇狀態(tài)時(shí),在小方框內(nèi)會出現(xiàn)一個(gè)“”,當(dāng)單選按鈕處于選擇狀態(tài)時(shí),會在圓圈中顯示一個(gè)黑色實(shí)心圓。此外,檢查框還有一種不確定狀態(tài),這時(shí)檢查框呈灰色顯示,不能接受用

12、戶的輸入,以表明控件是無效的或無意義的。按鈕控件會向父窗口發(fā)出如表6.3所示的控件通知消息。表6.3 按鈕控件的通知消息消息含義BN_CLICKED用戶在按鈕上單擊了鼠標(biāo)。BN_DOUBLECLICKED用戶在按鈕上雙擊了鼠標(biāo)。FC的CButton類封裝了按鈕控件。CButton類的成員函數(shù)Create負(fù)責(zé)創(chuàng)建按鈕控件,該函數(shù)的聲明為BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );參數(shù)lpszCaption指定了按鈕顯示的正文。dwStyle指定了按鈕

13、的風(fēng)格,如表6.4所示,dwStyle可以是這些風(fēng)格的組合。rect說明了按鈕的位置和尺寸。pParentWnd指向父窗口,該參數(shù)不能為NULL。nID是按鈕的ID。如果創(chuàng)建成功,該函數(shù)返回TRUE,否則返回FALSE表6.4 按鈕的風(fēng)格控件風(fēng)格含義BS_AUTOCHECKBOX同BS_CHECKBOX,不過單擊鼠標(biāo)時(shí)按鈕會自動反轉(zhuǎn)。BS_AUTORADIOBUTTON同BS_RADIOBUTTON,不過單擊鼠標(biāo)時(shí)按鈕會自動反轉(zhuǎn)。BS_AUTO3STATE同BS_3STATE,不過單擊按鈕時(shí)會改變狀態(tài)。BS_CHECKBOX指定在矩形按鈕右側(cè)帶有標(biāo)題的選擇框。BS_DEFPUSHBUTTON指

14、定缺省的命令按鈕,這種按鈕的周圍有一個(gè)黑框,用戶可以按回車鍵來快速選擇該按鈕。BS_GROUPBOX指定一個(gè)組框。BS_LEFTTEXT使控件的標(biāo)題顯示在按鈕的左邊。BS_OWNERDRAW指定一個(gè)自繪式按鈕。BS_PUSHBUTTON指定一個(gè)命令按鈕。BS_RADIOBUTTON指定一個(gè)單選按鈕,在圓按鈕的右邊顯示正文。BS_3STATE同BS_CHECKBOX,不過控件有三種狀態(tài):選擇、未選擇和變灰。除了上表中的風(fēng)格外,一般還要為控件指定WS_CHILD、WS_VISIBLE和WS_TABSTOP窗口風(fēng)格,WS_TABSTOP使控件具有Tabstop屬性。創(chuàng)建一個(gè)普通按鈕應(yīng)指定的風(fēng)格為WS

15、_CHILD|WS_VISIBLE|WS_TABSTOP。創(chuàng)建一個(gè)普通檢查框應(yīng)指定風(fēng)格WS_CHILD|WS_VISIBLE|WS_TABSTOP| BS_AUTOCHECKBOX。創(chuàng)建組中第一個(gè)單選按鈕應(yīng)指定風(fēng)格WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP| BS_AUTORADIOBUTTON,組中其它單選按鈕應(yīng)指定風(fēng)格則不應(yīng)該包括WS_TABSTOP和WS_GROUP。對于用對話框模板編輯器創(chuàng)建的按鈕控件,可以在控件的屬性對話框中指定表6.4中列出的控件風(fēng)格。例如,在命令按鈕的屬性對話框中選擇Default button,相當(dāng)于指定了BS_D

16、EFPUSHBUTTON。CButton類的主要的成員函數(shù)有:UINT GetState( ) const;該函數(shù)返回按鈕控件的各種狀態(tài)。可以用下列屏蔽值與函數(shù)的返回值相與,以獲得各種信息。0x0003。用來獲取檢查框或單選按鈕的狀態(tài)。0表示未選中,1表示被選中,2表示不確定狀態(tài)(僅用于檢查框)。0x0004。用來判斷按鈕是否是高亮度顯示的。非零值意味著按鈕是高亮度顯示的。當(dāng)用戶點(diǎn)擊了按鈕并按主鼠標(biāo)左鍵時(shí),按鈕會呈高亮度顯示。0x0008。非零值表示按鈕擁有輸入焦點(diǎn)。void SetState( BOOL bHighlight );當(dāng)參數(shù)bHeightlight值為TRUE時(shí),該函數(shù)將按鈕設(shè)置

17、為高亮度狀態(tài),否則,去除按鈕的高亮度狀態(tài)。int GetCheck( ) const;返回檢查框或單選按鈕的選擇狀態(tài)。返回值0表示按鈕未被選擇,1表示按鈕被選擇,2表示按鈕處于不確定狀態(tài)(僅用于檢查框)。void SetCheck( int nCheck );設(shè)置檢查框或單選按鈕的選擇狀態(tài)。參數(shù)nCheck值的含義與GetCheck返回值相同。UINT GetButtonStyle( ) const;獲得按鈕控件的BS_XXXX風(fēng)格。void SetButtonStyle( UINT nStyle, BOOL bRedraw = TRUE );設(shè)置按鈕的風(fēng)格。參數(shù)nStyle指定了按鈕的風(fēng)格。

18、bRedraw為TRUE則重繪按鈕,否則就不重繪。HBITMAP SetBitmap( HBITMAP hBitmap );設(shè)置按鈕顯示的位圖。參數(shù)hBitmap指定了位圖的句柄。該函數(shù)還會返回按鈕原來的位圖。HBITMAP GetBitmap( ) const;返回以前用SetBitmap設(shè)置的按鈕位圖。HICON SetIcon( HICON hIcon );設(shè)置按鈕顯示的圖標(biāo)。參數(shù)hIcon指定了圖標(biāo)的句柄。該函數(shù)還會返回按鈕原來的圖標(biāo)。HICON GetIcon( ) const;返回以前用SetIcon設(shè)置的按鈕圖標(biāo)。HCURSOR SetCursor( HCURSOR hCurso

19、r );設(shè)置按鈕顯示的光標(biāo)圖。參數(shù)hCursor指定了光標(biāo)的句柄。該函數(shù)還會返回按鈕原來的光標(biāo)。HCURSOR GetCursor( );返回以前用GetCursor設(shè)置的光標(biāo)。另外,可以使用下列的一些與按鈕控件有關(guān)的CWnd成員函數(shù)來設(shè)置或查詢按鈕的狀態(tài)。用這些函數(shù)的好處在于不必構(gòu)建按鈕控件對象,只要知道按鈕的ID,就可以直接設(shè)置或查詢按鈕。void CheckDlgButton( int nIDButton, UINT nCheck );用來設(shè)置按鈕的選擇狀態(tài)。參數(shù)nIDButton指定了按鈕的ID。nCheck的值0表示按鈕未被選擇,1表示按鈕被選擇,2表示按鈕處于不確定狀態(tài)。void

20、CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );用來選擇組中的一個(gè)單選按鈕。參數(shù)nIDFirstButton指定了組中第一個(gè)按鈕的ID,nIDLastButton指定了組中最后一個(gè)按鈕的ID,nIDCheckButton指定了要選擇的按鈕的ID。int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );該函數(shù)用來獲得一組單選按鈕中被選中按鈕的ID。參數(shù)nIDFirstButton說明了組中第一個(gè)按鈕的ID,nID

21、LastButton說明了組中最后一個(gè)按鈕的ID。UINT IsDlgButtonChecked( int nIDButton ) const;返回檢查框或單選按鈕的選擇狀態(tài)。返回值0表示按鈕未被選擇,1表示按鈕被選擇,2表示按鈕處于不確定狀態(tài)(僅用于檢查框)??梢哉{(diào)用CWnd成員函數(shù)GetWindowText,GetWindowTextLength和SetWindowText來查詢或設(shè)置按鈕中顯示的正文MFC還提供了CButton的派生類CBitmapButton。利用該類可以創(chuàng)建一個(gè)擁有四幅位圖的命令按鈕,按鈕在不同狀態(tài)時(shí)會顯示不同的位圖,這樣可以使界面顯得生動活潑。如果讀者對CBitma

22、pButton感興趣,可以參看VC5.0隨盤提供的MFC例子CTRLTEST。在上一章的Register例子中已演示了各種按鈕控件的使用,故這里就不再舉例了。6.1.4 編輯框控件編輯框(Edit Box)控件實(shí)際上是一個(gè)簡易的正文編輯器,用戶可以在編輯框中輸入并編輯正文。編輯框既可以是單行的,也可以是多行的,多行編輯框是從零開始編行號的在一個(gè)多行編輯框中,除了最后一行外,每一行的結(jié)尾處都有一對回車換行符(用rn表示)這對回車換行符是正文換行的標(biāo)志,在屏幕上是不可見的編輯框控件會向父窗口發(fā)出如表6.5所示的控件通知消息。表6.5消息含義EN_CHANGE編輯框的內(nèi)容被用戶改變了。與EN_UPD

23、ATE不同,該消息是在編輯框顯示的正文被刷新后才發(fā)出的。EN_ERRSPACE編輯框控件無法申請足夠的動態(tài)內(nèi)存來滿足需要。EN_HSCROLL用戶在水平滾動條上單擊鼠標(biāo)。EN_KILLFOCUS編輯框失去輸入焦點(diǎn)。EN_MAXTEXT輸入的字符超過了規(guī)定的最大字符數(shù)。在沒有ES_AUTOHSCROLL或ES_AUTOVSCROLL的編輯框中,當(dāng)正文超出了編輯框的邊框時(shí)也會發(fā)出該消息。EN_SETFOCUS編輯框獲得輸入焦點(diǎn)。EN_UPDATE在編輯框準(zhǔn)備顯示改變了的正文時(shí)發(fā)送該消息。EN_VSCROLL用戶在垂直滾動條上單擊鼠標(biāo)。MFC的CEdit類封裝了編輯框控件。CEdit類的成員函數(shù)Cr

24、eate負(fù)責(zé)創(chuàng)建按鈕控件,該函數(shù)的聲明為BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );參數(shù)dwStyle指定了編輯框控件風(fēng)格,如表6.6所示,dwStyle可以是這些風(fēng)格的組合。rect指定了編輯框的位置和尺寸。pParentWnd指定了父窗口,不能為NULL。編輯框的ID由nID指定。如果創(chuàng)建成功,該函數(shù)返回TRUE,否則返回FALSE表6.6 編輯框控件的風(fēng)格控件風(fēng)格含義ES_AUTOHSCROLL當(dāng)用戶在行尾鍵入一個(gè)字符時(shí),正文將自動向右滾動10個(gè)字符,當(dāng)用戶按回車鍵時(shí),正文總是滾向左

25、邊。ES_AUTOVSCROLL當(dāng)用戶在最后一個(gè)可見行按回車鍵時(shí),正文向上滾動一頁。ES_CENTER在多行編輯框中使正文居中。ES_LEFT左對齊正文。ES_LOWERCASE把用戶輸入的字母統(tǒng)統(tǒng)轉(zhuǎn)換成小寫字母。ES_MULTILINE指定一個(gè)多行編輯器。若多行編輯器不指定ES_AUTOHSCROLL風(fēng)格,則會自動換行,若不指定ES_AUTOVSCROLL,則多行編輯器會在窗口中正文裝滿時(shí)發(fā)出警告聲響。ES_NOHIDESEL缺省時(shí),當(dāng)編輯框失去輸入焦點(diǎn)后會隱藏所選的正文,當(dāng)獲得輸入焦點(diǎn)時(shí)又顯示出來。設(shè)置該風(fēng)格可禁止這種缺省行為。ES_OEMCONVERT使編輯框中的正文可以在ANSI字符集

26、和OEM字符集之間相互轉(zhuǎn)換。這在編輯框中包含文件名時(shí)是很有用的。ES_PASSWORD使所有鍵入的字符都用“*”來顯示。ES_RIGHT右對齊正文。ES_UPPERCASE把用戶輸入的字母統(tǒng)統(tǒng)轉(zhuǎn)換成大寫字母。ES_READONLY將編輯框設(shè)置成只讀的。ES_WANTRETURN使多行編輯器接收回車鍵輸入并換行。如果不指定該風(fēng)格,按回車鍵會選擇缺省的命令按鈕,這往往會導(dǎo)致對話框的關(guān)閉。除了上表中的風(fēng)格外,一般還要為控件指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_BORDER窗口風(fēng)格,WS_BORDER使控件帶邊框。創(chuàng)建一個(gè)普通的單行編輯框應(yīng)指定風(fēng)格為WS_CHILD|

27、WS_VISIBLE|WS_TABSTOP |WS_BORDER|ES_LEFT|ES_AUTOHSCROLL,這將創(chuàng)建一個(gè)帶邊框、左對齊正文、可水平滾動的單行編輯器。要創(chuàng)建一個(gè)普通多行編輯框,還要附加ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL |WS_HSCROLL| WS_VSCROLL風(fēng)格,這將創(chuàng)建一個(gè)可水平和垂直滾動的,帶有水平和垂直滾動條的多行編輯器。對于用對話框模板編輯器創(chuàng)建的編輯框控件,可以在控件的屬性對話框中指定表6.6中列出的控件風(fēng)格。例如,在屬性對話框中選擇Multi-line項(xiàng),相當(dāng)與指定了ES_MULTILINE風(fēng)格。編輯框支持剪

28、貼板操作。CEdit類提供了一些與剪貼板有關(guān)的成員函數(shù),如表6.7所示。表6.7 與剪切板有關(guān)的CEdit成員函數(shù)函數(shù)聲明用途void Clear( )清除編輯框中被選擇的正文。void Copy( )把在編輯框中選擇的正文拷貝到剪貼板中。void Cut( )清除編輯框中被選擇的正文并把這些正文拷貝到剪貼板中。void Paste( )將剪貼板中的正文插入到編輯框的當(dāng)前插入符處。BOOL Undo( )撤消上一次鍵入。對于單行編輯框,該函數(shù)總返回TRUE,對于多行編輯框,返回TRUE表明操作成功,否則返回FALSE。可以用下列CEdit或CWnd類的成員函數(shù)來查詢編輯框。在學(xué)習(xí)下面的函數(shù)時(shí),

29、讀者會經(jīng)常遇到術(shù)語字符索引字符的字符索引是指從編輯框的開頭字符開始的字符編號,它是從零開始編號的也就是說,字符索引實(shí)際上是指當(dāng)把整個(gè)編輯正文看作一個(gè)字符串?dāng)?shù)組時(shí),該字符所在的數(shù)組元素的下標(biāo)int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;void GetWindowText( CString& rString ) const;這兩個(gè)函數(shù)均是CWnd類的成員函數(shù),可用來獲得窗口的標(biāo)題或控件中的正文。第一個(gè)版本的函數(shù)用lpszStringBuf參數(shù)指向的字符串?dāng)?shù)組作為拷貝正文的緩沖區(qū),參數(shù)nMaxCount可以拷貝到緩沖區(qū)

30、中的最大字符數(shù),該函數(shù)返回以字節(jié)為單位的實(shí)際拷貝字符數(shù)(不包括結(jié)尾的空字節(jié))。第二個(gè)版本的函數(shù)用一個(gè)CString對象作為緩沖區(qū)。int GetWindowTextLength( ) const;CWnd的成員函數(shù),可用來獲得窗口的標(biāo)題或控件中的正文的長度。DWORD GetSel( ) const;void GetSel( int& nStartChar, int& nEndChar ) const;兩個(gè)函數(shù)都是CEdit的成員函數(shù),用來獲得所選正文的位置。GetSel的第一個(gè)版本返回一個(gè)DWORD值,其中低位字說明了被選擇的正文開始處的字符索引,高位字說明了選擇的正文結(jié)束處的后面一個(gè)字符的

31、字符索引,如果沒有正文被選擇,那么返回的低位和高位字節(jié)都是當(dāng)前插入符所在字符的字符索引。GetSel的第二個(gè)版本的兩個(gè)參數(shù)是兩個(gè)引用,其含義與第一個(gè)版本函數(shù)返回值的低位和高位字相同。int LineFromChar( int nIndex = 1 ) const;CEdit的成員函數(shù),僅用于多行編輯框,用來返回指定字符索引所在行的行索引(從零開始編號)。參數(shù)nIndex指定了一個(gè)字符索引,如果nIndex是-1,那么函數(shù)將返回選擇正文的第一個(gè)字符所在行的行號,若沒有正文被選擇,則該函數(shù)會返回當(dāng)前的插入符所在行的行號。int LineIndex( int nLine = 1 ) const;CE

32、dit的成員函數(shù),僅用于多行編輯框,用來獲得指定行的開頭字符的字符索引,如果指定行超過了編輯框中的最大行數(shù),該函數(shù)將返回-1。參數(shù)nLine是指定了從零開始的行索引,如果它的值為-1,則函數(shù)返回當(dāng)前的插入符所在行的字符索引。int GetLineCount( ) const;CEdit的成員函數(shù),僅用于多行編輯框,用來獲得正文的行數(shù)。如果編輯框是空的,那么該函數(shù)的返回值是1。int LineLength( int nLine = 1 ) const;CEdit的成員函數(shù),用于獲取指定字符索引所在行的字節(jié)長度(行尾的回車和換行符不計(jì)算在內(nèi))。參數(shù)nLine說明了字符索引如果nLine的值為-1,

33、則函數(shù)返回當(dāng)前行的長度(假如沒有正文被選擇),或選擇正文占據(jù)的行的字符總數(shù)減去選擇正文的字符數(shù)(假如有正文被選擇)。若用于單行編輯框,則函數(shù)返回整個(gè)正文的長度。int GetLine( int nIndex, LPTSTR lpszBuffer ) const;int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;CEdit的成員函數(shù),僅用于多行編輯框,用來獲得指定行的正文(不包括行尾的回車和換行符)。參數(shù)nIndex是行號,lpszBuffer指向存放正文的緩沖區(qū),nMaxLength規(guī)定了拷貝的最大字節(jié)數(shù),若。

34、函數(shù)返回實(shí)際拷貝的字節(jié)數(shù),若指定的行號大于編輯框的實(shí)際行數(shù),則函數(shù)返回0。需要注意的是,GetLine函數(shù)不會在緩沖區(qū)中字符串的末尾加字符串結(jié)束符(NULL)下列CWnd或CEdit類的成員函數(shù)可用來修改編輯框控件。void SetWindowText( LPCTSTR lpszString );CWnd的成員函數(shù),可用來設(shè)置窗口的標(biāo)題或控件中的正文。參數(shù)lpszString可以是一個(gè)CString對象,或是一個(gè)指向字符串的指針。void SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );void SetSel( int nStartCha

35、r, int nEndChar, BOOL bNoScroll = FALSE );CEdit的成員函數(shù),用來選擇編輯框中的正文。參數(shù)dwSelection的低位字說明了選擇開始處的字符索引,高位字說明了選擇結(jié)束處的字符索引。如果低位字為0且高位字節(jié)為-1,那么就選擇所有的正文,如果低位字節(jié)為-1,則取消所有的選擇參數(shù)bNoScroll的值如果是FALSE,則滾動插入符并使之可見,否則就不滾動參數(shù)nStartChar和nEndChar的含義與參數(shù)dwSelection的低位字和高位字相同void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo =

36、FALSE );CEdit的成員函數(shù),用來將所選正文替換成指定的正文參數(shù)lpszNewText指向用來替換的字符串參數(shù)bCanUndo的值為TRUE說明替換是否可以被撤消的在調(diào)用上述函數(shù)時(shí),如果涉及的是一個(gè)多行編輯框,那么除了LineLength和GetLine函數(shù)外,都要把回車和換行符考慮在內(nèi)例如,假設(shè)在編輯框中有如下幾行正文:abcdefgij那么字母e的字符索引是6而不是4,因?yàn)閍bcd后面還有一對回車換行符調(diào)用LineLength(7)會返回第二行的長度3調(diào)用LineIndex(2)會得到11調(diào)用LineFromChar(8)會返回1如果沒有選擇任何正文,并且插入符在字母e上,那么調(diào)用

37、GetSel返回值的低位和高位字都是6通過分析上述函數(shù),我們可以總結(jié)出一些查詢和設(shè)置編輯框的方法調(diào)用CWnd的成員函數(shù)GetWindowText和SetWindowText可以查詢和設(shè)置編輯框的整個(gè)正文,在上一章的Register程序中,我們就使用過這兩個(gè)函數(shù)如果想對多行編輯框逐行查詢,那么應(yīng)該先調(diào)用GetLineCount獲得總行數(shù),然后再調(diào)用GetLine來獲取每一行的正文下面一段代碼演示了如何對多行編輯框進(jìn)行逐行查詢char buf40;int total=MyEdit.GetLineCount();int i,length;for(i=0;itotal;i+)length=MyEdit

38、.GetLine(i,buf,39);buflength=0; /加字符串結(jié)束符. . . . . .可以利用LineIndex和LineFromChar來在字符索引和字符的行列坐標(biāo)之間相互轉(zhuǎn)換下列代碼演示了在已知字符索引的情況下,如何獲得對應(yīng)的行列坐標(biāo):int row,column;row=MyEdit.LineFromChar(charIndex);column=charIndex-MyEdit.LineIndex(row);下列代碼演示了在已知字符的行列坐標(biāo)的情況下,如何獲得對應(yīng)的字符索引:int charIndex;charIndex=MyEdit.LineIndex(row)+col

39、umn;不難看出字符索引與對應(yīng)的行列坐標(biāo)的關(guān)系是:字符索引=LineIndex(行坐標(biāo))+列坐標(biāo)對于選擇正文的查詢和設(shè)置,應(yīng)該利用函數(shù)GetSel、SetSel和ReplaceSel可以利用GetSel和SetSel來查詢和設(shè)置插入符的位置SetSel可以使編輯框滾動到插入符的新位置要獲取插入符的行列坐標(biāo),可用下面的代碼實(shí)現(xiàn):MyEdit.SetSel(-1,0); /取消正文的選擇int start,end,row,column;MyEdit.GetSel(start,end); /start或end的值就是插入符的字符索引row=MyEdit.LineFromChar(start); /獲

40、取插入符的行坐標(biāo)column=start-MyEdit.LineIndex(row); /獲取插入符的列坐標(biāo)下面的代碼演示了如何把插入符移到指定的行和列:MyEdit.SetSel(-1,0); /取消正文的選擇int charIndex=MyEdit.LineIndex(row)+column;MyEdit.SetSel(charIndex,charIndex);可以利用ReplaceSel函數(shù)在 插入符處插入正文,典型的代碼如下所示:MyEdit.SetSel(-1,0); /取消正文的選擇MyEdit.ReplaceSel(“.”);可以利用ReplaceSel清除編輯框中的正文,典型的

41、代碼如下所示:MyEdit.SetSel(0,-1); /選擇全部正文MyEdit.ReplaceSel(“”);在后面的小節(jié)中,讀者將會看到使用編輯框的例子.1.5 滾動條控件滾動條(Scroll Bar)主要用來從某一預(yù)定義值范圍內(nèi)快速有效地進(jìn)行選擇滾動條分垂直滾動條和水平滾動條兩種在滾動條內(nèi)有一個(gè)滾動框,用來表示當(dāng)前的值用鼠標(biāo)單擊滾動條,可以使?jié)L動框移動一頁或一行,也可以直接拖動滾動框滾動條既可以作為一個(gè)獨(dú)立控件存在,也可以作為窗口、列表框和組合框的一部分Windows 95的滾動條支持比例滾動框,即用滾動框的大小來反映頁相對于整個(gè)范圍的大小Windows 3.x使用單獨(dú)的滾動條控件來調(diào)

42、整調(diào)色板、鍵盤速度以及鼠標(biāo)靈敏度,在Windows 95中,滾動條控件被軌道條取代(參見6.2.3)不提倡使用單獨(dú)的滾動條控件需要指出的是,從性質(zhì)上劃分,滾動條可分為標(biāo)準(zhǔn)滾動條和滾動條控件兩種標(biāo)準(zhǔn)滾動條是由WS_HSCROLL或WS_VSCROLL風(fēng)格指定的,它不是一個(gè)實(shí)際的窗口,而是窗口的一個(gè)組成部分(例如列表框中的滾動條),只能位于窗口的右側(cè)(垂直滾動條)或底端(水平滾動條)標(biāo)準(zhǔn)滾動條是在窗口的非客戶區(qū)中創(chuàng)建的與之相反,滾動條控件并不是窗口的一個(gè)零件,而是一個(gè)實(shí)際的窗口,可以放置在窗口客戶區(qū)的任意地方,它既可以獨(dú)立存在,也可以與某一個(gè)窗口組合,行使?jié)L動窗口的職能由于滾動條控件是一個(gè)獨(dú)立窗口

43、,因此可以擁有輸入焦點(diǎn),可以響應(yīng)光標(biāo)控制鍵,如PgUp、PgDown、Home和EndMFC的CScrollBar類封裝了滾動條控件CScrollBar類的Create成員函數(shù)負(fù)責(zé)創(chuàng)建控件,該函數(shù)的聲明為BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );參數(shù)dwStyle指定了控件的風(fēng)格rect說明了控件的位置和尺寸pParentWnd指向父窗口,該參數(shù)不能為NULL。nID則說明了控件的ID。如果創(chuàng)建成功,該函數(shù)返回TRUE,否則返回FALSE要創(chuàng)建一個(gè)普通的水平滾動條控件,應(yīng)指定風(fēng)格WS_C

44、HILD|WS_VISIBLE|BS_HORZ要創(chuàng)建一個(gè)普通的垂直滾動條控件,應(yīng)指定風(fēng)格WS_CHILD|WS_VISIBLE|BS_VERT主要的CScrollBar類成員函數(shù)如下所示:int GetScrollPos( ) const;該函數(shù)返回滾動框的當(dāng)前位置若操作失敗則返回0int SetScrollPos( int nPos, BOOL bRedraw = TRUE );該函數(shù)將滾動框移動到指定位置參數(shù)nPos指定了新的位置參數(shù)bRedraw表示是否需要重繪滾動條,如果為TRUE,則重繪之函數(shù)返回滾動框原來的位置若操作失敗則返回0void GetScrollRange( LPINT

45、lpMinPos, LPINT lpMaxPos ) const;該函數(shù)對滾動條的滾動范圍進(jìn)行查詢參數(shù)lpMinPos和lpMaxPos分別指向滾動范圍的最小最大值void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );該函數(shù)用于指定滾動條的滾動范圍參數(shù)nMinPos和nMaxPos分別指定了滾動范圍的最小最大值由這兩者指定的滾動范圍不得超過32767當(dāng)兩者都為0時(shí),滾動條將被隱藏參數(shù)bRedraw表示是否需要重繪滾動條,如果為TRUE,則重繪之BOOL GetScrollInfo( LPSCROLLINFO l

46、pScrollInfo, UINT nMask );該函數(shù)用來獲取滾動條的各種狀態(tài),包括滾動范圍、滾動框的位置和頁尺寸參數(shù)lpScrollInfo指向一個(gè)SCROLLINFO結(jié)構(gòu),該結(jié)構(gòu)如下所示:typedef struct tagSCROLLINFO UINT cbSize; /結(jié)構(gòu)的尺寸(字節(jié)為單位)UINT fMask; /*說明結(jié)構(gòu)中的哪些參數(shù)是有效的,可以是屏蔽值的組合, 如SIF_POS|SIF_PAGE,若為SIF_ALL則整個(gè)結(jié)構(gòu)都有效*/int nMin; /滾動范圍最大值,當(dāng)fMask中包含SIF_RANGE時(shí)有效int nMax; /滾動范圍最小值,當(dāng)fMask中包含SI

47、F_RANGE時(shí)有效UINT nPage; /*頁尺寸,用來確定比例滾動框的大小,當(dāng)fMask中包含 SIF_PAGE時(shí)有效*/int nPos; /滾動框的位置,當(dāng)fMask中包含SIF_POS有效int nTrackPos; /*拖動時(shí)滾動框的位置,當(dāng)fMask中包含 SIF_TRACKPOS時(shí)有效,該參數(shù)只能查詢,不能設(shè) 置,最好不要用該參數(shù)來查詢拖動時(shí)滾動框的位置*/ SCROLLINFO;typedef SCROLLINFO FAR *LPSCROLLINFO;參數(shù)nMask的意義與SCROLLINFO結(jié)構(gòu)中的fMask相同函數(shù)在獲得有效值后返回TRUE,否則返回FALSEBOOL

48、SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );該函數(shù)用于設(shè)置滾動條的各種狀態(tài),一個(gè)重要用途是設(shè)定頁尺寸從而實(shí)現(xiàn)比例滾動框參數(shù)lpScrollInfo指向一個(gè)SCROLLINFO結(jié)構(gòu),參數(shù)bRedraw表示是否需要重繪滾動條,如果為TRUE,則重繪之若操作成功,該函數(shù)返回TRUE,否則返回FALSECWnd類也提供了一些函數(shù)來查詢和設(shè)置所屬的標(biāo)準(zhǔn)滾動條這些函數(shù)與CScrollBar類的函數(shù)同名,且功能相同,但每個(gè)函數(shù)都多了一個(gè)參數(shù),用來選擇滾動條例如,CWnd: GetScrollPos 的聲明為int GetSc

49、rollPos( int nBar ) const;參數(shù)nBar用來選擇滾動條,可以為下列值:SB_HORZ /指定水平滾動條SB_VERT /指定垂直滾動條無論是標(biāo)準(zhǔn)滾動條,還是滾動條控件,滾動條的通知消息都是用WM_HSCROLL和WM_VSCROLL消息發(fā)送出去的對這兩個(gè)消息的確省處理函數(shù)是CWnd:OnHScroll和CWnd:OnVScroll,它們幾乎什么也不做一般需要在派生類中對這兩個(gè)函數(shù)從新設(shè)計(jì),以實(shí)現(xiàn)滾動功能這兩個(gè)函數(shù)的聲明為afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );af

50、x_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );參數(shù)nSBCode是通知消息碼,如表6.8所示nPos是滾動框的位置,只有在nSBCode為SB_THUMBPOSITION或SB_THUMBTRACK時(shí),該參數(shù)才有意義如果通知消息是滾動條控件發(fā)來的,那么pScrollBar是指向該控件的指針,如果是標(biāo)準(zhǔn)滾動條發(fā)來的,則pScrollBar為NULL表6.8滾動條的通知消息碼消息含義SB_BOTTOM / SB_RIGHT(二者的消息碼是一樣的,因此可以混用,下同)滾動到底端(右端)SB_TOP /

51、SB_LEFT滾動到頂端(左端)SB_LINEDOWN / SB_LINERIGHT向下(向右)滾動一行(列)SB_LINEUP / SB_LINELEFT向上(向左)滾動一行(列)SB_PAGEDOWN / SB_PAGERIGHT向下(向右)滾動一頁SB_PAGEUP / SB_PAGELEFT向上(向左)滾動一頁SB_THUMBPOSITION滾動到指定位置SB_THUMBTRACK滾動框被拖動可利用該消息來跟蹤對滾動框的拖動SB_ENDSCROLL滾動結(jié)束6.1.8小節(jié)的例子中,讀者將學(xué)會如何使用滾動條以及如何編寫自己的OnHScroll函數(shù)6.1.6 列表框控件列表框主要用于輸入,它

52、允許用戶從所列出的表項(xiàng)中進(jìn)行單項(xiàng)或多項(xiàng)選擇,被選擇的項(xiàng)呈高亮度顯示列表框具有邊框,并且一般帶有一個(gè)垂直滾動條列表框分單選列表框和多重選擇列表框兩種單選列表框一次只能選擇一個(gè)列表項(xiàng),而多重選擇列表框可以進(jìn)行多重選擇對于列表項(xiàng)的選擇,微軟公司有如下建議:單擊鼠標(biāo)選擇一個(gè)列表項(xiàng),單擊一個(gè)按鈕來處理選擇的項(xiàng)雙擊鼠標(biāo)選擇一個(gè)列表項(xiàng)是處理選擇項(xiàng)的快捷方法列表框會向父窗口發(fā)送如表6.9所示的通知消息表6.9 列表框控件的通知消息消息含義LBN_DBLCLK用戶用鼠標(biāo)雙擊了一列表項(xiàng)只有具有LBS_NOTIFY的列表框才能發(fā)送該消息LBN_ERRSPACE列表框不能申請足夠的動態(tài)內(nèi)存來滿足需要LBN_KILLF

53、OCUS列表框失去輸入焦點(diǎn)LBN_SELCANCEL當(dāng)前的選擇被取消只有具有LBS_NOTIFY的列表框才能發(fā)送該消息LBN_SELCHANGE單擊鼠標(biāo)選擇了一列表項(xiàng)只有具有LBS_NOTIFY的列表框才能發(fā)送該消息LBN_SETFOCUS列表框獲得輸入焦點(diǎn)WM_CHARTOITEM當(dāng)列表框收到WM_CHAR消息后,向父窗口發(fā)送該消息只有具有LBS_WANTKEYBOARDINPUT風(fēng)格的列表框才會發(fā)送該消息WM_VKEYTOITEM當(dāng)列表框收到WM_KEYDOWN消息后,向父窗口發(fā)送該消息只有具有LBS_WANTKEYBOARDINPUT風(fēng)格的列表框才會發(fā)送該消息MFC的CListBox類封

54、裝了列表框CListBox類的Create成員函數(shù)負(fù)責(zé)列表框的創(chuàng)建,該函數(shù)的聲明是BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );參數(shù)dwStyle指定了列表框控件的風(fēng)格,如表6.10所示,dwStyle可以是這些風(fēng)格的組合rect說明了控件的位置和尺寸pParentWnd指向父窗口,該參數(shù)不能為NULL。nID則說明了控件的ID。如果創(chuàng)建成功,該函數(shù)返回TRUE,否則返回FALSE表6.10 列表框控件的風(fēng)格控件風(fēng)格含義LBS_EXTENDEDSEL支持多重選擇在點(diǎn)擊列表項(xiàng)時(shí)按住Shift鍵

55、或Ctrl鍵即可選擇多個(gè) 項(xiàng)LBS_HASSTRINGS指定一個(gè)含有字符串的自繪式列表框LBS_MULTICOLUMN指定一個(gè)水平滾動的多列列表框,通過調(diào)用CListBox:SetColumnWidth來設(shè)置每列的寬度LBS_MULTIPLESEL支持多重選擇列表項(xiàng)的選擇狀態(tài)隨著用戶對該項(xiàng)單擊或雙擊鼠標(biāo)而翻轉(zhuǎn)LBS_NOINTEGRALHEIGHT列表框的尺寸由應(yīng)用程序而不是Windows指定通常,Windows指定尺寸會使列表項(xiàng)的某些部分隱藏起來LBS_NOREDRAW當(dāng)選擇發(fā)生變化時(shí)防止列表框被更新,可發(fā)送WM_SETREDRAW來改變該風(fēng)格LBS_NOTIFY當(dāng)用戶單擊或雙擊鼠標(biāo)時(shí)通知父

56、窗口LBS_OWNERDRAWFIXED指定自繪式列表框,即由父窗口負(fù)責(zé)繪制列表框的內(nèi)容,并且列表項(xiàng)有相同的高度LBS_OWNERDRAWVARIABLE指定自繪式列表框,并且列表項(xiàng)有不同的高度LBS_SORT使插入列表框中的項(xiàng)按升序排列LBS_STANDARD相當(dāng)于指定了WS_BORDER|WS_VSCROLL|LBS_SORT |LBS_NOTIFYLBS_USETABSTOPS使列表框在顯示列表項(xiàng)時(shí)識別并擴(kuò)展制表符(t),缺省的制表寬度是32個(gè)對話框單位LBS_WANTKEYBOARDINPUT允許列表框的父窗口接收WM_VKEYTOITEM和WM_CHARTOITEM消息,以響應(yīng)鍵盤輸入LBS_DISABLENOSCROLL使列表框在不需要滾動時(shí)顯示

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論