6vc對(duì)話框與控件.ppt_第1頁(yè)
6vc對(duì)話框與控件.ppt_第2頁(yè)
6vc對(duì)話框與控件.ppt_第3頁(yè)
6vc對(duì)話框與控件.ppt_第4頁(yè)
6vc對(duì)話框與控件.ppt_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1,第六章對(duì)話框與控件,河北經(jīng)貿(mào)大學(xué) 信息技術(shù)學(xué)院,VC+系統(tǒng)開(kāi)發(fā),2,本章導(dǎo)讀,本章通過(guò)開(kāi)發(fā)一個(gè)計(jì)算器和口令對(duì)話框程序,掌握Button、Edit Box和Static Text控件的使用方法 其他常用控件的使用技巧,如List Control 基于對(duì)話框的應(yīng)用程序的編程技術(shù) 模式對(duì)話框、非模式對(duì)話框和通用對(duì)話框的設(shè)計(jì)與調(diào)用。,3,本章主要內(nèi)容,通用對(duì)話框 常用控件介紹 MyCalculator程序 開(kāi)發(fā)MyCalculator程序 口令對(duì)話框,4,6.1 對(duì)話框概述,對(duì)話框 對(duì)話框編輯器 對(duì)話框編程 控件的創(chuàng)建與使用,5,6.1.1 對(duì)話框 P154,可視化的界面,包含:按鈕、文本框、復(fù)選

2、框等。 對(duì)話框是一個(gè)窗口,控件也是一個(gè)窗口 對(duì)話框的兩種消息: WM_INITDIALOG:數(shù)據(jù)成員的初始化 WM_COMMAND:控件的消息 MFC對(duì)對(duì)話框的支持:對(duì)話框從CDialog基類中派生一個(gè)類, MFC的CDialog類封裝了用于對(duì)話框的顯示、關(guān)閉等常用操作的許多功能函數(shù);MFC程序框架;ClassWizard類向?qū)?公共對(duì)話框: P154表6-1 對(duì)話框控件及其CWnd成員函數(shù) 表6-2/表6-3 模式對(duì)話框和無(wú)模式對(duì)話框,6,對(duì)話框的類型P156,1.模式對(duì)話框 彈出后,用戶必須作出相應(yīng)得操作,否則不可以繼續(xù)。 用途廣。 2.無(wú)模式對(duì)話框 彈出后,一直保留在屏幕上,其他操作可繼

3、續(xù),用的時(shí)候激活對(duì)話框即可。 兩者的終止函數(shù)不一樣: Cdialog:EndDialog-模式 CWnd:DestroyWindow-無(wú)模式 所占內(nèi)存空間不同: 模式對(duì)話框: 由系統(tǒng)自動(dòng)分配內(nèi)存,當(dāng)對(duì)話框退出時(shí),對(duì)話框?qū)ο笞詣?dòng)刪除。 無(wú)模式對(duì)話框: 則需要用戶來(lái)指定內(nèi)存,退出時(shí)用戶刪除對(duì)話框?qū)ο?7,6.1.2 使用對(duì)話框編輯器,添加、選取、刪除對(duì)話框控件; 改變控件的Tab鍵次序; 利用基準(zhǔn)線、標(biāo)尺及布局工具進(jìn)行控件的布局; 測(cè)試所編輯的對(duì)話框的性能。,8,對(duì)話框編程步驟 p160-164,添加對(duì)話框資源 在單文檔項(xiàng)目MyHello中,Insert-resourc(ctrl+R)-Dialo

4、g 編輯對(duì)話框?qū)傩?向?qū)υ捒騼?nèi)添加控件 添加/選取/控件的布局/測(cè)試對(duì)話框 使用ClassWizard,為對(duì)話框資源創(chuàng)建一個(gè)新類CMyDlg,為控件進(jìn)行消息映射 afx_msg void OnButton1(); /向?qū)瓿?ON_BN_CLICKED(IDC_BUTTON1, OnButton1) /向?qū)瓿?在OnButton1()中添加用戶代碼 MessageBox(歡迎進(jìn)入對(duì)話框的設(shè)計(jì)!); 在程序(MyHello.cpp)中使用模式對(duì)話框 #include “MyDlg.h” CMyDlg Dlg; / MyHelloApp:InitInstance() Dlg.DoModal();

5、,9,6.1.4 控件的創(chuàng)建與使用p164-168,步驟如下: 將控件添加到對(duì)話框模板中 在對(duì)話框類中增加與控件相關(guān)聯(lián)的數(shù)據(jù)成員 根據(jù)需要在對(duì)話框類中定義處理這些數(shù)據(jù)的成員變量 在對(duì)話框的OnInitDialog函數(shù)體中,為控件設(shè)置一些初始條件 m_MyBtn.SetWindowText(歡 迎); 在對(duì)話框的控件消息處理函數(shù)中,添加控件處理代碼,10,訪問(wèn)控件 P168,關(guān)聯(lián)變量-ClassWizard添加 控件變量控件類對(duì)象,一個(gè)窗口對(duì)象 m_MyBtn.SetWindowText(“這是一個(gè)命令按鈕”); 值變量普通類型CString、int DDX對(duì)話數(shù)據(jù)交換與DDV對(duì)話數(shù)據(jù)驗(yàn)證 Up

6、dateData(TRUE); /對(duì)于值變量,控件中的值傳遞變量 UpdateData(FALSE); 控件窗口指針 CEdit *pEdFirst=(CEdit *) GetDlgItem(ID_FIRSTNAME);,例如DDX_Text(pDX, IDC_PASSWORD_EDIT, m_password),11,綜合示例一 -模式對(duì)話框與無(wú)模式對(duì)話框的編程(口令對(duì)話框),為MyHello程序添加”口令”對(duì)話框,12,1.對(duì)話框類型,無(wú)模式對(duì)話框 模式對(duì)話框,不允許用戶在關(guān)閉對(duì)話框之前切換到應(yīng)用程序的其他窗口,允許用戶在該對(duì)話框與應(yīng)用程序其他窗口之間的切換,預(yù)備知識(shí),對(duì)話框是實(shí)現(xiàn)人機(jī)交互

7、的重要手段,對(duì)話框不但可以接收消息,而且可以被移動(dòng)和關(guān)閉.,13,創(chuàng)建對(duì)話框資源,并添加各種所需控件; 創(chuàng)建對(duì)話框類(CDialog)的派生類,并將其與已創(chuàng)建的對(duì)話框資源相連接; 在派生類中添加所需的數(shù)據(jù)成員變量、數(shù)據(jù)交換函數(shù)(DDX)和數(shù)據(jù)驗(yàn)證函數(shù)(DDV) ; 為對(duì)話框各控件添加消息響應(yīng)函數(shù),編寫程序代碼; 為對(duì)話框的調(diào)用者添加對(duì)話框的調(diào)用。,對(duì)話框設(shè)計(jì)方法,14,對(duì)話框的工作原理,休息,對(duì)話框設(shè)計(jì)方法,15,調(diào)用模式對(duì)話框 CPasswordDialog m_Dlg;/聲明對(duì)話框?qū)ο?m_Dlg.DoModal();/顯示模態(tài)對(duì)話框 用戶必須單擊”確定(OK)“或”取消(Cancel)”

8、才能切換到其它窗口或?qū)υ捒颉?對(duì)話框的調(diào)用,16,調(diào)用非模式對(duì)話框 在視圖類的頭文件中添加CPasswordDialog的指針變量:CPasswordDialog *m_Dlg; /指針 在視圖類的構(gòu)造函數(shù)中將其初始化m_Dlg=NULL; 在調(diào)用函數(shù)中添加如下代碼if(m_Dlg=NULL)m_Dlg=new CPasswordDialog;/ 動(dòng)態(tài)創(chuàng)建 m_Dlg-Create(IDD_PASSWORD_DIALOG,this);m_Dlg-ShowWindow(SW_SHOW);/顯示非模態(tài)對(duì)話框,對(duì)話框的調(diào)用,17,編輯對(duì)話框資源 Button ID: IDOK ; Caption:

9、確認(rèn) Button ID: IDCANCEL ; Caption: 取消 Static Text: ID : IDC_STATIC Caption: 請(qǐng)輸入口令:,18,創(chuàng)建對(duì)話框類 右鍵單擊對(duì)話框Class Wizard Adding Class對(duì)話框 Create a new className:CPasswordDialogBase class:CDialogDialogID: IDD_PASSWORD_DIALOG,創(chuàng)建“口令”對(duì)話框類-類向?qū)?創(chuàng)建了一個(gè)類(CPasswordDialog),兩個(gè)文件(PasswordDialog.h和PasswordDialog.cpp),19,“M

10、ember Variable”標(biāo)簽頁(yè)Class name:CPasswordDialogControl IDs:IDC_PASSWORD_EDIT 單擊”Add Variable”,顯示Add Member Variable對(duì)話框 Variable name:m_Password Category: Value Variable type:CString,為編輯框引入變量,創(chuàng)建:DDX_Text(pDX, IDC_PASSWORD_EDIT, m_password),20,修改應(yīng)用程序類的InitInstance()函數(shù) BOOL CMyHelloApp:InitInstance() CPas

11、swordDialog Dlg; /聲明CPasswordDialog類的對(duì)象 if(Dlg.DoModal() != IDOK) return false;/用戶按下的不是確認(rèn)按鈕 if(Dlg.m_Password != 123456) /口令設(shè)為字符串123456 AfxMessageBox(口令錯(cuò)誤,確認(rèn)后將退出程序); return false; return TRUE; ,調(diào)用“口令”對(duì)話框,在MyHello.cpp頭部加入包含語(yǔ)句#include”PasswordDialog.h”,模式對(duì)話框的調(diào)用,21,例如,在MyHello程序中,添加一菜單項(xiàng),當(dāng)點(diǎn)擊該菜單項(xiàng)時(shí),將口令對(duì)話框

12、以非模式顯示:,顯示非模式對(duì)話框,編輯菜單ID:ID_MODALLESSCaption:非模式對(duì)話框,22,在視圖類的頭文件中添加CPasswordDialog的指針變量,CPasswordDialog *m_pModallessDlg; 需要在MyHelloView.h中加入: #include PasswordDialog.h,構(gòu)造函數(shù):m_pModallessDlg=NULL; /初始化指針 析構(gòu)函數(shù):if(m_pModallessDlg!=NULL) delete m_pModallessDlg;/釋放空間,修改視圖類的構(gòu)造函數(shù)和析構(gòu)函數(shù),if(m_pModallessDlg!=NUL

13、L) m_pModallessDlgDestroyWindow(); m_pModallessDlg=NULL; ,或者:,23,編寫調(diào)用非模式對(duì)話框代碼,“View/ClassWizard/MFC ClassWizard” Object IDS:ID_NOMODALLESS Class name:CMyHelloView Messages:COMMAND 添加了消息響應(yīng)函數(shù)”O(jiān)nModalless()”,單擊”Edit Code” 編寫代碼如下: if(m_pModallessDlg=NULL) m_pModallessDlg=new CPasswordDialog;/ 動(dòng)態(tài)創(chuàng)建 m_pMo

14、dallessDlg-Create(IDD_DIALOG1,this); m_pModallessDlg-ShowWindow(SW_SHOW);/顯示非模態(tài)對(duì)話框,24,對(duì)話框控件和相關(guān)MFC類(P155,表6-2) 用于對(duì)話框控件的CWnd成員函數(shù)(P155,表6-3) 對(duì)話框編輯器,控件工具箱:”右擊工具欄/control” “Tools/Customize/ToolsBars/Control” 修改控件的Tab鍵次序:”編排(Layout)/Tab Order”;或Ctrl+D按新的次序依此用鼠標(biāo)單擊各個(gè)控件,新的Tab鍵次序即可生成. 控件布局工具欄:P159,圖6-5,設(shè)置Layo

15、ut/Guide Setings 測(cè)試對(duì)話框:Ctrl+T,技術(shù)要點(diǎn)總結(jié):,25,改變對(duì)話框?qū)傩?P161),為控件設(shè)置初始條件(P165(4)在對(duì)話框的OnInitDialog函數(shù)體中,為控件設(shè)置初始條件,按鈕控件的屬性說(shuō)明(P167),技術(shù)要點(diǎn),消息對(duì)話框(P204),對(duì)話框左上角在父窗口中的坐標(biāo)(居中),26,6.2 windows 標(biāo)準(zhǔn)控件,CStatic類控件的使用 CEdit類控件的使用 CButton類控件的使用 CListBox類控件的使用 CComBox類控件的使用,27,windows 標(biāo)準(zhǔn)控件,屬性 方法 事件 對(duì)話框類的成員變量控件關(guān)聯(lián)變量 value Control,

16、28,訪問(wèn)控件的兩種方法,采用控件關(guān)聯(lián)變量 值變量 m_iA=10; UpdateData(false); 控件變量 m_EditA.SetWindowText(“10”); 獲取控件窗口指針 CEdit* pEditName=GetDlgItem(IDC_NAME); pEditName-SetWindowText(“ZHANG”); SetDlgItemText(IDC_NAME, m_Name); GetDlgItemText(IDC_NAME, m_Name);,29,1. CStatic類控件的使用,Static Text:靜態(tài)文本作為標(biāo)簽 Group Box:分組框框架 Pictr

17、ue:靜態(tài)圖片顯示位圖或分割其他控件 默認(rèn)ID為IDC_STATIC 只有CStatic類控件的ID號(hào)可以重復(fù) 詳見(jiàn)P169,30,為對(duì)話框添加背景圖片,使用Picture控件:方法簡(jiǎn)單,一定保證TabOrder為1 映射WM_CTLCOLOR消息,在OnCtlColor函數(shù)中返回一個(gè)圖形刷子: 映射WM_PAINT消息,在OnPaint函數(shù)中選入位圖,為對(duì)話框設(shè)置一幅背景圖(Bitmap)有幾種最常用的方法:,31,Picture控件,WM_CTLCOLOR,WM_PAINT,32,HBRUSH CBitmapBKDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UI

18、NT nCtlColor) if (nCtlColor = CTLCOLOR_DLG ) return (HBRUSH)m_BKBrush.GetSafeHandle(); return CDialog:OnCtlColor(pDC,pWnd,nCtlColor); ,CBitmapBKDlg:CBitmapBKDlg(CWnd* pParent /*=NULL*/): CDialog(CBitmapBKDlg:IDD, pParent) . CBitmap* pBitmap = new CBitmap; / ASSERT(pBitmap); pBitmap-LoadBitmap(IDB_BA

19、CKGROUD); m_BKBrush.CreatePatternBrush(pBitmap); delete pBitmap; ,利用對(duì)話框的OnCtlColor(),CTLCOLOR_BTN CTLCOLOR_DLG CTLCOLOR_EDIT CTLCOLOR_LISTBOX CTLCOLOR_MSGBOX CTLCOLOR_SCRLLBAR CTLCOLOR_STATIC,Private: CBrush m_BKBrush,33,void CxxxDlg:OnPaint() CPaintDC dc(this); / device context for painting CRect r

20、c; GetClientRect( /釋放 ,利用對(duì)話框的OnPaint(),34,CDC繪圖操作,CDC:BitBlt 從源設(shè)備環(huán)境拷貝一幅位圖到當(dāng)前設(shè)備環(huán)境 BOOL BitBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); CDC:StretchBlt 從源設(shè)備環(huán)境(矩形)拷貝一幅位圖到當(dāng)前設(shè)備環(huán)境(矩形),如果必要,延伸或壓縮 BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSr

21、cDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );,35,2. CEdit類控件的使用,用來(lái)輸入和編輯文本 單行文本 多行文本Multiline 口令 詳見(jiàn)P170,36,CEdit類控件的屬性,Multiline Number Want return Password Read-only Uppercase Lowercase,37,CEdit類控件的方法,口令設(shè)置: SetPasswordChar(#); 選擇文本 輸入/輸出文本 -DDX技術(shù),為編輯框添加值變量,通過(guò)使用UpdateData()完成

22、控件與變量之間的數(shù)據(jù)傳送。 -定義CEdit類的對(duì)象或?qū)ο笾羔槪≒168) CWnd:SetWindowText(); CWnd: GetWindowText();,38,CEdit類控件的方法,CanUndo() Clear() Copy() Cut() EmptyUndoBuffer() GetFirstVisibleLine() GetModify() GetPasswordChar() GetRect() GetSel(),LimitText() LineFromChar() LineLength() LineScroll() Paste() ReplaceSel() SetModif

23、y() SetPasswordChar() SetReadOnly() SetSel() Undo(),39,CEdit類控件的事件 (P171表6-11),EN_CHANGE EN_ERRSPACE EN_HSCROLL EN_KILLFOCUS EN_MAXTEXT EN_SETFOCUS EN_UPDATE EN_VSCROLL,40,3. CButton類控件的使用(P171),命令按鈕(Pushbuttons) 單選按鈕(Radiobuttons) 復(fù)選按鈕(Checkboxes),41,命令按鈕,事件: BN_CLICKED 方法: SetWindowText(字符串) ShowW

24、indow(SW_SHOW/ SW_HIDE); EnableWindow(false/true); 例6-1 p172,42,一元二次方程求解,void CEx6_2Dlg:OnButton1() / TODO: Add your control notification handler code here UpdateData(); int disc; double re,im; disc=m_B*m_B-4*m_A*m_C; re=(double)-m_B/(2*m_A); im=(double)sqrt(abs(disc)/(2*m_A); if(disc=0) m_X1.Format

25、(X1=%6.2f,re+im); m_X2.Format(X2=%6.2f,re-im); ,else m_X1.Format(X1=%6.2f+%6.2f i, re,im); m_X2.Format(X2=%6.2f-%6.2f i, re,im); UpdateData(FALSE); ,43,單選按鈕,屬性: Group:與Tab order 管理一組控件 事件 BN_CLICKED 檢查是否選中的方法 (1)IsDlgButtonChecked(ID) (2)連接變量的值:0,1,2,3. . 注意事項(xiàng):P172(1)(2)(3),44,復(fù)選框,屬性 事件 檢查是否選中的方法 (1

26、)IsDlgButtonChecked(ID) (2)連接變量的值:true/false 例6-2(P174),45,一個(gè)簡(jiǎn)單的整數(shù)運(yùn)算計(jì)算器(演示),綜合示例二-一個(gè)簡(jiǎn)單的整數(shù)計(jì)算器,46,編輯框與按鈕類控件作業(yè) 一個(gè)功能較豐富的計(jì)算器程序設(shè)計(jì),休息,演示,47,開(kāi)發(fā)MyCalculator程序,創(chuàng)建工程:使用MFC AppWizard創(chuàng)建應(yīng)用程序的基本框架; 可視化設(shè)計(jì):制做Windows風(fēng)格的圖形用戶界面和各種控件; 編寫程序代碼。,用VC+6.0編寫MFC應(yīng)用程序,一般有三個(gè)步驟:,48,“File/New/Projects/MFC AppWizardexe/工程名:MyCalcula

27、tor,位置:E:MyVCch6” “選擇Dialog based/Next,標(biāo)題:計(jì)算器“,其它接受默認(rèn)設(shè)置; ”Finish”完成,一、創(chuàng)建工程,49,“Project Workspace”窗口,選擇“Resource View”標(biāo)簽,雙擊Dialog下的“IDD_MYCALCULATOR_DIALOG” 從“IDD_MYCALCULATOR_DIALOG”對(duì)話框刪除“OK” 和“ Cancel”及“TODO文本” 。 彈出控件工具箱(右擊工具欄,選擇Controls); 向?qū)υ捒蛱砑影粹o(Button)控件; 右擊Button1,選擇屬性,二、可視化設(shè)計(jì),50,類似方法按右表定義,編輯對(duì)

28、話框資源。設(shè)計(jì)結(jié)果如下圖:,1.可視化設(shè)計(jì),51,“View/ClassWizard/Member Variable” Class name:CMyCalculatorDlg Ctrol IDS:IDC_DISPLAY Category:Value 單擊Add variable進(jìn)行 如下設(shè)置,2.為編輯框“IDC_DISPLAY”引入變量,52,添加變量 在“CMyCalculatorDlg.h”中,為CMyCalculatorDlg類加入四個(gè)變量(protected):,3.為CMyCalculatorDlg類添加數(shù)據(jù)成員,double m_first;/存儲(chǔ)一次運(yùn)算的第一個(gè)操作數(shù)及一次運(yùn)算

29、的結(jié)果 double m_second;/存儲(chǔ)一次運(yùn)算的第二個(gè)操作數(shù) CString m_operator;/存儲(chǔ)運(yùn)算符 double m_coff;/存儲(chǔ)小數(shù)點(diǎn)的系數(shù)權(quán)值,53,在構(gòu)造函數(shù)中初始化成員變量,CMyCalculatorDlg:CMyCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CMyCalculatorDlg:IDD, pParent) /AFX_DATA_INIT(CMyCalculatorDlg) m_display = _T(0.0); m_first = 0.0; m_second= 0.0; m_operator=_T

30、(+); m_coff = 1.0; /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); ,注此函數(shù)在“CMyCalculatorDlg.cpp”中,54,用向?qū)砑?“View/ClassWizard/Message Maps” Class name:CMyCaculatorDlg Object IDS:IDC_BUTTON0 Message:BN_CLICKED 單擊”Add

31、Function”,4.為Button按鈕的BN_CLICKED事件添加響應(yīng)函數(shù),BEGIN_MESSAGE_MAP(CMyCalculatorDlg, CDialog) /AFX_MSG_MAP(CMyCalculatorDlg) ON_BN_CLICKED(IDC_BUTTON0, OnButton0) /AFX_MSG_MAP END_MESSAGE_MAP(),直接在MyCalculatorDlg.cpp中添加,如下,55,在”MFC ClassWizard”對(duì)話框的”Message Maps”標(biāo)簽頁(yè),選中消息響應(yīng)函數(shù),單擊“Edit Code”,三、編寫程序代碼,在工作區(qū)的”Clas

32、sView”下,CMyCalculatorDlg類中雙擊相應(yīng)的響應(yīng)函數(shù)。,直接在MyCalculatorDlg.cpp文件中填寫對(duì)應(yīng)函數(shù)的函數(shù)體。 程序代碼見(jiàn)演示,添加響應(yīng)函數(shù)后,在 MyCalculatorDlg.cpp文件中進(jìn)行了函數(shù)的定義,函數(shù)體為空,可用以下幾種方法填寫代碼。,56,數(shù)字”N”的消息響應(yīng)函數(shù)(N=0,1,9) void CMyCalculatorDlg:OnButtonN() if( m_coff = 1.0) m_second = m_second*10 + N;/作為整數(shù)輸入數(shù)字時(shí) else m_second = m_second + N*m_coff; /作為小數(shù)

33、輸入數(shù)字 m_coff *= 0.1; UpdateDisplay(m_second);/更新編輯框的數(shù)字顯示 ,編寫程序代碼,57,如數(shù)字”8”的消息響應(yīng)函數(shù) void CMyCalculatorDlg:OnButton8() if(m_coff=1.0) m_second=m_second*10+8;else m_second=m_second+m_coff*8; m_coff*=0.1;UpdateDisplay(m_second);,編寫程序代碼,輸入123.123 1*10+2=12 12*10+3=123 . 0.1 1 123+0.1*1=123.1 123.1+0.01*2=1

34、23.12 123.12*0.001*3=123.123,58,運(yùn)算符按鈕的消息響應(yīng)函數(shù):將前一次數(shù)據(jù)與當(dāng)前數(shù)據(jù)進(jìn)行運(yùn)算,作為下次的第一操作數(shù),并在編輯框顯示。,算法如下: m_first與m_second 作m_operator運(yùn)算后 m_first; 0 m_second; m_firstm_display 當(dāng)前點(diǎn)擊的運(yùn)算符 m_operator; 將小數(shù)的權(quán)值變量m_coff置1.0. 詳見(jiàn)演示,59,如”+”運(yùn)算符,void CMyCalculatorDlg:OnButtonAdd() Calculate(); m_operator=+; ,void CMyCalculator:Cal

35、culate() switch(m_operator.GetAt(0) case +:m_first+=m_second;break; case -:m_first-=m_second;break; case *:m_first*=m_second;break;,右擊”CMyCalculatorDlg”類,選擇”Add Member Function”,注:Calculate(); 類的成員函數(shù),60,如”+”運(yùn)算符,case /: if(fabs(m_second)=0.000001) m_display=除數(shù)不能為0; UpdateData(false); return; m_first/

36、=m_second;break; m_second=0.0; m_coff=1.0; UpdateDisplay(m_first);/更新編輯框顯示內(nèi)容 ,需要在MyCalculatorDlg.cpp中添加math.h文件,61,UpdateDisplay()添加方法同上,void CMyCalculatorDlg:UpdateDisplay(double lVal) m_display.Format(_T(%f),lVal); int i=m_display.GetLength(); /格式化輸出,將輸出結(jié)果后的零截去 while(m_display.GetAt(i-1)=0) m_disp

37、lay.Delete(i-1,1);i-; UpdateData(false);/更新編輯框變量m_display ,62,為”=“按鈕的消息響應(yīng)函數(shù)添加代碼:,算法如下: m_first與m_second 作m_operator運(yùn)算后 m_first; m_firstm_display (顯示) 0 m_second; 0 m_second; 0 m_first; 將小數(shù)的權(quán)值變量m_coff置1.0. 輸入的運(yùn)算符 m_operator 詳見(jiàn)演示,為其它按鈕的消息響應(yīng)函數(shù)添加代碼:見(jiàn)演示,63,為“?!卑粹o添加消息處理函數(shù),void CMyCalculatorDlg:OnButtonRec

38、iprocal() /1/x按鈕的消息處理函數(shù) if(fabs(m_second)0.000001) m_display = 除數(shù)不能為零; UpdateData(false); return; m_second= 1.0/m_second; UpdateDisplay(m_second); ,void CMyCalculatorDlg:OnButtonPoint() m_coff= 0.1 ; ,64,關(guān)于UpdateData函數(shù): CDialog的基類CWnd的成員函數(shù),函數(shù)原型 BOOL UpdateData(BOOL bSaveAndValidate=TRUE); 一般在對(duì)話框的派生類

39、中,利用UpdateData()進(jìn)行控件和相應(yīng)變量之間的數(shù)據(jù)傳遞 UpdateData(TRUE);/ 將控件中的數(shù)據(jù)傳遞給相應(yīng)的變量 UpdateData(FALSE);/ 將變量中的數(shù)據(jù)傳遞給相應(yīng)的控件,技術(shù)要點(diǎn),65,關(guān)于消息響應(yīng)函數(shù): 用MFC ClassWizard為對(duì)話框中某按鈕的BN_CLICKED事件添加消息處理函數(shù)時(shí), MFC ClassWizard作了三件事: (1)在類的定義MyCalculatorDlg.h中添加了消息響應(yīng)函數(shù)的函數(shù)原型; (2)在類的實(shí)現(xiàn)文件MyCalculatorDlg.cpp中,添加了函數(shù)體; (3)在類的實(shí)現(xiàn)文件MyCalculatorDlg.c

40、pp中,添加了消息映射。,技術(shù)要點(diǎn),66,數(shù)據(jù)交換和校驗(yàn): 對(duì)話框數(shù)據(jù)交換(DDX)可以實(shí)現(xiàn)對(duì)話框中控件數(shù)值的初始化和獲取用戶的數(shù)據(jù)輸入。 對(duì)話框數(shù)據(jù)校驗(yàn)(DDV)可以實(shí)現(xiàn)對(duì)對(duì)話框中數(shù)值進(jìn)行校驗(yàn) 。如為IDC_DISPLAY的Edit Box控件創(chuàng)建了m_display變量,數(shù)據(jù)類型為CString,則ClassWizard自動(dòng)在文件MyCalculatorDlg.cpp中創(chuàng)建了相應(yīng)的對(duì)話框數(shù)據(jù)交換代碼:,技術(shù)要點(diǎn),67,數(shù)據(jù)交換和校驗(yàn):,void CMyCalculatorDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchang

41、e(pDX); /AFX_DATA_MAP(CMyCalculatorDlg) DDX_Text(pDX, IDC_DISPLAY, m_display); /AFX_DATA_MAP ,技術(shù)要點(diǎn),在代碼中,利用CWnd:UpdateData()進(jìn)行控件和相應(yīng)變量之間的數(shù)據(jù)傳遞 UpdateData(TRUE);/ 將控件中的數(shù)據(jù)傳遞給相應(yīng)的變量 UpdateData(FALSE);/ 將變量中的數(shù)據(jù)傳遞給相應(yīng)的控件,68,字符串CString類: CString類中的字符是TCHAR類型的。,構(gòu)造函數(shù): CString();/產(chǎn)生一個(gè)空的CString對(duì)象 CString(const CSt

42、ring /ANSI字符串,技術(shù)要點(diǎn),69,常用成員函數(shù): int GetLength() const;/測(cè)試長(zhǎng)度 BOOL IsEmpty() const; /測(cè)試為空 void Empty(); /置空 TCHAR GetAt(int nIndex) const; 獲取指定位置處字符 void SetAt(int nIndex,TCHAR ch); 設(shè)定字符 MakeUpper(); 變?yōu)榇髮?MakeLower(); 變?yōu)樾?int Compare(LPCTSTR lpsz) const;字符串比較 int CompareNoCase(LPCTSTR lpsz) const;字符串比較

43、,忽略大小寫,技術(shù)要點(diǎn),70,例1 CString m_str1=“下午”,m_str2=“好!”; CString m_str3=m_str1+m_str2; 例2 CString m_str1=“a”,m_str2=“b!”; int result=m_str1.Compare(m_str2);字符串比較 if(result=0) AfxMessageBox(“兩者相同”); else if (result0) AfxMessageBox(“m_str1m_str2”); else AfxMessageBox(“m_str1m_str2”);,技術(shù)要點(diǎn),71,利用ON_COMMAND_RA

44、NGE宏,可以處理一系列控件對(duì)同一消息處理函數(shù)的響應(yīng),用以下方法修改程序:,優(yōu)化MyCalculator程序,(1) 在MyCalculatorDlg.h中“AFX_MSG(C MyCalculatorDlg)”與”AFX_MSG”之間添加下面語(yǔ)句: afx_msg void OnOperandInput(UINT nID); (2)在MyCalculatorDlg.cpp中 “AFX_MSG_MAP(C MyCalculatorDlg)”與”AFX_MSG_MAP” 間添加下面語(yǔ)句 ON_COMMAND_RANGE(IDC_BUTTON0,IDCBUTTON9,OnOperandInput)

45、; (3)在Resource.h文件中定義 #define IDC_BUTTON0 1000 #define IDC_BUTTON9 1009,起始值,結(jié)束值,消息響應(yīng)函數(shù),72,優(yōu)化MyCalculator程序,void CCalculatorDlg:OnOperandInput(UINT nID) int n=nID%10; if(m_coff=1.0) m_second=m_second*10+n; else m_second=m_second+m_coff*n; m_coff*=0.1; UpdateDisplay(m_second); ,73,完成計(jì)算器的設(shè)計(jì) 優(yōu)化MyCalcula

46、tor程序,操作練習(xí),74,4. 列表類控件CListBox /CListCtrl,CListBox控件 單選/多選列表框P177-180 只能顯示一個(gè)字段 CListCtrl控件: 類似于資源管理器的顯示 可以顯示一條記錄,75,CListBox 類控件屬性,Sort:列表框項(xiàng)目排序 multi-column:有水平滾動(dòng)條的多列列表框 Horizontal scroll:創(chuàng)建水平滾動(dòng)條 vertical scroll want key input:向父窗口發(fā)送消息 disable no scroll,列表框控件提供一個(gè)項(xiàng)目列表,用戶可以從中選擇一個(gè)或多個(gè)項(xiàng)目。見(jiàn)P178表6-18,76,CL

47、istBox控件的常用操作,AddString() InsertString() DeleteString() ResetContent() FindString() FindStringExact() SelectString(),添加列表項(xiàng),刪除列表項(xiàng),查找列表項(xiàng),77,列表框的單項(xiàng)選擇函數(shù)(P179),GetCurSel()返回列表框中當(dāng)前選擇字符串的基于0的索引 SetCurSel()設(shè)定選中列表項(xiàng)字符串,78,列表框多項(xiàng)選擇函數(shù),GetSelCount()返回多選列表框中當(dāng)前選擇的字符串的數(shù)目 GetSetItems() : SetSel(),79,CListBox 類控件事件 P1

48、80表6-19,LBN_DBLCLK LBN_ERRSPACE LBN_KILLFOCUS LBN_SELCANCEL LBN_SELCHANGE LBN_SETFOCUS,80,單選列表框獲取數(shù)據(jù),int nSelection=m_ListBox.GetCurSel() m_ListBox.GetText(nSelection,m_Text); 其中: int 型獲得選擇項(xiàng)序號(hào) CString型 獲得選擇項(xiàng)文本項(xiàng),例6-3(P180)單選列表框的使用,81,多選列表框獲取數(shù)據(jù),int nSelection=m_ListBox.GetSelCount(); int items20; /索引號(hào)數(shù)

49、組 String str20; /字符串?dāng)?shù)組 m_ListBox.GetSelItems(items); for(int i=0;inSelection;i+) m_ListBox.GetText(itemsi,stri);,82,CListCtrl控件的用法,Windows資源管理器中的“查看”標(biāo)簽下的“大圖標(biāo)、小圖標(biāo)、列表、詳細(xì)資源”就是一個(gè)列表控件的典型應(yīng)用。顯示記錄 列表控件的風(fēng)格 列表控件的2個(gè)數(shù)據(jù)結(jié)構(gòu) 列表控件的常用操作 列表控件的消息 列表控件的具體編程,83,CListCtrl示例,CListCtrl詳解,84,5. CComBox 控件 P183-185,編輯框列表框用戶可以

50、通過(guò)在組合框中輸入文本來(lái)選定項(xiàng)目,也可以直接從列表框中選定項(xiàng)目。如果項(xiàng)目數(shù)超過(guò)了組合框中可顯示的數(shù)目控件上自動(dòng)添加滾動(dòng)條。見(jiàn)P183 類型: Simple:簡(jiǎn)單組合框,列表框直接顯示出來(lái) Dropdown:下拉式組合框,點(diǎn)擊下拉按鈕 Drop List:下拉式列表框,無(wú)文字編輯功能,85,CComBox 類控件事件,CBN_DBLCLK CBN_ERRSPACE CBN_KILLFOCUS CBN_SELECTCANCEL CBN_SELECTCHANGE CBN_SETFOCUS CBN_CLOSEUP CBN_DROPDOWN CBN_EDITCHANGE CBN_EDITUPDATE 例6-4(P185),86,6. 滾動(dòng)類控件CScrollBar/CSlider/CSpin,SB_BOTTOM / SB_RIGHT SB_TOP / SB_LEFT SB_LINEDOWN/ SB_LINERIGHT 單擊滾動(dòng)條向下箭頭時(shí) SB_LINEUP / SB_LINELEFT SB_PAGEDOWN/SB_PAGER

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論