[高等教育]MFC對(duì)話框.doc_第1頁(yè)
[高等教育]MFC對(duì)話框.doc_第2頁(yè)
[高等教育]MFC對(duì)話框.doc_第3頁(yè)
[高等教育]MFC對(duì)話框.doc_第4頁(yè)
[高等教育]MFC對(duì)話框.doc_第5頁(yè)
已閱讀5頁(yè),還剩15頁(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)介

對(duì)話框和常用控件對(duì)話框是Windows應(yīng)用程序中最重要的用戶界面元素之一,是與用戶交互的重要手段,在程序運(yùn)行過(guò)程中,對(duì)話框可用于撲捉用戶的輸入信息或數(shù)據(jù)。對(duì)話框是一個(gè)特殊類型的窗口,任何對(duì)窗口進(jìn)行的操作(如:移動(dòng)、最大化、最小化等)都可在對(duì)話框中實(shí)施,一般來(lái)說(shuō),在對(duì)話框中通過(guò)各種控件(如:按鈕、編輯框、列表框、組合框等)來(lái)和用戶進(jìn)行交互??丶窃谙到y(tǒng)內(nèi)部定義的用于和用戶交互的基本單元。一、對(duì)話框的使用 Visual C+提供的對(duì)話框編輯器能“可視”地進(jìn)行設(shè)計(jì)、編輯,并可用ClassWizard為對(duì)話框從CDialog基類中派生一個(gè)類,MFC的CDialog類封裝了用于對(duì)話框的顯示、關(guān)閉等操作的許多功能函數(shù),例如:DoModal函數(shù)用來(lái)顯示模式對(duì)話框并返回用戶操作的結(jié)果。1、模式對(duì)話框(為186附加舉例頁(yè)) 所謂模式對(duì)話框是指,當(dāng)對(duì)話被彈出時(shí),用戶必須在對(duì)話框中進(jìn)行相應(yīng)的操作,在退出對(duì)話框之前,對(duì)話框所在的應(yīng)用程序不能繼續(xù)執(zhí)行。平常我們所見到的對(duì)話框大多是模式對(duì)話框。例:模式對(duì)話框(通過(guò)菜單命令彈出)1) 建一個(gè)單文檔(SDI)應(yīng)用程序2) 創(chuàng)建對(duì)話框模板InsertResource選中Dialog單擊New拖過(guò)一個(gè)靜態(tài)文本,鼠標(biāo)對(duì)準(zhǔn)它,按右鍵點(diǎn)properties改標(biāo)題為“新建模式對(duì)話框”。3)鼠標(biāo)右鍵對(duì)準(zhǔn)對(duì)話框的任何位置單擊,選擇properties選項(xiàng),設(shè)置ID為IDD_MYDIALOG4)給對(duì)話框創(chuàng)建類 雙擊新建對(duì)話框的任何位置,單擊OK,寫類名為“CMyDlg”,保證”CDialog”作為該類的基類。 5)創(chuàng)建菜單命令:a) 打開資源編輯器的菜單項(xiàng)Menub) 雙擊IDR_MAINFRAMEc) 雙擊右邊空白菜單,點(diǎn)開pop_up(讓它是空白),在名字處寫”彈出對(duì)話框(&A)”,ID處寫ID_PUPDIALOG6)將菜單命令連接到主框架程序中,完成ID_PUPDIALOG的消息映射: ViewClassWizard保證Class name里是CMainFrame,在ObjectIDs里找到ID_PUPDIALOG點(diǎn)黑Messages里(右邊)點(diǎn)COMMAND建立主框架對(duì)象方法并加代碼:void CMainFrame:OnPupdialog() CMyDlg MyDlg;MyDlg.DoModal(); /DoModal()是CDialog類成員函數(shù),通過(guò)調(diào)用該/函數(shù)將顯示對(duì)話框。 7)在CMainFrame.cpp文件里加: #include “MyDlg.h” / 之后運(yùn)行。 2、無(wú)模式對(duì)話框(為186附加頁(yè))非模式對(duì)話框,彈出后,可一直保留在屏幕上,用戶可繼續(xù)在應(yīng)用中進(jìn)行其它操作或啟動(dòng)其它應(yīng)用程序,當(dāng)需要使用對(duì)話框時(shí),只需象激活一般窗口一樣激活對(duì)話框即可。1)建一個(gè)SDI(單文檔)應(yīng)用程序2)創(chuàng)建對(duì)話框模板InsertResource點(diǎn)黑DialogNew拖過(guò)一個(gè)靜態(tài)文本,鼠標(biāo)對(duì)準(zhǔn)它,按右鍵點(diǎn)properties改標(biāo)題為“新建非模式對(duì)話框”。3)為對(duì)話框創(chuàng)建類點(diǎn)出對(duì)話框(IDD_DIALOG1缺省的ID號(hào)),雙擊對(duì)話框中的任意位置,出現(xiàn)一個(gè)表,你點(diǎn)OK出現(xiàn)一個(gè)對(duì)話框,你寫類名:CDlg保證基類為CDialog4)創(chuàng)建菜單打開工作區(qū)MenuIDR_MAINFRAME雙擊空白菜單寫“非模式對(duì)話框”關(guān)閉再點(diǎn)下面空菜單寫名字“顯示非模式對(duì)話框”ID處寫ID_DLG.5) 添加菜單命令消息 WiewClassWizardMessage Maps保證Class name里是Wiew類(視圖類),在Object IDS里找到ID_DLG(菜單的ID)點(diǎn)黑右邊COMMAND雙擊它OK6)a、你在Wiew.h里加:#include “Dlg.h” b、在public:里加:CDlg *dlg;/創(chuàng)建CDlg對(duì)象 c、在View.cpp的OnDlg()函數(shù)里加: CMyView:OnDlg() dlg=new CDlg(this); dlg-Create(IDD_DIALOG1);/使對(duì)話框摸板從資源中創(chuàng)建一個(gè)非/模式對(duì)話框 dlg-ShowWindow(SW_RESTORE);/顯示對(duì)話框 二、使用對(duì)話框編輯器(對(duì)話框編程)(187頁(yè))*1、可建一個(gè)單文檔應(yīng)用程序名為“對(duì)話框編程”,在此程序中加入一個(gè)對(duì)話框: InsertResource點(diǎn)黑Dialognew 出現(xiàn)188頁(yè)的圖2、拖入一些控件,對(duì)這些控件進(jìn)行排序、布局、大小調(diào)整、上下對(duì)齊、測(cè)試等。*最后在對(duì)話框IDD_DIALOG1上留一個(gè)按鈕控件,其標(biāo)識(shí)符為:IDC_BUTTON13、識(shí)別控件工具欄(188頁(yè))4、在加對(duì)話框時(shí),InsertResource點(diǎn)開+Dialog見有7類對(duì)話框,分別了解其不同用途(見192頁(yè))。5、對(duì)話框的屬性A、ViewProperties B、按Alt+Enter C、用鼠標(biāo)右鍵單擊對(duì)話框模板Properties都能彈出對(duì)話框的屬性框,見書193頁(yè)對(duì)屬性General的解釋。*6、為對(duì)話框添加類(194頁(yè)) 對(duì)準(zhǔn)對(duì)話框的任意非控件區(qū)域雙擊鼠標(biāo),將彈出書194頁(yè)圖5.11所示的對(duì)話框,詢問是否為對(duì)話框資源創(chuàng)建一個(gè)新類單擊OK彈出書194頁(yè)圖5.12所示的對(duì)話框你定義一個(gè)新類的名字如:CMyDlg(注意:類名必須以C打頭),下面的基類Base class和ID標(biāo)識(shí)符Dialog ID內(nèi)容一般不改。* 7、添映射消息(195頁(yè)) 接上,點(diǎn)OK出現(xiàn)“MFC ClassWizard”對(duì)話框,如書195頁(yè)圖5.13所示(保證類名處是CMyDlg)選定點(diǎn)黑IDC_BUTTON1單擊BN_CLICKED消息Add Function出現(xiàn)書195頁(yè)圖5.14對(duì)話框OKEdit Code *8、添加用戶代碼(195頁(yè))接上,到MyDlg.cpp文件中,寫:void CMyDlg:OnButton1() MessageBox(“歡迎進(jìn)入對(duì)話框的設(shè)計(jì)!”);/這時(shí)運(yùn)行還不見對(duì)話框,接下*9、在程序中使用對(duì)話框(196頁(yè)) 由于對(duì)話框的代碼是以類為模塊來(lái)設(shè)計(jì)的,使用時(shí)需要在程序中加入該類的頭文件,并定義一個(gè)類對(duì)象,然后就可以使用該類的相關(guān)成員。項(xiàng)目工作區(qū)FileView打開應(yīng)用程序的.cpp文件,在前面加: #include “MyDlg.h” 在InitInstance函數(shù)體中的return TRUE語(yǔ)句之前添加下列代碼: CMyDlg dlg; dlg.DoModal();/DoModal()函數(shù)是負(fù)責(zé)對(duì)話框的顯示和終止。運(yùn)行!則直接顯示出對(duì)話框,單擊按鈕則出現(xiàn)“歡迎進(jìn)入對(duì)話框的設(shè)計(jì)”的字樣。本例建的CMyDlg類及以后在各個(gè)項(xiàng)目中建立的類,在文檔、視圖、主框架類中都可同樣使用。(1)添加對(duì)話框資源對(duì)話框資源類型:IDD_DIALOGBAR 對(duì)話條,往往和工具條放在一起。IDD_FORMVIEW 一個(gè)表狀風(fēng)格的對(duì)話框,用于無(wú)模式對(duì)話框或視圖類IDD_OLE_PROPPAGE_LARGE一個(gè)大的OLE屬性頁(yè)IDD_OLE_PROPPAGE_SMALL一個(gè)小的OLE屬性頁(yè)IDD_PROPPAGE_LARGE一個(gè)大屬性頁(yè),用于屬性對(duì)話框IDD_PROPPAGE_MEDIUM一個(gè)中等大小的屬性頁(yè),用于屬性對(duì)話框IDD_PROPPAGE_SMALL一個(gè)小的屬性頁(yè),用于屬性對(duì)話框(2)改變對(duì)話框的屬性ID框:修改或選擇對(duì)話框的標(biāo)識(shí)符名稱Caption框:輸入對(duì)話框的標(biāo)題名稱,中英文均可。Font按鈕:?jiǎn)螕舸税粹o可選擇字體的種類(如宋體)及尺寸(如9號(hào))Xpos/Ypos:對(duì)話框左上角在父窗口中的X,Y坐標(biāo)都為0時(shí)表示居中Menu框:默認(rèn)值為無(wú),當(dāng)對(duì)話框需要選單時(shí)輸入或選擇指定的選單資源Class name:默認(rèn)值為無(wú),它提供C/C+語(yǔ)言編程時(shí)所需要的對(duì)話框類名,對(duì) MFC類庫(kù)的資源文件來(lái)說(shuō),該項(xiàng)不被激活三、控件的創(chuàng)建和使用方法(197頁(yè)) 控件是在系統(tǒng)內(nèi)部定義的能夠完成特定功能的控制程序單元。在應(yīng)用程序中使用控件不僅簡(jiǎn)化了編程,還能完成常用的各種功能。為了更好地發(fā)揮控件的作用,用戶還必須理解和掌握控件的屬性、消息以及創(chuàng)建和使用方法。注:控件工具欄及各按鈕含義:1、 控件的選擇2、靜態(tài)文本3、組框4、復(fù)選框5、組合框6、水平滾動(dòng)條7、旋轉(zhuǎn)按鈕8、滑動(dòng)條9、列表視圖10、標(biāo)簽11、復(fù)合編輯12、月歷13、用戶定制工具14、靜態(tài)圖片15、編輯框16、按鈕17、單選框18、列表框19、垂直滾動(dòng)條20、進(jìn)展條21、熱鍵22、樹形視圖23、動(dòng)畫24、日期選擇25、IP地址26、組合框的擴(kuò)展(從左邊往下數(shù),再?gòu)挠疫呁聰?shù)) 1、控件的創(chuàng)建和使用方法(197頁(yè)) 控件的創(chuàng)建方法有2種:1)是在對(duì)話框摸板中用編輯器指定控件,也就是說(shuō),將控件的父窗口指定為對(duì)話框,如:上面的BUTTON1按鈕控件。2)是將控件看做任意一窗口的子窗口,并通過(guò)調(diào)用相應(yīng)的Create函數(shù)來(lái)創(chuàng)建。下面我們用第2種方法創(chuàng)建控件(此種方法涉及的內(nèi)容復(fù)雜,也不能發(fā)揮對(duì)話框編輯器可視化編程的優(yōu)點(diǎn),故不提倡此種方法,而用第一種方法)。(1)打開上個(gè)項(xiàng)目,在CMyDlg類的頭文件MyDlg.h里添加一個(gè)按鈕類CButton 指針變量:(public:里) CButton *m_btnWnd;(2)按Ctrl+W或ViewClassWizard打開MFClassWizard對(duì)話框,并切換到Message Maps頁(yè)面,在Object IDs列表中選定點(diǎn)黑CMyDlg項(xiàng),并在Message列表中找到WM_INITDIALOG消息點(diǎn)黑AddFunctionEditCode(3)添加代碼:BOOL CMyDlg:OnInitDialog() - m_btnWnd=new CButton();/構(gòu)造按鈕控件/下面“”按鈕上的字,創(chuàng)建子窗口|窗口最初是可見的|創(chuàng)建的是按鍵按鈕 m_btnWnd-Create(“你好”,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(20,20,120,60),this,201);/創(chuàng)建 CFont *font=this-GetFont();/獲取對(duì)話框的字體 m_btnWnd-SetFont(font);/設(shè)置控件字體 return TRUE;/(程序原有的)代碼中,Create用來(lái)創(chuàng)建一個(gè)按鈕控件,該函數(shù)的第一個(gè)參數(shù)用來(lái)指定該按鈕的標(biāo)題,第二個(gè)參數(shù)用來(lái)指定控件的風(fēng)格,第三個(gè)參數(shù)用來(lái)指定它在父窗口中的位置和大小,第四個(gè)參數(shù)用來(lái)指定父窗口指針,最后一個(gè)參數(shù)是指定該控件的標(biāo)識(shí)值。WS_CHILD表示按鈕是作為對(duì)話框的一個(gè)子窗口來(lái)創(chuàng)建的。WS_VISIBLE是使控件可見。BS_PUSHBUTTON表示創(chuàng)建的是按鍵按鈕。 (4)編譯并運(yùn)行2、控件的數(shù)據(jù)交換和數(shù)據(jù)效驗(yàn)(數(shù)據(jù)成員)(198頁(yè)) 使用ClassWizard可以很容易地定義一個(gè)控件的成員變量及其數(shù)據(jù)范圍。例如:上面的CMyDlg類的按鈕控件IDC_BUTTON1添加并使用其成員變量m_MyBtn,步驟如下:(1)打開上例項(xiàng)目,ViewClassWizardMember Variables選定Class name中為CMyDlg,然后在Control IDs列表中點(diǎn)黑IDC_BUTTON1AddVariable(或雙擊鼠標(biāo)左鍵),彈出Add Member Variable對(duì)話框,如書198頁(yè)圖5.17寫好數(shù)據(jù)成員名:m_MyBtn 下面Category和Variables type里的不動(dòng)OK見表上已建成(如:書199頁(yè)圖5.18)下面是建成員變量的三個(gè)對(duì)話框圖:(2)再向?qū)υ捒蚣右粋€(gè)編輯控件,并加成員變量m_strEdit,類型為CString置數(shù)值為Value(注:Category框內(nèi)可選擇Value或Control兩種類型。Control所對(duì)應(yīng)的變量類型就是MFC為該控件封裝的控件類。Value所對(duì)應(yīng)的是數(shù)值類型。不同控件所提供的關(guān)聯(lián)的數(shù)值類型各不同,例如:對(duì)于編輯框來(lái)說(shuō),Variables type中的數(shù)值類型有CString (字符串),int,UINT(32位無(wú)符號(hào)整數(shù)),long(32位帶符號(hào)整數(shù)), DWORD(32位無(wú)符號(hào)整數(shù),段地址和相關(guān)的偏移),float,double,BYTE(8位無(wú)符號(hào)整數(shù)),short,BOOL等)。OK后在下面寫20為最大值。(下面見書199200頁(yè))打開本項(xiàng)目的MyDlg.h見到: CButton m_MyBtn; CString m_strEdit;在MyDlg.cpp里見到: m_strEdit=_T(“ “);在DoDataExchange函數(shù)體內(nèi)見: DDX_Control(pDX,IDC_BUTTON1,m_MyBtn); DDX_Text(pDX,IDC_EDIT1,m_strEdit);/IDC_EDIT1是標(biāo)識(shí)m_strEdit/是成員變量DDV_MaxChars(pDX,m_strEdit,20);/校驗(yàn)m_strEdit的最大字符個(gè)數(shù)不超過(guò)20。 (3)將CMyDlg:OnButton1()修改成: void CMyDlg:OnButton1() UpdateData();/默認(rèn)參數(shù)值是真TRUE m_MyBtn.SetWindowText(m_strEdit); /GetDlgItem(IDC_BUTTON1)-SetWindowText(“歡迎”);/用此條代替/上條也行, /單擊Button1按鈕,此按鈕名就是“歡迎”。之后運(yùn)行該程序,當(dāng)在編輯框輸入Hello后,單擊Button1按鈕,則該按鈕的名稱就變成了編輯框中的內(nèi)容Hello了,見書200頁(yè)。八、控件的通用屬性 (201頁(yè)) 在控件的屬性對(duì)話框中含有許多屬性,如:書201頁(yè)(按鈕的屬性對(duì)話框),General(一般屬性)、Styles(控件的風(fēng)格)、Extended Styles(控件的擴(kuò)展風(fēng)格)。Styles和Extended Styles是用來(lái)設(shè)定控件的外觀的、輔助功能的。不同控件具有不同的風(fēng)格和擴(kuò)展風(fēng)格。見201頁(yè)表5.5.控件的General屬性:ID:控件的標(biāo)識(shí)符,每種控件都有默認(rèn)的ID,例如按鈕控件為IDC_BUTTON1Caption:控件的標(biāo)題,大多數(shù)控件都有默認(rèn)的標(biāo)題,例如按鈕控件為Button1Visible:指定控件初始化時(shí)是否可見Group:指定控件組中的第一個(gè)控件,如果該項(xiàng)被選中,則此控件后的所有控件均被看成一組,成組的目的是可以讓用戶鍵盤方向鍵在同一組控件中進(jìn)行切換Help ID:若該項(xiàng)被選中,則為該控件建立一個(gè)上下文相關(guān)的幫助標(biāo)識(shí)符Disabled:指定控件初始化時(shí)是否禁用TabStop:若該項(xiàng)被選中,則用戶可以使用Tab鍵來(lái)選擇控件九、控件的消息 對(duì)于每個(gè)消息,系統(tǒng)都會(huì)用一個(gè)MSG結(jié)構(gòu)來(lái)記錄(見201頁(yè))。對(duì)一般控件來(lái)說(shuō),其通知消息是一條WM_COMMAND消息(見202頁(yè))。例:1、打開上面的項(xiàng)目“對(duì)話框”2、ViewClassWizard在CMyDlg里(左邊的Object IDs里點(diǎn)黑CMyDlg) 在Message里找到OnCommand點(diǎn)黑Add FunctionEdit Code寫: BOOL CMyDlg:OnCommand(WPARAM wParam,LPARAM lParam) WORD nCode=HIWORD(wParam);/控件的通知消息 WORD nID=LOWORD(wParam);/控件的ID號(hào) if(nID=201)&(nCode=BN_CLICKED)/用戶單擊按鈕產(chǎn)生的消息MessageBox(你按下了你好按鈕!); - /WORD是16位無(wú)符號(hào)整數(shù) /EN_CHANGE是編輯框中的文本被改變時(shí)發(fā)出的消息BN_CLICKED是當(dāng)用戶單擊按鈕產(chǎn)生的消息:?jiǎn)螕魧?duì)話框中的“你好”按鈕,彈出你按下了你好按鈕!的消息對(duì)話框。由于Create創(chuàng)建的控件無(wú)法用ClassWizard直接映射其消息,因此上述方法禰補(bǔ)了ClassWizard的不足,使用時(shí)要特別注意。見書202頁(yè)通知消息是所有Windows控件所共有的:NM_CLICK 在控件中單擊鼠標(biāo)左鍵按鈕NM_DBLCLK 在控件中雙擊鼠標(biāo)左鍵按鈕NM_RDBLCLK在控件中雙擊鼠標(biāo)右鍵按鈕NM_RETURN當(dāng)控件具有輸入焦點(diǎn)時(shí)按下ENTER鍵NM_SETFOCUS控件得到輸入焦點(diǎn)NM_KILLFOCUS控件失去輸入焦點(diǎn)NM_OUTOFMEMORY沒有足夠的內(nèi)存使控件十、常用控件靜態(tài)控件 CStatic 用于向用戶顯示一些幾乎固定不變的文字或圖形描述按 鈕 CButton 用于產(chǎn)生某些命令或改變某些選項(xiàng)設(shè)置編輯框 CEdit 可完成文字的輸入、輸出雙向操作,使用戶能查看并編輯文字 列表框 CListBox顯示一個(gè)列表,讓用戶從中選取一個(gè)或多個(gè)項(xiàng)組合框 CComboBox它把列表框和編輯框有機(jī)地組合在一起,用戶不僅能選擇列表中已有的項(xiàng),還能編輯出新的項(xiàng)滾動(dòng)條 CScrollBar通過(guò)滾動(dòng)塊在滾動(dòng)條上的移動(dòng)來(lái)改變某些數(shù)值進(jìn)展條 CProgressCtrl 用于指示一個(gè)操作的進(jìn)度旋轉(zhuǎn)按鈕 CSpinButtonCtrl 又稱“上下控制”,是一對(duì)箭頭按鈕,用戶單擊它們可以增加或減小某個(gè)值滾動(dòng)條 CSliderCtrl 是一個(gè)包含一個(gè)滑動(dòng)塊和可選的刻度線,用戶可以用鼠標(biāo)或方向鍵沿某個(gè)方向移動(dòng)滑動(dòng)塊圖象列表 CImageList是一系列相同大小的圖象的集合標(biāo)簽控件 CTabCtrl類似于一個(gè)筆記本的分割器或一個(gè)文件柜上的標(biāo)簽,使用它可以將一個(gè)窗口或?qū)υ捒虻南嗤瑓^(qū)域定義為多個(gè)頁(yè)面1、靜態(tài)控件 靜態(tài)控件是用于顯示一個(gè)字符、框、矩形、圖標(biāo)、位圖或增強(qiáng)的圖元文件,它可以用做標(biāo)簽、框或用于分隔其它的控件。一個(gè)靜態(tài)控件一般不接受用戶輸入,也不產(chǎn)生通知消息。在對(duì)話框編輯器的控件工具欄中,屬于靜態(tài)控件的有:靜態(tài)文本(Static Text)、組框(Group Box)、圖片控件(Picture)三種。其中,靜態(tài)圖片控件的屬性對(duì)話框如:書204頁(yè)圖5.21所示,表5.7列出了其一般屬性和風(fēng)格的各個(gè)項(xiàng)的意義。我們可以選擇Type(圖片類型)、Image(圖象資源)兩個(gè)組合框中的有關(guān)選項(xiàng)內(nèi)容,并可將應(yīng)用程序資源中的圖標(biāo)、位圖等內(nèi)容顯示在該靜態(tài)圖片控件中。另外,用戶還可設(shè)置其風(fēng)格來(lái)改變控件的外觀以及圖象在控件的位置等。靜態(tài)圖片控件的General和Style屬性對(duì)話框:Type 圖片類型,用戶可以從中選擇Frame(框)、Rectangle(矩形區(qū)域)、Icon(圖標(biāo))、Bitmap(位圖)、Enhanced Metafile(增強(qiáng)圖元文件,它是各種繪圖命令的集合)Image 當(dāng)圖片類型為Icon或Bitmap時(shí),通過(guò)此框可選擇指定的資源ID號(hào) 設(shè)置Frame和Rectangle的顏色,它可以是black(黑色)、white(白色)、 gray(灰色)、或者是具有3D外觀的etched(腐蝕色)Sunken 選中時(shí),在控件的周圍有下沉的邊框Notify 選中時(shí),當(dāng)用戶單擊或雙擊圖片時(shí)會(huì)向其父窗口發(fā)出通知消息Right justify 選中時(shí),用戶重置圖片大小,圖片右下角是固定不變的Border 選中時(shí),圖片周圍有邊框Center image 選中時(shí),圖片顯示在控件中央,其余區(qū)域由圖片左上角的象素顏色來(lái)填充Real size image選中時(shí),按圖片的原始大小來(lái)顯示,超過(guò)控件區(qū)域的部分被裁剪 在它的屬性中,用戶可以選擇Type(圖片)、Image(圖象資源)兩個(gè)組合框中的有關(guān)選項(xiàng)內(nèi)容,并可將應(yīng)用程序資源中的圖標(biāo)、位圖等內(nèi)容顯示在該靜態(tài)圖片控件中,另外,用戶還可以設(shè)置其風(fēng)格來(lái)改變控件的外觀以及圖象在控件的位置等。例1:圖片控件(將一個(gè).bmp圖形顯示在圖片控件上)(附加舉例)1)建一個(gè)單文檔(SDI)應(yīng)用程序2)創(chuàng)建對(duì)話框模板: InsertResource點(diǎn)黑Dialognew3)將圖片控件Picture拖到對(duì)話框上,并拉大些,將OK和CANCEL拖到下面。4)向項(xiàng)目中插入一個(gè) .bmp圖片:InsertResource點(diǎn)黑BitmapImport在出現(xiàn)的表中要下拉出:所有文件(*.*)在某處找到一個(gè).bmp圖形Import放到此項(xiàng)目中。5)將這個(gè)圖片放到圖片控件上 右鍵對(duì)準(zhǔn)圖片控件單擊出現(xiàn)屬性框Type處下拉置Bitmapimage處下拉置IDB_BITMAP1,就將圖片加到了圖片控件上。6)為剛才建的對(duì)話框添加類 雙擊新建對(duì)話框的任何位置OK類名寫:CMyDlg7)創(chuàng)建一個(gè)菜單項(xiàng),用來(lái)顯示對(duì)話框 ResourceViewMenuIDR_MAINFRAME雙擊空白菜單點(diǎn)POPUPID處寫:ID_DLG 菜單名寫:顯示圖片對(duì)話框關(guān)閉8)將菜單命令映射到View中去 ViewClassWizard要加到View中ID-DLGCOMMANDEditCode (在View.h的頭部加:#include “MyDlg.h” 在public:下加:CMyDlg *dlg;)并加代碼: CMyView:OnDlg() dlg=new CMyDlg(this); dlg-Create(IDD_DIALOG1); dlg-ShowWindow(SW_RESTORE); 9)編譯運(yùn)行2:按鈕常見的按鈕有三種類型:(204頁(yè))(1)按鍵按鈕 按鍵按鈕通??梢粤⒓串a(chǎn)生某個(gè)動(dòng)作,執(zhí)行某個(gè)命令,因此也常被稱為命令按鈕。(2)單選按鈕 其外形是在文本前有一個(gè)圓圈,當(dāng)它被選中時(shí),就標(biāo)上一個(gè)黑點(diǎn)。(3)復(fù)選框其外形是在文本前有一個(gè)空心方框,當(dāng)它被選中時(shí),就加上一個(gè)“”標(biāo)記1)按鈕的消息 常見的按鈕映射消息有兩個(gè):(1) BN_CLICKED(單擊按鈕)(2)BN_DOUBLE_CLICKED(雙擊按鈕)見下圖:2)按鈕選中操作 最常用的按鈕操作是設(shè)置或獲取一個(gè)按鈕或多個(gè)按鈕的選中狀態(tài)。CButton類的以下2個(gè)成員函數(shù)原型如下: void SetCheck(int nCheck); /設(shè)置指定按鈕的選中狀態(tài) int GetCheck()const; /獲取指定按鈕的選中狀態(tài) 其中:nCheck和GetCheck函數(shù)返回的值可以是:0表示不選中,1表示選中, 2表示不確定(僅用于三態(tài)按鈕) 而對(duì)于多個(gè)單選按鈕的選中狀態(tài)的設(shè)置或獲取,需要使用CWnd類的成員函數(shù)CheckRadioButton和GetCheckedRadioButton,它們的原型如下:void CheckRadioButton(int nIDFirstButton,int nIDLastButton,int nIDCheckButton);int GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton);其中,nIDFirstButton和nIDLastButton分別指定這組單選按鈕的第一個(gè)和最后一個(gè)按鈕ID值,nIDCheckButton用于指定要設(shè)置選中狀態(tài)的按鈕ID值,函數(shù)GetCheckedRadioButton返回被選中的按鈕ID值。例2:用靜態(tài)圖片、單選按鈕、復(fù)選框和按鍵按鈕控件設(shè)計(jì)界面,運(yùn)行結(jié)果如:書205頁(yè)圖5.23所示。剛開始,所有單選按鈕都是灰顯的,我們不能選擇它們,這種情況稱為“禁用”,而當(dāng)選中“允許”復(fù)選框后,所有單選按鈕可以使用,用戶選定一個(gè)單選框后,單擊應(yīng)用按鈕,則彈出相應(yīng)的消息對(duì)話框。(1)用MFC AppWizard(exe)創(chuàng)建一個(gè)名為:“按鈕的使用”的基于對(duì)話框的應(yīng)用程序。(第一步將類型選擇為Dialog Based,然后按Finish按鈕即可。)(2)打開屬性對(duì)話框,將其標(biāo)題改為“使用Windows常用控件”。(3)參看書205頁(yè)圖5.23的控件布局,用編輯器為對(duì)話框添加如書206頁(yè)表5.8所示的一些控件。(4)說(shuō)明:上面4個(gè)單選按鈕的Tab次序應(yīng)連續(xù),而且從IDC_RADIO1到IDC_RADIO4依次增加。(5)ViewClassWizard(或按Ctrl+W快捷鍵)切換到Member Variables頁(yè)面,在Class name中選擇CMyDlg,在Control IDs里選中點(diǎn)黑IDC_CHECK1復(fù)選框ID號(hào)Add Variables按鈕,為其添加一個(gè)BOOL類型的成員變量 m_bEnabledOK。(6)切換到ClassWizard的Message Maps頁(yè)面,分別選中點(diǎn)黑復(fù)選框IDC_CHECK1和按鈕IDC_BUTTON1,分別為其添加映射消息,并添如下代碼: void CMyDlg:OnCheck1() UpdateData(); for(int i=0;iEnableWindow(m_bEnabled);/EnableWindow是使一個(gè)控件窗口禁用或允許使用,它取決于該函數(shù)/的參數(shù),為TRUE時(shí)表示可以使用,否則禁用。void CMyDlg:OnButton1() UpdateData(); if(!m_bEnabled) return; int nID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO4); if(nID=IDC_RADIO1) MessageBox(“1”); if(nID=IDC_RADIO2) MessageBox(“2”); if(nID=IDC_RADIO3) MessageBox(“3”); if(nID=IDC_RADIO4) MessageBox(“4”); (7)在此文件中找到CMyDlg:OnInitDialog函數(shù)體,添加下列代碼: BOOL CMyDlg:OnInitDialog() CheckRadioButton(IDC_RADIO1,IDC_RADIO4,IDC_RADIO1); /設(shè)置第一個(gè)單選按鈕為選中 OnCheck1(); return TRUE;/此條是原有的(8)編譯運(yùn)行3、編輯框 編輯框是一個(gè)讓用戶從鍵盤輸入和編輯文本的矩形窗口,用戶可以通過(guò)它,很方便地輸入各種文本、數(shù)字或口令,也可使用它來(lái)編輯和修改簡(jiǎn)單的文本內(nèi)容。 當(dāng)編輯框被激活且具有輸入焦點(diǎn)時(shí),就會(huì)出現(xiàn)一個(gè)閃動(dòng)的插入符(又可稱為文本光標(biāo)),表明當(dāng)前插入點(diǎn)的位置。 1)編輯框的屬性和風(fēng)格 Align text 各行文本對(duì)齊方式:Left,Center,Right,默認(rèn)時(shí)為L(zhǎng)eftMultiline 選中時(shí)為多行編輯框,否則為單行編輯框Number 選中時(shí)控件只能輸入數(shù)字Horizontal scroll 水平滾動(dòng),僅對(duì)多行編輯框有效Auto HScroll當(dāng)用戶在行尾鍵入一個(gè)字符時(shí),文本自動(dòng)向右滾動(dòng)Vertical scroll 垂直滾動(dòng),僅對(duì)多行編輯框有效Auto VScroll 當(dāng)用戶在最后一行按ENTER鍵時(shí),文本自動(dòng)向上滾動(dòng)一頁(yè),僅對(duì)多行編輯框有效Password 選中時(shí),鍵入編輯框的字符都將顯示為”*”,用于口令設(shè)置,僅對(duì)單行編輯框有效No hide selection通常情況下,當(dāng)編輯框失去鍵盤焦點(diǎn)時(shí),被選擇的文本仍然反色顯示,選中時(shí),則不必具備此功能OEM convert 選中時(shí),實(shí)現(xiàn)對(duì)特定字符集的字符轉(zhuǎn)換Want return 選中時(shí),用戶按下ENTER鍵,編輯框中就會(huì)插入一個(gè)回車符Border 選中時(shí),在控件的周圍存在邊框Uppercase 選中時(shí),鍵入在編輯框的字符全部轉(zhuǎn)換成大寫形式Lowercase 選中時(shí),鍵入在編輯框的字符全部轉(zhuǎn)換成小寫形式Read-Only 選中時(shí),防止用戶鍵入或編輯文本多行編輯框具有簡(jiǎn)單文本編輯器的常用功能,例如:它可以有滾動(dòng)條,用戶按Enter鍵另起一行以及文本的選定、復(fù)制、粘貼等常見操作。而單行編輯框功能較簡(jiǎn)單,它僅用于單行文本的顯示和操作 2)編輯框的基本操作A、設(shè)置口令 口令設(shè)置在編輯框中不同于一般的文本編輯框,用戶輸入的每個(gè)字符都被一個(gè)特殊的字符代替顯示。這個(gè)特殊的字符稱為口令字符。默認(rèn)的口令字符是”*”。應(yīng)用程序可以用成員函數(shù)CEdit:SetPasswordChar來(lái)定義自己的口令字符,其函數(shù)原形如下: void SetPasswordChar(TCHAR ch);其中,參數(shù)ch表示設(shè)定的口令字符;當(dāng)ch=0時(shí),編輯框內(nèi)將顯示實(shí)際字符。B、選擇文本編程選擇文本,調(diào)用成員函數(shù)CEdit:SetSel來(lái)實(shí)現(xiàn),還有:CEdit:GetSel和CEdit:ReplaceSel,它們分別用來(lái)獲取編輯框中選擇的開始和結(jié)束的位置以及替換被選擇的文本。C、設(shè)置編輯框的頁(yè)面邊距用CEdit:SetMargins函數(shù)來(lái)實(shí)現(xiàn),其函數(shù)原型如下:void SetMargins(UINT nLeft,UINT nRight); 其中,參數(shù)nLeft和nRight分別用來(lái)指定左、右邊距的象素大小。D、剪帖板操作E、獲取多行編輯框文本(見書208頁(yè)-209頁(yè))。如何設(shè)置口令(密碼):附加例題見后面(教案頁(yè))3)編輯框的通知消息當(dāng)編輯框的文本修改或者被滾動(dòng)時(shí),會(huì)向其父窗口發(fā)送一些消息,這些消息是:(參看書209頁(yè)表5.10并由下圖所示:)EN_CHANGE當(dāng)編輯框中的文本已被修改,在新的文本顯示之后發(fā)送此消息EN_HSCROLL當(dāng)編輯框的水平滾動(dòng)條被使用,在更新顯示之前發(fā)送此消息EN_KILLFOCUS編輯框失去鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息EN_MAXTEXT文本數(shù)目到達(dá)了限定值時(shí)發(fā)送此消息EN_SETFOCUS編輯框得到鍵盤輸入焦點(diǎn)時(shí)發(fā)送此消息EN_UPDATE編輯框中的文本已被修改,新的文本顯示之前發(fā)送此消息EN_VSCROLL當(dāng)編輯框的垂直滾動(dòng)條被使用,在更新顯示之前發(fā)送此消息 例:使用靜態(tài)文本、組框、編輯框以及按鈕等控件設(shè)計(jì)界面,運(yùn)行結(jié)果參書209頁(yè)圖5.25即下圖所示。當(dāng)用戶在“成績(jī)1”、“成績(jī)2”、和“成績(jī)3”編輯框中輸入成績(jī)后,單擊計(jì)算平均分按鈕,將顯示出這三個(gè)成績(jī)的平均分。 程序設(shè)計(jì)步驟如下:(1) 打開前面的項(xiàng)目“按鈕的使用”。(2) 向應(yīng)用程序中添加一個(gè)對(duì)話框資源,insertResource點(diǎn)黑Dialognew出現(xiàn)一個(gè)新的對(duì)話框右鍵單擊這個(gè)新對(duì)話框properties打開其屬性對(duì)話框Font將其字體設(shè)置為“新宋體,9”,標(biāo)題改為“使用編輯框”,ID號(hào)改為IDD_EDIT,刪除默認(rèn)的Cancel按鈕。(3)、(4)、(5)按書210頁(yè)往下作書(6)m_strAve=0.00; UpdateData(FALSE);/將成員變量數(shù)據(jù)傳給控件,并在控件中顯示書(7)UpdateData();/將控件顯示的數(shù)據(jù)傳給成員變量 double ave=(double)(m_nScore1+m_nScore2+m_nScore3)/3.0; m_strAve.Format(%6.2f,ave);/Format是CString類的一個(gè)經(jīng)常使用的成/員函數(shù),它通過(guò)格式操作使任意類型的數(shù)據(jù)轉(zhuǎn)換成一個(gè)字符串 UpdateData(FALSE);/將成員變量數(shù)據(jù)傳給控件,并在控件中顯示書(8)定位到void CMyDlg:OnButton1() -/注意,這是你上個(gè)程序的按鈕命令,在里找到: if(nID= =IDC_RADIO1) CEditDlg dlg; /注意,將原來(lái)MessageBox(1);去掉 dlg.DoModal(); /加上這2條 書(9)在上個(gè)程序的:按鈕的使用Dlg.cpp即CMyDlg.cpp的頭文件處加: #include EditDlg.h(就是(8)所在的文件) 編譯運(yùn)行4、列表框列表框是一個(gè)列有許多項(xiàng)目讓用戶選擇的控件。它與單選按鈕組或復(fù)選框組一樣,都可讓用戶在其中選擇一個(gè)或多個(gè)項(xiàng)。但不同的是,列表框中項(xiàng)的數(shù)目是可靈活變化的,程序運(yùn)行時(shí)可往列表框中添加或刪除某些項(xiàng)。并且,當(dāng)列表框中項(xiàng)的數(shù)目較多而不能一次全部顯示時(shí),還可以自動(dòng)提供滾動(dòng)條來(lái)讓用戶瀏覽其余的列表項(xiàng)。1) 列表框的風(fēng)格按性質(zhì)來(lái)分,列表框有單選、多選、擴(kuò)展多選以及非選四種類型,默認(rèn)風(fēng)格下的單選列表框讓用戶一次只能選擇一個(gè)項(xiàng),多列表框可讓用戶一次選擇幾個(gè)項(xiàng),而擴(kuò)展多項(xiàng)列表框允許用戶用鼠標(biāo)拖動(dòng)或其它特殊組合鍵進(jìn)行選擇,非選列表框不提供選擇功能。還有其它一系列風(fēng)格,用于定義列表框的外觀及操作方式,這些風(fēng)格可在下圖所示的列表框?qū)傩詫?duì)話框中設(shè)置:列表框的Styl屬性:Selection指定列表框的類型:?jiǎn)芜x(Single)、多選(Multiple)、擴(kuò)展多選(Extended)、不選(None)Owner draw自畫列表框,默認(rèn)為NoHas strings選中時(shí),在自畫列表框的項(xiàng)目中含有字符串文本Border選中時(shí),使列表框含有邊框Sort選中時(shí),列表框的項(xiàng)目按字母順序排列Notify選中時(shí),當(dāng)用戶對(duì)列表框操作就會(huì)向父窗口發(fā)送通知消息Multi-column選中時(shí),指定一個(gè)具有水平滾動(dòng)的多列列表框Horizontal scroll選中時(shí),在列表框中創(chuàng)建一個(gè)水平滾動(dòng)條Vertical scroll選中時(shí),在列表框中創(chuàng)建一個(gè)垂直滾動(dòng)條No redraw選中時(shí),列表框發(fā)生變化后不會(huì)自動(dòng)重畫Use tabstops選中時(shí),允許使用停止位來(lái)調(diào)整列表項(xiàng)的水平位置Want key input選中此項(xiàng),當(dāng)用戶按鍵且列表框有輸入焦點(diǎn)時(shí),就會(huì)向列表框的父窗口發(fā)送相應(yīng)消息Disable no scroll選中時(shí),即使列表框的列表項(xiàng)能全部顯示,垂直滾動(dòng)條也會(huì)顯示,但此時(shí)是禁用的(灰顯)No integral height選中時(shí),在創(chuàng)建列表框的過(guò)程中,系統(tǒng)會(huì)把用戶指定的尺寸完全作為列表框的尺寸,而不論是否有項(xiàng)目在列表框,也不能完全顯示出來(lái)2) 列表框的基本操作當(dāng)列表框創(chuàng)建之后,往往要添加、刪除、改變或獲取列表框中的列表項(xiàng),這些操作都可以調(diào)用MFC的CListBox類成員函數(shù)加以實(shí)現(xiàn)。索引:表明項(xiàng)目在列表框中排列的位置,它是以0為基數(shù)的,即列表框中第一項(xiàng)的索引是0,第二項(xiàng)的索引是1,依次類推。(1)添加列表項(xiàng)列表框創(chuàng)建時(shí)是一個(gè)空的列表,需要用戶添加或插入一些列表項(xiàng),其函數(shù)原型為:int AddString(LPCTSTR lpszItem); int InsertString(int nIndex,LPCTSTR lpszItem); 其中:列表項(xiàng)的字符串文本由參數(shù)pszItem來(lái)指定,成功返回列表在列表框的索引,錯(cuò)誤返回LB_ERR,空間不夠返回LB_ERRSPACE。但:InsertString函數(shù)不會(huì)將列表項(xiàng)進(jìn)行排序,不論列表框控件是否具有sort屬性,只是將列表項(xiàng)插在指定索引的列表項(xiàng)之前,若nIndex等于-1,則列表項(xiàng)添加在列表框末尾。而:AddString函數(shù)在當(dāng)列表框控件具有sort屬性時(shí)會(huì)自動(dòng)將添加的列表項(xiàng)進(jìn)行排序。以上2個(gè)函數(shù)只能將字符串增加到列表框中,但有時(shí)用戶還會(huì)需要根據(jù)列表項(xiàng)使用其他數(shù)據(jù)。這時(shí),ListBox的SetItemData和SetItemDataPtr能有效解決這個(gè)問題,它們能使用戶數(shù)據(jù)和某個(gè)列表項(xiàng)關(guān)聯(lián)起來(lái):int SetItemData(int nIndex,DWORD dwItemData);int SetItemDataPtr(int nIndex,void *pData);其中,SetItemData是將一個(gè)32位數(shù)與某列表項(xiàng)(由nIndex指定)關(guān)聯(lián)起來(lái),而 SetItemDataPtr可以將用戶的數(shù)組、結(jié)構(gòu)體等大量的數(shù)據(jù)與列表項(xiàng)關(guān)聯(lián) 若產(chǎn)生錯(cuò)誤,它們都返回LB_ERR而:GetItemData和GetItemDataPar分別用來(lái)獲取相關(guān)聯(lián)的用戶數(shù)據(jù)。 以下等待修改(2)刪除列表項(xiàng)(3)查找列表項(xiàng)(4)列表框的單項(xiàng)選擇(5)列表框的多項(xiàng)選擇3) 列表框的通知消息 當(dāng)列表框中發(fā)生了某個(gè)動(dòng)作,如用戶雙擊選擇了列表框中某儀項(xiàng)時(shí),列表框就會(huì)向父窗口發(fā)送一條通知消息。常用的通知消息如書214頁(yè)表5.14所示。例:將一個(gè)SCORE結(jié)構(gòu)(含有三門成績(jī)的數(shù)據(jù)成員)數(shù)據(jù)和列表中每一個(gè)學(xué)生姓名列表關(guān)聯(lián)起來(lái)。當(dāng)用戶單擊添加記錄按鈕時(shí),學(xué)生成績(jī)記錄中的“姓名“被添加在列表框中,且該學(xué)生的成績(jī)與該列表項(xiàng)關(guān)聯(lián)。當(dāng)用戶單擊刪除記錄按鈕時(shí),列表框中當(dāng)前選擇項(xiàng)被刪除,相關(guān)聯(lián)的數(shù)據(jù)所占的內(nèi)存空間被釋放。任何時(shí)候選中列表框中某個(gè)學(xué)生,相應(yīng)的記錄數(shù)據(jù)被顯示出來(lái),如:書214頁(yè)圖5.27所示。(1) 打開前面的基于對(duì)話框的項(xiàng)目“按鈕的使用”。(2) 向項(xiàng)目中添加一個(gè)對(duì)話框資源IDD_LISTBOX,標(biāo)題為“使用列表框”,并用ClassWizard為此對(duì)話框建類為:CListBoxDlg。接著按書214頁(yè)往下作:(3)、(4)-(可在此處將第9步、第11步作出. 因?yàn)榈?步要用到SCORE結(jié)構(gòu)體 )書(5)UpdateData(TRUE);if(m_strName.IsEmpty()/判斷m_strName是否為空 MessageBox(姓名不能為空!); return;m_strName.TrimLeft();/裁剪m_strName左邊的空格m_strName.TrimRight();/裁剪m_strName右邊的空格if(m_List.FindString(-1,m_strName)!=LB_ERR) MessageBox(列表框中已有相同姓名,不能添加!); return;int nIndex=m_List.AddString(m_strName);/向列表框添加學(xué)生 /姓名將該學(xué)生成績(jī)與新增的列表項(xiàng)關(guān)聯(lián)起來(lái)SCORE data;data.score1=m_nScore1;data.score2=m_nScore2;data.score3=m_nScore3;m_List.SetItemDataPtr(nIndex,new SCORE(data);書(6)int nIndex=m_List.GetCurSel();/獲得當(dāng)前選項(xiàng)的索引if(nIndex!=LB_ERR) m_List.DeleteString(nIndex);/刪除當(dāng)前選擇項(xiàng) m_strName.Empty(); m_nScore1=m_nScore2=m_nScore3=0; UpdateData(FALSE);else MessageBox(當(dāng)前沒有選擇項(xiàng)或列表框操作失敗!);書(7)int nIndex=m_List.GetCurSel();if(nIndex!=LB_ERR) m_List.GetText(nIndex,m_strName); SCORE *data=(SCORE *)m_List.GetItemDataPtr(nIndex); m_nSc

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論