VC程序中實現(xiàn)控件的動態(tài)生成與響應_第1頁
VC程序中實現(xiàn)控件的動態(tài)生成與響應_第2頁
VC程序中實現(xiàn)控件的動態(tài)生成與響應_第3頁
VC程序中實現(xiàn)控件的動態(tài)生成與響應_第4頁
VC程序中實現(xiàn)控件的動態(tài)生成與響應_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、VC程序中實現(xiàn)控件的動態(tài)生成與響應 2005-03-11 10:56作者:風林出處:vc在線責任編輯:方舟 動態(tài)控件是指在需要時由Create()創(chuàng)建的控件,這與預先在對話框中放置的控件是不同的。 一、創(chuàng)建動態(tài)控件: 為了對照,我們先來看一下靜態(tài)控件的創(chuàng)建。 放置靜態(tài)控件時必須先建立一個容器,一般是對話框,這時我們在對話框編輯窗口中,從工具窗口中拖出所需控件放在對話框中即可,再適當修改控件ID,設置控件屬性,一個靜態(tài)控件就創(chuàng)建好了,當對話框被顯示時,其上的控件也會顯示。 靜態(tài)控件不需要調用Create()函數(shù)來創(chuàng)建。 而創(chuàng)建動態(tài)控件有很大不同,以下以按鈕為例,看一下動態(tài)控件的創(chuàng)建過程: 1.建

2、立控件ID號: ID號是控件的標識,創(chuàng)建控件前必須先為它設置一個ID號。 打開資源中的“String Table”,在空白行上雙擊鼠標,這時會彈出一個ID屬性對話框,在其中的ID編輯框中輸入ID,如:IDC_MYBUTTON,在Caption中輸入控件標題或注解(注:Caption框不能為空,為空會導致創(chuàng)建失?。@里我輸入的是按鈕上要顯示的文字-動態(tài)按鈕。 2.建立控件對象: 不同種類的控件應創(chuàng)建不同的類對象: ·按鈕控件 CButton (包括普通按鈕、單選按鈕和復選按鈕) ·編輯控件 CEdit ·靜態(tài)文本控件 CStatic ·標簽控件 CTab

3、Ctrl ·旋轉控件 CSpinButtonCtrl ·滑標控件 CSliderCtrl ·多信息編輯控件 CRichEditCtrl ·進度條控件 CProgressCtrl ·滾動條控件 CSrcollBar ·組合框控件 CComboBox ·列表框控件 CListBox ·圖像列表控件 CImageCtrl ·樹狀控件 CTreeCtrl ·動畫控件 CAnimateCtrl 本例中我們創(chuàng)建一個CButton類的普通按鈕。注意不能直接定義CButton對象,如:CButton m_MyB

4、ut;這種定義只能用來給靜態(tài)控件定義控制變量,不能用于動態(tài)控件。 正確做法是用new調用CButton構造函數(shù)生成一個實例: CButton *p_MyBut = new CButton(); 然后用CButton類的Create()函數(shù)創(chuàng)建,該函數(shù)原型如下: BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); lpszCaption是按鈕上顯示的文本;dwStyle指定按鈕風格,可以是按鈕風格與窗口風格的組合,取值有: 窗口風格:dwStyle

5、 ·WS_CHILD 子窗口,必須有 ·WS_VISIBLE 窗口可見,一般都有 ·WS_DISABLED 禁用窗口,創(chuàng)建初始狀態(tài)為灰色不可用的按鈕時使用 ·WS_TABSTOP 可用Tab鍵選擇 ·WS_GROUP 成組,用于成組的單選按鈕中的第一個按鈕 按鈕風格: ·BS_PUSHBUTTON 下壓式 按鈕,也即普通按鈕 ·BS_AUTORADIOBUTTON 含自動選中狀態(tài)的單選按鈕 ·BS_RADIOBUTTON 單選按鈕,不常用 ·BS_AUTOCHECKBOX 含自動選中狀態(tài)的復選按鈕 

6、83;BS_CHECKBOX 復選按鈕,不常用 ·BS_AUTO3STATE 含自動選中狀態(tài)的三態(tài)復選按鈕 ·BS_3STATE 三態(tài)復選按鈕,不常用 以上風格指定了創(chuàng)建的按鈕類型,不能同時使用,但必須有其一。 ·BS_BITMAP 按鈕上將顯示位圖 ·BS_DEFPUSHBUTTON 設置為默認按鈕,只用于下壓式按鈕,一個對話框中只能指定一個默認按鈕 ·rect指定按鈕的大小和位置; ·pParentWnd指示擁有按鈕的父窗口,不能為NULL; ·nID指定與按鈕關聯(lián)的ID號,用上一步創(chuàng)建的ID號。 不同控件類的Creat

7、e()函數(shù)略有不同,可參考相關資料。 例:p_MyBut->Create( "動態(tài)按鈕", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON ); 這樣,我們就在當前對話框中的(20,10)處創(chuàng)建了寬60,高30,按鈕文字為“動態(tài)按鈕”的下壓式按鈕。 為了使創(chuàng)建過程更方便易用,我定義了如下函數(shù): CButton* CTextEditorView:NewMyButton(int nID,CRect rect,int nStyle) CString m_Caption

8、; m_Caption.LoadString( nID ); /取按鈕標題 CButton *p_Button = new CButton(); ASSERT_VALID(p_Button); p_Button->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); /創(chuàng)建按鈕 return p_Button; 其中m_Caption.LoadString( nID )是從字符串表中讀取按鈕文本,這樣在創(chuàng)建按鈕ID時,應該把文本設置好,參數(shù)nStyle為除必須風格外的額外

9、風格。 以下,我調用該函數(shù)創(chuàng)建三個按鈕,并指定第一個按鈕為默認按鈕,按鈕的ID已預先設置好了: CButton *p_MyBut3; p_MyBut0 = NewMyButton( ID_MYBUT1, CRect(10,20,50,35), BS_DEFPUSHBUTTON ); p_MyBut1 = NewMyButton( ID_MYBUT2, CRect(55,20,95,35), 0 ); p_MyBut2 = NewMyButton( ID_MYBUT3, CRect(100,20,140,35), 0 ); 二、動態(tài)控件的響應: 動態(tài)控件的響應函數(shù)不能用ClassWizard添加

10、,只能手動添加。仍以上面的按鈕為例,我們制作按鈕的單擊響應函數(shù)。 1.在MESSAGE_MAP中添加響應函數(shù): MESSAGE_MAP表中定義了消息響應函數(shù),其格式為:消息名(ID,函數(shù)名),當我們用ClassWizard添加函數(shù)時,會自動添加在AFX_MSG_MAP括起的區(qū)間內,如: BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) /AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) /AFX_MSG_MAP END_MESSAGE_MAP() 手工添加時不要添加

11、到AFX_MSG_MAP區(qū)間內,以防ClassWizard不能正常工作,如: BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) /AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) /AFX_MSG_M AP ON_BN_CLICKED(ID_MYBUT1, OnMybut1) ON_BN_CLICKED(ID_MYBUT2, OnMybut2) ON_BN_CLICKED(ID_MYBUT3, OnMybut3) END_MESSAGE_MAP() 其中ON_BN_

12、CLICKED是按鈕單擊消息。 2.在頭文件中添加函數(shù)定義: 用ClassWizard添加函數(shù)時,會在頭文件的AFX_MSG區(qū)間內添加函數(shù)定義,如: protected: /AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); /AFX_MSG DECLARE_MESSAGE_MAP() 我們模仿這種形式,只是把函數(shù)定義添加到AFX_MSG區(qū)間外就行了: protected: /AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); /AFX_MSG afx_msg void OnMybut1()

13、; afx_msg void OnMybut2(); afx_msg void OnMybut3(); DECLARE_MESSAGE_MAP() 3.編寫消息響應函數(shù): 以上是把消息和函數(shù)關聯(lián)起來了,具體在單擊按鈕后應做的工作在函數(shù)中完成: void CTextEditorView:OnMybut1() MessageBox( "哈!你單擊了動態(tài)按鈕。" ); void CTextEditorView:OnMybut2() void CTextEditorView:OnMybut3() 除了按鈕的響應函數(shù)外,你還可以用上面獲得的指針訪問按鈕,如: 修改按鈕的大小和位置:p

14、_MyBut0->MoveWindow(); 修改按鈕文本:p_MyBut0->SetWindowText(); 顯示/隱藏按鈕:p_MyBut0->ShowWindow();等等。 三、回收資源: 由于動態(tài)控件對象是由new生成的,它不會被程序自動釋放,所以需手工釋放。在控件不再使用時可以刪除它: if( p_MyBut0 ) delete p_MyBut0; 以上就是按鈕控件動態(tài)生成的方法。下面,再看一下單選按鈕的動態(tài)生成問題。 四、實例:單選按鈕組的動態(tài)生成 單選按鈕也屬于CButton類,但由于單選按鈕總是成組使用的,所以它在制作和使用上與普通按鈕有一定區(qū)別。 假設有

15、三個單選按鈕組成一組,初始時,第一個單選按鈕處于選中狀態(tài)。 我們先來看靜態(tài)制作方法:在對話框中放置三個單選按鈕,設置屬性如下: ·Radio1屬性:Visible、Group、Tab stop、Auto ·Radio2屬性:Visible、Tab stop、Auto ·Radio3屬性:Visible、Tab stop、Auto 這樣的屬性設置就把三個單選按鈕分成了一組,它們一次只能有一個被選中,若對話框中還有其它成組的單選按鈕,使用時也會互不干擾。但這時還沒有使第一個按鈕處于選中狀態(tài)。 接著就用ClassWizard為這組單選按鈕添加變量,這里只需為第一個單選按

16、鈕添加變量即可。設變量名為m_Radio,類型選為int型。在構造函數(shù)中ClassWizard把m_Radio的值設置為-1,我們把它改為0,這樣在運行程序時可以看到第一個單選按鈕處于選中狀態(tài)了。之后,還應該用ClassWizard為三個單選按鈕添加單擊響應函數(shù),在里面修改m_Radio的值對應 三個單選按鈕就可以了。 以上就是通常制作單選按鈕組的辦法,現(xiàn)我們欲改為動態(tài)生成,主要要解決按鈕分組和單擊控制問題。以下為制作步驟: 1.定義三個單選按鈕的ID: 打開資源中的“String Table”,在其中添加三個ID值: ·第一個:ID為IDC_MYRADIO1,Caption為單選1

17、 ·第二個:ID為IDC_MYRADIO2,Caption為單選2 ·第三個:ID為IDC_MYRADIO3,Caption為單選3 其中Caption為按鈕上要顯示的文字,可根據(jù)需要設置。 2.用CButton類的Create()函數(shù)生成三個單選按鈕: 為方便起見,先定義一個函數(shù)生成單選按鈕: CButton* CTextEditorView:NewMyRadio(int nID,CRect rect,int nStyle) CString m_Caption; m_Caption.LoadString( nID ); /取按鈕標題 CButton *p_Radio =

18、new CButton(); ASSERT_VALID(p_Radio); p_Radio->Create( m_Caption, WS_CHILD | WS_VISIBLE | nStyle | WS_TABSTOP | BS_AUTORADIOBUTTON, rect, this, nID ); /創(chuàng)建按鈕 return p_Radio; 函數(shù)LoadString()用于從“String Table”中讀取按鈕文本,Create()函數(shù)中設定了單選按鈕必須的屬性,其中就包括了Visible、Tab stop、Auto屬性。 參數(shù)nID為單選按鈕ID號,rect為單選按鈕尺寸,nSty

19、le為除必要屬性外的其它屬性。返回值為指向新建按鈕的指針。 有了這個函數(shù)后,創(chuàng)建單選按鈕組時只要依次調用該函數(shù)即可,其中單選按鈕組的第一個單選按鈕必須指定WS_GROUP屬性。 CButton *p_MyRadio3; p_MyRadio0 = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP ); p_MyRadio1 = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 ); p_MyRadio2 = NewMyRadio( IDC_MYRADIO3, CRect(15,126,

20、60,141), 0 ); 3.定義單選按鈕組的控制變量,設置第一個單選按鈕為選中狀態(tài): 這里不能用ClassWizard添加變量,也不要在DoDataExchange()中添加控制變量,因為動態(tài)控件一開始并不存在,在DoDataExchange()中添加控制變量會造成運行錯誤。這里我們只需在頭文件中隨意定義一個int型變量作為控制變量即可,如: int m_SelRadio; 在構造函數(shù)中設置其初值為0:m_SelRadio = 0; 在上面的創(chuàng)建按鈕的語句中,用SetCheck()函數(shù)設置初始選中的按鈕: CButton *p_MyRadio3; p_MyRadio0 = NewMyRad

21、io( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP ); p_MyRadio1 = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 ); p_MyRadio2 = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 ); p_MyRadiom_SelRadio->SetCheck(1); /設置第一個單選為選中狀態(tài) 在SetCheck()函數(shù)中,參數(shù)為1表示設置為選中狀態(tài),為0表示未選中狀態(tài)。 4.添加鼠標單擊響應函數(shù): 鼠標單擊某單選按鈕后,其

22、狀態(tài)已經(jīng)能自動改變,這里我們還需修改控制 變量m_SelRadio的值,以便跟蹤選中的單選按鈕。 首先在MESSAGE_MAP中把鼠標單擊消息與響應函數(shù)聯(lián)系起來: BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) /AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) /ClassWizard在此處添加 /AFX_MSG_MAP ON_BN_CLICKED(IDC_MYRADIO1, OnMyRadio1) /單選按鈕1 ON_BN_CLICKED(IDC_MYRADIO2, OnMyRadio2) /單選按鈕2 ON_BN_CLICKED(IDC_MYR

溫馨提示

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

評論

0/150

提交評論