版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、VC動態(tài)創(chuàng)建控件動態(tài)控件是指在需要時由Create()創(chuàng)建的控件,這與預(yù)先在對話框中放置的控件是不同的。一、創(chuàng)建動態(tài)控件:為了對照,我們先來看一下靜態(tài)控件的創(chuàng)建。放置靜態(tài)控件時必須先建立一個容器,一般是對話框,這時我們在對話框編輯窗口中,從工具窗口中拖出所需控件放在對話框中即可,再適當(dāng)修改控件ID,設(shè)置控件屬性,一個靜態(tài)控件就創(chuàng)建好了,當(dāng)對話框被顯示時,其上的控件也會顯示。靜態(tài)控件不需要調(diào)用Create()函數(shù)來創(chuàng)建。而創(chuàng)建動態(tài)控件有很大不同,以下以按鈕為例,看一下動態(tài)控件的創(chuàng)建過程:1.建立控件ID號:ID號是控件的標(biāo)識,創(chuàng)建控件前必須先為它設(shè)置一個ID號。打開資源中的“String Tab
2、le”,在空白行上雙擊鼠標(biāo),這時會彈出一個ID屬性對話框,在其中的ID編輯框中輸入ID,如:IDC_MYBUTTON,在Caption中輸入控件標(biāo)題或注解(注:Caption框不能為空,為空會導(dǎo)致創(chuàng)建失敗),這里我輸入的是按鈕上要顯示的文字-動態(tài)按鈕。2.建立控件對象:不同種類的控件應(yīng)創(chuàng)建不同的類對象:·按鈕控件 CButton (包括普通按鈕、單選按鈕和復(fù)選按鈕)·編輯控件 CEdit·靜態(tài)文本控件 CStatic·標(biāo)簽控件 CTabCtrl·旋轉(zhuǎn)控件 CSpinButtonCtrl·滑標(biāo)控件 CSliderCtrl·多信
3、息編輯控件 CRichEditCtrl·進(jìn)度條控件 CProgressCtrl·滾動條控件 CSrcollBar·組合框控件 CComboBox·列表框控件 CListBox·圖像列表控件 CImageCtrl·樹狀控件 CTreeCtrl·動畫控件 CAnimateCtrl本例中我們創(chuàng)建一個CButton類的普通按鈕。注意不能直接定義CButton對象,如:CButton m_MyBut;這種定義只能用來給靜態(tài)控件定義控制變量,不能用于動態(tài)控件。正確做法是用new調(diào)用CButton構(gòu)造函數(shù)生成一個實例:CButton *p
4、_MyBut = new CButton();然后用CButton類的Create()函數(shù)創(chuàng)建,該函數(shù)原型如下:BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );lpszCaption是按鈕上顯示的文本;dwStyle指定按鈕風(fēng)格,可以是按鈕風(fēng)格與窗口風(fēng)格的組合,取值有:窗口風(fēng)格:·WS_CHILD 子窗口,必須有·WS_VISIBLE 窗口可見,一般都有·WS_DISABLED 禁用窗口,創(chuàng)建初始狀態(tài)為灰色不可用的
5、按鈕時使用·WS_TABSTOP 可用Tab鍵選擇·WS_GROUP 成組,用于成組的單選按鈕中的第一個按鈕按鈕風(fēng)格:·BS_PUSHBUTTON 下壓式按鈕,也即普通按鈕·BS_AUTORADIOBUTTON 含自動選中狀態(tài)的單選按鈕·BS_RADIOBUTTON 單選按鈕,不常用·BS_AUTOCHECKBOX 含自動選中狀態(tài)的復(fù)選按鈕·BS_CHECKBOX 復(fù)選按鈕,不常用·BS_AUTO3STATE 含自動選中狀態(tài)的三態(tài)復(fù)選按鈕·BS_3STATE 三態(tài)復(fù)選按鈕,不常用以上風(fēng)格指定了創(chuàng)建的按鈕類
6、型,不能同時使用,但必須有其一。·BS_BITMAP 按鈕上將顯示位圖·BS_DEFPUSHBUTTON 設(shè)置為默認(rèn)按鈕,只用于下壓式按鈕,一個對話框中只能指定一個默認(rèn)按鈕·rect指定按鈕的大小和位置;·pParentWnd指示擁有按鈕的父窗口,不能為NULL;·nID指定與按鈕關(guān)聯(lián)的ID號,用上一步創(chuàng)建的ID號。不同控件類的Create()函數(shù)略有不同,可參考相關(guān)資料。例:p_MyBut->Create( "動態(tài)按鈕", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20
7、,10,80,40), this, IDC_MYBUTTON );這樣,我們就在當(dāng)前對話框中的(20,10)處創(chuàng)建了寬60,高30,按鈕文字為“動態(tài)按鈕”的下壓式按鈕。為了使創(chuàng)建過程更方便易用,我定義了如下函數(shù):CButton* CTextEditorView:NewMyButton(int nID,CRect rect,int nStyle)CString m_Caption;m_Caption.LoadString( nID ); /取按鈕標(biāo)題CButton *p_Button = new CButton();ASSERT_VALID(p_Button);p_Button->Crea
8、te( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); /創(chuàng)建按鈕return p_Button;其中m_Caption.LoadString( nID )是從字符串表中讀取按鈕文本,這樣在創(chuàng)建按鈕ID時,應(yīng)該把文本設(shè)置好,參數(shù)nStyle為除必須風(fēng)格外的額外風(fēng)格。以下,調(diào)用該函數(shù)在ONINIATIAL中創(chuàng)建三個按鈕,并指定第一個按鈕為默認(rèn)按鈕,按鈕的ID在STRING TABLE中已預(yù)先設(shè)置好了:/CButton *p_MyBtn3;/為了在后面釋放資源,改為在類頭文件中聲明為
9、0; /公有變量 p_MyBtn0=NewMyButton(ID_MYBTN1,CRect(10,20,60,40),BS_DEFPUSHBUTTO
10、N); p_MyBtn1=NewMyButton(ID_MYBTN2,CRect(10,50,60,70),0); p_MyBtn2=NewMyButton(ID_MYBTN3,CRect(10,80,60,100),0); 二、動態(tài)控件的響應(yīng):動態(tài)控件的響應(yīng)函數(shù)不能用ClassWizard添加,只能手動添加。仍以上面的按鈕為例,我們制作按鈕的單擊響應(yīng)函數(shù)。1.在MESSAGE_MAP中添加響應(yīng)函數(shù):MESSAGE_MAP表中定義了消息響應(yīng)函數(shù),其格式為:消息名(ID,函數(shù)名),當(dāng)我們用ClassWizard添加函數(shù)時,會自動添加在AFX_MSG_MAP括起的區(qū)間
11、內(nèi),如: BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)/AFX_MSG_MAP(CTextEditorView)ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)/AFX_MSG_MAPEND_MESSAGE_MAP() 手工添加時不要添加到AFX_MSG_MAP區(qū)間內(nèi),以防ClassWizard不能正常工作,如: BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)/AFX_MSG_MAP(CTextEditorView)ON_BN_CLICKED(I
12、DC_ICONBUT0, OnIconbut0)/AFX_MSG_MAPON_BN_CLICKED(ID_MYBTN1, OnMybtn1)ON_BN_CLICKED(ID_MYBTN2, OnMybtn2)ON_BN_CLICKED(ID_MYBTN3, OnMybtn3)END_MESSAGE_MAP() 其中ON_BN_CLICKED是按鈕單擊消息。2.在頭文件中添加函數(shù)定義:用ClassWizard添加函數(shù)時,會在頭文件的AFX_MSG區(qū)間內(nèi)添加函數(shù)定義,如: protected:/AFX_MSG(CTextEditorView)afx_msg void OnIco
13、nbut0();/AFX_MSGDECLARE_MESSAGE_MAP() 我們模仿這種形式,只是把函數(shù)定義添加到AFX_MSG區(qū)間外就行了: protected:/AFX_MSG(CTextEditorView)afx_msg void OnIconbut0();/AFX_MSGafx_msg void OnMybtn1();afx_msg void OnMybtn2();afx_msg void OnMybtn3();DECLARE_MESSAGE_MAP() 3.編寫消息響應(yīng)函數(shù):以上是把消息和函數(shù)關(guān)聯(lián)起來了,具體在單擊按鈕后應(yīng)做的工作在函數(shù)中完成:
14、0;void CTextEditorView:OnMybtn1()MessageBox( "哈!你單擊了動態(tài)按鈕。" );void CTextEditorView:OnMybtn2()void CTextEditorView:OnMybtn3() 除了按鈕的響應(yīng)函數(shù)外,你還可以用上面獲得的指針訪問按鈕,如:修改按鈕的大小和位置:p_MyBtn0->MoveWindow();修改按鈕文本:p_MyBtn0->SetWindowText();顯示/隱藏按鈕:p_MyBtn0->ShowWindow();等等。三、回收資源:由于動態(tài)控件對象是由new生
15、成的,它不會被程序自動釋放,所以需手工釋放。在控件不再使用時可以刪除它,在對話框中的析構(gòu)函數(shù)中銷毀(析構(gòu)函數(shù)沒有手動添加): CMonthCalCtrlDlg:CMonthCalCtrlDlg() for(int i=0;i<3;i+) if(p_MyBtni) delete p_MyBtni; p_MyBtn0=NULL;/若采用其他方式釋放,則加上這句,否則會出錯
16、60;以上就是按鈕控件動態(tài)生成的方法。 /VC改變對話框按鈕字體顏色和背景的解決方案(轉(zhuǎn)載于: 要想修改CButton類按鈕背景顏色和文字顏色,必須利用自繪方法對按鈕進(jìn)行重新繪制。這可以通過定義一個以CButton為基類的新按鈕類來實現(xiàn)。以下為具體的實現(xiàn)方法:方法一: 加入一個新類,類名:CMyButton,基類:CButton。在頭文件 MyButton.h 中加入以下變量和函數(shù)定義:private: int &
17、#160; m_Style; /按鈕形狀(0-正常,1-當(dāng)前,2-按下,3-鎖定) BOOL b_InRect; /鼠標(biāo)進(jìn)入標(biāo)志 CString
18、 m_strText; /按鈕文字 COLORREF m_ForeColor; /文本顏色 COLORREF
19、 m_BackColor; /背景色 COLORREF m_LockForeColor; /鎖定按鈕的文字顏色 CRect m_But
20、Rect; /按鈕尺寸 CFont* p_Font; /字體 void
21、DrawButton(CDC *pDC); /畫正常的按鈕/ 接口函數(shù)public: void SetText(CString str); void SetForeColor(COLORREF color); /設(shè)置文本顏色 void SetBkColor(COLORREF
22、 color); /設(shè)置背景顏色 void SetTextFont(int FontHight,LPCTSTR FontName); /設(shè)置字體 在 MyButton.cpp 的構(gòu)造函數(shù)中初始化變量:CMyButton:CMyButton() m_Style = 0;
23、60; /按鈕形狀風(fēng)格 b_InRect = false; /鼠標(biāo)進(jìn)入標(biāo)志 m_strText = _T("");
24、60; /按鈕文字(使用默認(rèn)文字) m_ForeColor = RGB(0,0,0); /文字顏色(黑色) m_BackColor = RGB(243,243,243); /背景色(灰白色)
25、 m_LockForeColor = GetSysColor(COLOR_GRAYTEXT); /鎖定按鈕的文字顏色 p_Font = NULL; /字體指針
26、60;用ClassWizard添加下列消息函數(shù):PreSubclassWindow();DrawItem();onMouseMove();OnLButtonDown();OnLButtonUp();在各函數(shù)內(nèi)加入代碼:void CMyButton:PreSubclassWindow() ModifyStyle( 0, BS_OWNERDRAW ); /設(shè)置按鈕屬性為自畫式 &
27、#160; CButton:PreSubclassWindow(); PreSubclassWindow()在按鈕創(chuàng)建前自動執(zhí)行,所以我們可以在其中做一些初始工作。這里我只做了一項工作,就是為按鈕設(shè)置屬性為“自繪”式,這樣,用戶在添加按鈕后,就不需設(shè)置“Owner draw”屬性了。void CMyButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) CDC *pDC = CDC:FromHandle( lpDrawItemStruc
28、t->hDC ); m_ButRect = lpDrawItemStruct->rcItem; /獲取按鈕尺寸 if( m_strText.IsEmpty() ) GetWindowText( m_strText );
29、60; /獲取按鈕文本 int nSavedDC = pDC->SaveDC(); VERIFY( pDC ); DrawButton( pDC ); /繪制按鈕
30、; pDC->RestoreDC( nSavedDC ); DrawItem()函數(shù)是一個關(guān)鍵函數(shù),按鈕的繪制工作就在這里進(jìn)行,它的作用相當(dāng)于對話框中的OnPaint()函數(shù)和視圖中的OnDraw()函數(shù)。這里我做了三項工作:獲取按鈕尺寸、獲取按鈕文本、繪制按鈕。其中繪制工作在自定義函數(shù)DrawButton()中完成。以下就是繪制過程:void CMyButton:DrawButton(CDC *pDC) /調(diào)整狀態(tài)
31、if( m_Style=3 ) m_Style = 0; if( GetStyle() & WS_DISABLED ) m_Style = 3; /禁止?fàn)顟B(tài) /根據(jù)狀態(tài)調(diào)整邊框顏色和文字顏色 COLORREF bColor, fColor; &
32、#160; /bColor為邊框顏色,fColor為文字顏色 switch( m_Style ) case 0: bColor = RGB(192,192,192); fColor = m_ForeColor; break; /正常按鈕 case 1: bColor = RGB(255,255,2
33、55); fColor = m_ForeColor; break; /鼠標(biāo)進(jìn)入時按鈕 case 2: bColor = RGB(192,192,192); fColor = m_ForeColor; break; /按下的按鈕 case 3: bColor = m_BackColor; fColor = m_LockForeColor; break; /鎖定的按鈕
34、160; /繪制按鈕背景 CBrush Brush; Brush.CreateSolidBrush( m_BackColor ); /背景刷 pDC->SelectObject( &Brush ); &
35、#160;CPen Pen; Pen.CreatePen(PS_SOLID, 1, bColor ); pDC->SelectObject( &Pen ); pDC->RoundRect(&m_ButRect,CPoint(5,5); /畫圓角矩形 /繪制按鈕按下時的邊框
36、; if( m_Style!=2 ) CRect Rect; Rect.SetRect( m_ButRect.left+2, m_ButRect.top+1, m_ButRect.right, m_ButRect.bottom ); &
37、#160; pDC->DrawEdge( &Rect, BDR_RAISEDINNER, BF_RECT ); /畫邊框 /繪制按鈕文字 pDC->SetTextColor( fColor ); /畫文字&
38、#160; pDC->SetBkMode( TRANSPARENT ); pDC->DrawText( m_strText, &m_ButRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_END_ELLIPSIS); /繪制擁有焦點(diǎn)按鈕的虛線框
39、60; if( GetFocus()=this ) CRect Rect; Rect.SetRect( m_ButRect.left+3, m_ButRect.top+2, m_ButRect.right-3, m_ButRect.bottom-2 );
40、160; pDC->DrawFocusRect( &Rect ); /畫擁有焦點(diǎn)的虛線框 變量 m_Style 表征當(dāng)前按鈕狀態(tài),它的取值為:0-正常,1-當(dāng)前,2-按下,3-鎖定。不同狀態(tài)下按鈕的邊框顏色和文字顏色有所不同。m_Style 的值在鼠標(biāo)響應(yīng)函數(shù)中進(jìn)行修改。繪制工作主要利用CDC類的繪圖函數(shù)完成,主要注意在 m_Style 不同取值下表現(xiàn)出來的差別。void CMyBut
41、ton:onMouseMove(UINT nFlags, CPoint point) if( !b_InRect | GetCapture()!=this ) /鼠標(biāo)進(jìn)入按鈕 b_InRect = true; /設(shè)置進(jìn)入標(biāo)志
42、 SetCapture(); /捕獲鼠標(biāo) m_Style = 1; /設(shè)置按鈕狀態(tài) Invalidate();
43、0; /重繪按鈕 else if ( !m_ButRect.PtInRect(point) ) /鼠標(biāo)離開按鈕
44、60; b_InRect = false; /清除進(jìn)入標(biāo)志 ReleaseCapture(); /釋放捕獲的鼠標(biāo)
45、160; m_Style = 0; /設(shè)置按鈕狀態(tài) Invalidate(); /重繪按鈕 &
46、#160; CButton:onMouseMove(nFlags, point); onMouseMove()函數(shù)是鼠標(biāo)移動消息函數(shù),用于判定當(dāng)前鼠標(biāo)指針是否在按鈕上。b_InRect是個標(biāo)志,為true表示鼠標(biāo)指針進(jìn)入了按鈕區(qū)域,此時要捕獲鼠標(biāo),讓鼠標(biāo)命令傳送給按鈕。當(dāng)鼠標(biāo)指針離開按鈕時,要清除b_InRect標(biāo)志,并且釋放捕獲的鼠標(biāo),讓其它窗口可以接收鼠標(biāo)命令。Inva
47、lidate()函數(shù)用于更新按鈕,它會自動調(diào)用DrawItem()函數(shù)重新繪制按鈕。設(shè)置條件的目的是僅在鼠標(biāo)指針進(jìn)入按鈕和離開按鈕時更新按鈕,這樣可以防止鼠標(biāo)在按鈕上移動時發(fā)生閃爍。void CMyButton:OnLButtonDown(UINT nFlags, CPoint point) m_Style = 2; Invalidate(); /重繪按鈕
48、0; CButton:OnLButtonDown(nFlags, point); OnLButtonDown()函數(shù)是單擊鼠標(biāo)左鍵時的消息函數(shù)。這里只是重新繪制按鈕,具體的單擊響應(yīng)應(yīng)該在擁有按鈕的對話框或視圖中進(jìn)行。void CMyButton:OnLButtonUp(UINT nFlags, CPoint point) m_Style = 1; Invalidate();
49、160; /重繪按鈕 CButton:OnLButtonUp(nFlags, point); OnLButtonUp()函數(shù)是單擊鼠標(biāo)左鍵后彈起時的消息函數(shù)。這里也只是重繪按鈕,這樣能使按鈕在按下和彈起時有所不同,使按鈕看上去有動態(tài)效果。接口函數(shù)是用 CMyButton類 定義的按鈕修改顏色、字體和按鈕文字的接口,由以下函數(shù)組成:/設(shè)置按鈕文本void CMyButton:S
50、etText(CString str) m_strText = _T(""); SetWindowText(str); /設(shè)置文本顏色void CMyButton:SetForeColor(COLORREF color) m_ForeColor = color; Invalidate(); /設(shè)置背景顏
51、色void CMyButton:SetBkColor(COLORREF color) m_BackColor = color; Invalidate(); /設(shè)置字體(字體高度、字體名)void CMyButton:SetTextFont(int FontHight,LPCTSTR FontName) if ( p_Font ) delete
52、p_Font; /刪除舊字體 p_Font = new CFont; p_Font->CreatePointFont( FontHight, FontName ); /創(chuàng)建新字體 SetFont( p_Font );
53、160; /設(shè)置字體 由于新字體由 new 生成,必須顯式回收,這項工作可以在 CMyButton類 的析構(gòu)函數(shù)中進(jìn)行:CMyButton:CMyButton() if ( p_Font ) delete p_Font; /刪除字體
54、60;這樣一個可設(shè)置顏色、字體的按鈕類就做好了。使用時,先在對話框中放置好按鈕,再用 ClassWizard 為按鈕添加控制變量,并且將變量的類型設(shè)置為 CMyButton。之后,可以用該變量調(diào)用接口函數(shù)設(shè)置按鈕顏色和字體。 以上測試過,太復(fù)雜。又生一類。/方法二:添加dlg類的WM_DRAWITEM消息處理函數(shù)void CBtncolorDlg:OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)/ TODO: Add your message handler code here and/or call defaulti
55、f(nIDCtl=IDC_BUTTON1) /checking for the button CDC dc; RECT rect; dc.Attach(lpDrawItemStruct ->hDC); / Get the Button DC to CDC rect = lpDrawItemStruct-
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 直筒模具設(shè)計課程設(shè)計
- 說明文課程設(shè)計
- 課程設(shè)計宿舍供電
- 課程設(shè)計壓縮包
- 2025年度科技園區(qū)物業(yè)房屋租賃管理服務(wù)協(xié)議3篇
- 2025年小學(xué)班主任班級工作總結(jié)范文(2篇)
- 2025年事業(yè)單位年檢工作年終總結(jié)模版(2篇)
- 通信原理課程設(shè)計實驗
- 二零二五年度數(shù)據(jù)中心電力需求響應(yīng)服務(wù)合同2篇
- 二零二五年度建筑垃圾資源化處理質(zhì)量合同3篇
- 個人房屋租賃合同電子版下載(標(biāo)準(zhǔn)版)
- 福建省泉州市2019-2020學(xué)年高二上學(xué)期期末物理試卷(含答案)
- 高中生物學(xué)科思維導(dǎo)圖(人教版必修二)
- 監(jiān)理日志表(標(biāo)準(zhǔn)模版)
- 視頻監(jiān)控系統(tǒng)PPT幻燈片課件(PPT 168頁)
- GM∕T 0045-2016 金融數(shù)據(jù)密碼機(jī)技術(shù)規(guī)范
- 人力資源部年度工作計劃表(超級詳細(xì)版)
- 《輪機(jī)英語》試題(二三管輪)
- 部編版二年級語文下冊《蜘蛛開店》
- 北師大二年級數(shù)學(xué)上教學(xué)反思
- 200m3╱h凈化水處理站設(shè)計方案
評論
0/150
提交評論