




已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章常用控件 5 1控件的創(chuàng)建和基本使用方法5 2靜態(tài)控件和按鈕5 3編輯框和旋轉(zhuǎn)按鈕控件5 4列表框5 5組合框5 6進(jìn)展條 滾動條和滑動條5 7日期時間控件 圖像列表和標(biāo)簽控件 5 1控件的創(chuàng)建和基本使用方法 5 1 1控件的創(chuàng)建方法控件的創(chuàng)建方式有以下兩種 在對話框模板中用編輯器指定控件 將對話框看作控件的父窗口 編程方式 即調(diào)用相應(yīng)控件類的成員函數(shù)Create來創(chuàng)建 并在Create函數(shù)指定控件的父窗口指針 表5 1常用控件類 5 1控件的創(chuàng)建和基本使用方法 1 選擇 文件 新建 選擇MFCAppWizard exe 的項目類型 在工程框中輸入項目名Ex DlgCtrls 如圖 2 單擊 確定 在出現(xiàn)的 Step1 對話框中選擇 基本對話 應(yīng)用程序類型 單擊 完成 創(chuàng)建一個默認(rèn)的基于對話框的應(yīng)用程序項目 5 1控件的創(chuàng)建和基本使用方法 3 切換到ClassView頁面 右擊CEx DlgCtrlsDlg類名 如圖 4 選擇AddMemberVariable 在對話框中定義一個CButton類對象m btnWnd 如圖 單擊 OK 5 1控件的創(chuàng)建和基本使用方法 5 在ClassView頁面中 雙擊OnInitDialog函數(shù)名 在函數(shù)中添加代碼 BOOLCEx DlgCtrlsDlg OnInitDialog CDialog OnInitDialog m btnWnd Create 你好 WS CHILD WS VISIBLE BS PUSHBUTTON CRect 20 20 120 60 this 201 創(chuàng)建CFont font this GetFont 獲取對話框的字體m btnWnd SetFont font 設(shè)置控件字體returnTRUE 對話框中的一些初始化代碼都添加在Dialog函數(shù)中 Create用來創(chuàng)建一個按鈕控件 第一個參數(shù)指定按鈕的標(biāo)題 第二個參數(shù)指定控件的風(fēng)格 第三個參數(shù)指定它在父窗口中的位置和大小 第四個參數(shù)指定父窗口指針 最后一個參數(shù)是指定該控件的標(biāo)識值 WS CHILD WS VISIBLE和BS PUSHBUTTON是系統(tǒng)內(nèi)部定義的標(biāo)識符 可以直接引用 按鈕是作為對話框的一個子窗口來創(chuàng)建的 因此其風(fēng)格中必需要有WS CHILD 子窗口風(fēng)格 WS VISIBLE是使控件可見 BS PUSHBUTTON表示創(chuàng)建的是按鍵按鈕 5 1控件的創(chuàng)建和基本使用方法 6 編譯并運行 如圖 5 1控件的創(chuàng)建和基本使用方法 5 1 2控件的消息及消息映射映射控件消息下面的步驟是在Ex DlgCtrls基礎(chǔ)上進(jìn)行的 1 打開Ex DlgCtrls應(yīng)用程序項目 2 將項目工作區(qū)窗口切換到ResourseView頁面 雙擊Dialog資源下的標(biāo)識IDD EX DLGCTRLS DIALOG 打開該對話框資源模板 3 刪除 TODO 在這里設(shè)置對話控制 控件 添加一個按鈕控件 如圖 4 按快捷鍵Ctrl W 查看 Classname 列表中是否選擇了CEx DlgCtrlsDlg 在IDs列表中選擇IDC BUTTON1 然后在Messages框中選擇BN CLICKED消息 5 1控件的創(chuàng)建和基本使用方法 5 單擊 AddFunction 按鈕或雙擊BN CLICKED消息 出現(xiàn) AddMemberFunction 對話框 在這里可以輸入成員函數(shù)的名稱 系統(tǒng)默認(rèn)的函數(shù)名為OnButton1 如圖 5 1控件的創(chuàng)建和基本使用方法 需要說明的是 l不同資源對象 控件 菜單命令等 所產(chǎn)生的消息是不相同的 例如 按鈕控件IDC BUTTON1的消息有兩個 BN CLICKED和BN DOUBLECLICKED 分別表示當(dāng)用戶單擊或雙擊該按鈕時產(chǎn)生的消息 l一般不需要對對話框中的 OK 與 Cancel 按鈕進(jìn)行消息映射 因為系統(tǒng)已自動設(shè)置了這兩個按鈕的動作 當(dāng)用戶單擊這兩個按鈕都將自動關(guān)閉對話框 且 OK 按鈕動作還使得對話框數(shù)據(jù)有效 6 單擊 OK 在MFCClassWizard的 Memberfunctions 列表中將列出新增加的成員函數(shù) 選擇此函數(shù) 單擊 EditCode 或直接在函數(shù)名雙擊鼠標(biāo) 開發(fā)環(huán)境的文檔窗口中將自動打開該函數(shù)所在的源代碼文件 并定位到該函數(shù)的實現(xiàn)代碼處 在此成員函數(shù)中添加下列代碼 voidCEx DlgCtrlsDlg OnButton1 MessageBox 你按下了 Button1 按鈕 7 編譯運行 單擊 Button1 時 就會執(zhí)行OnButton1函數(shù) 5 1控件的創(chuàng)建和基本使用方法 控件消息映射機(jī)制MFCClassWizard對上述按鈕的消息映射作了哪些代碼的添加 1 項目工作區(qū)FileView 展開HeadFiles所有項 雙擊CEx DlgCtrlsDlg類的頭文件Ex DlgCtrlsDlg h 在Ex DlgCtrlsDlg h文檔內(nèi)容可以找到這樣的代碼 protected Generatedmessagemapfunctions AFX MSG CEx DlgCtrlsDlg afx msgvoidOnButton1 AFX MSGDECLARE MESSAGE MAP DECLARE MESSAGE MAP 聲明對消息映射的支持 加粗語句對消息函數(shù)OnButton1的聲明 afx msg是用來聲明此函數(shù)是一個消息函數(shù) AFX MSG CEx DlgCtrlsDlg 和 AFX MSG 用來標(biāo)明它們之間的消息函數(shù)聲明內(nèi)容是由MFCClassWizard自動管理的 5 1控件的創(chuàng)建和基本使用方法 2 在項目工作區(qū)FileView頁面中 展開SourceFiles所有項 雙擊CEx DlgCtrlsDlg類的源文件Ex DlgCtrlsDlg cpp 在Ex DlgCtrlsDlg h文檔內(nèi)容可以找到這樣的代碼 BEGIN MESSAGE MAP CEx DlgCtrlsDlg CDialog AFX MSG MAP CEx DlgCtrlsDlg ON BN CLICKED IDC BUTTON1 OnButton1 AFX MSG MAPEND MESSAGE MAP BEGIN MESSAGE MAP和END MESSAGE MAP之間是用來定義該類所支持的消息映射 BEGIN MESSAGE MAP帶有兩個參數(shù) 第一個參數(shù)指定需要支持消息映射的用戶派生類 第二個參數(shù)指定該類的基類 ON BN CLICKED將按鈕控件和消息函數(shù)一一關(guān)聯(lián) 需要說明的是 MFC為應(yīng)用程序中所用到的消息都有類似這樣的消息宏定義 AFX MSG MAP CEx DlgCtrlsDlg 和 AFX MSG MAP 用來標(biāo)明它們之間的消息映射內(nèi)容是由MFCClassWizard自動管理 一個類中的所有消息的映射宏都將添加在這里 3 在Ex DlgCtrlsDlg cpp文件的后部分還有消息函數(shù)的實現(xiàn)代碼 5 1控件的創(chuàng)建和基本使用方法 映射控件通用消息上述的過程是映射一個控件的某一個消息 也可以通過WM COMMAND消息的映射來處理一個或多個控件的通用消息 如下步驟 打開MFCClassWizard 在 Classname 列表中是否選擇了CEx DlgCtrlsDlg 在IDs列表中選擇CEx DlgCtrlsDlg 在Messages框中找到并雙擊OnCommand 如圖 OnCommand函數(shù)是一個用來處理WM COMMAND消息的虛函數(shù) 添加的OnCommand函數(shù)是一個在類中實際調(diào)用的函數(shù) 可稱為 實例函數(shù) 這樣的映射操作 可以稱之為 對虛函數(shù)OnCommand的重載 5 1控件的創(chuàng)建和基本使用方法 2 在OnCommand函數(shù)中添加下列代碼 BOOLCEx DlgCtrlsDlg OnCommand WPARAMwParam LPARAMlParam WORDnCode HIWORD wParam 控件的通知消息WORDnID LOWORD wParam 控件的ID號if nID 201 它將控件的消息交由對話框其他函數(shù)處理 5 1控件的創(chuàng)建和基本使用方法 5 1 3控件的數(shù)據(jù)交換 DDX 和數(shù)據(jù)校驗 DDV DDX將數(shù)據(jù)成員變量同對話類模板內(nèi)的控件相聯(lián)接 DDV用于數(shù)據(jù)的校驗 例如它能自動校驗數(shù)據(jù)成員變量數(shù)值的范圍 并發(fā)出相應(yīng)的警告 使用MFCClassWizard可以很容易地為一個控件定義關(guān)聯(lián)變量并可設(shè)置其數(shù)據(jù)范圍 例如 下面的步驟是為CEx DlgCtrlsDlg類的按鈕控件IDC BUTTON1添加并使用其關(guān)聯(lián)變量m RelBtn 1 打開MFCClassWizard 并切換到MemberVariables頁面 如圖 5 1控件的創(chuàng)建和基本使用方法 2 Classname為CEx DlgCtrlsDlg 選定所要關(guān)聯(lián)的控件IDIDC BUTTON1 雙擊鼠標(biāo)左鍵或單擊 AddVariable 按鈕 在對話框設(shè)置變量的名稱 類別和數(shù)據(jù)類型 如圖 說明 Category框內(nèi)可選擇Value或Control兩種類型 Control所對應(yīng)的變量類型就是MFC為該控件封裝的控件類 Value所對應(yīng)的是數(shù)值類型 不同的控件所提供的關(guān)聯(lián)的數(shù)值類型各不相同 5 1控件的創(chuàng)建和基本使用方法 3 在Membervariablename框中填好與控件相關(guān)聯(lián)的成員變量m RelBtn 單擊 OK 又回到MFCClassWizard對話框的MemberVariables頁面中 在ControlIDs列表中出現(xiàn)剛才添加的控件關(guān)聯(lián)變量 說明 DDV DDX技術(shù)中 允許用戶為同一個控件關(guān)聯(lián)多個變量 但必須保證這些變量名是互不相同的 且這些變量在同一個類型不能有多個變量 添加的關(guān)聯(lián)變量是一個數(shù)值類型 在MFCClassWizard對話框的MemberVariables頁面下方還要求用戶輸入變量的范圍 這就是控件的數(shù)據(jù)校驗設(shè)置 例如 在CEx DlgCtrlsDlg對話框中任意添加一個編輯框控件 并取默認(rèn)的ID號IDC EDIT1 為其關(guān)聯(lián)一個CString類型的成員變量m strEdit后 如圖 它要求在下方的MaximumCharacters框中設(shè)定該變量允許的最大字符個數(shù) 5 1控件的創(chuàng)建和基本使用方法 4 單擊 確定 MFCClassWizard對上述操作作了三方面的修改 l在Ex DlgCtrlsDlg h文件中 添加控件關(guān)聯(lián)變量的聲明 代碼如下面的加粗部分 DialogData AFX DATA CEx DlgCtrlsDlg enum IDD IDD EX DLGCTRLS DIALOG 枚舉類型CButtonm RelBtn CStringm strEdit AFX DATAl在Ex DlgCtrlsDlg cpp中CEx DlgCtrlsDlg構(gòu)造函數(shù)實現(xiàn)代碼添加初始代碼 CEx DlgCtrlsDlg CEx DlgCtrlsDlg CWnd pParent NULL CDialog CEx DlgCtrlsDlg IDD pParent AFX DATA INIT CEx DlgCtrlsDlg m strEdit T AFX DATA INIT 5 1控件的創(chuàng)建和基本使用方法 在Ex DlgCtrlsDlg cpp中的DoDataExchange內(nèi)添加控件的DDX DDV代碼 voidCEx DlgCtrlsDlg DoDataExchange CDataExchange pDX CDialog DoDataExchange pDX 調(diào)用此函數(shù)作為DDX的開始 AFX DATA MAP CEx DlgCtrlsDlg DDX Control pDX IDC BUTTON1 m RelBtn DDX Text pDX IDC EDIT1 m strEdit IDC EDIT1與m strEdit進(jìn)行數(shù)據(jù)交換DDV MaxChars pDX m strEdit 20 校驗m strEdit的最大字符不超過20 AFX DATA MAP 5 1控件的創(chuàng)建和基本使用方法 5 為控件定義一個關(guān)聯(lián)的數(shù)據(jù)變量 就可使用CWnd UpdateData實現(xiàn)控件數(shù)據(jù)的輸入和讀取 例如 將CEx DlgCtrlsDlg OnButton1修改成下列代碼 voidCEx DlgCtrlsDlg OnButton1 UpdateData 默認(rèn)參數(shù)值是TRUEm RelBtn SetWindowText m strEdit UpdateData FALSE 數(shù)據(jù)由控件相關(guān)聯(lián)的成員變量向控件傳輸 UpdateData TRUE 或不帶參數(shù)的UpdateData 數(shù)據(jù)從控件向相關(guān)聯(lián)的成員變量復(fù)制 添加的控件m RelBtn是一個CButton類對象 CButton類繼承了其基類CWnd的特性 可以調(diào)用基類的成員函數(shù)SetWindowText來改變按鈕控件的標(biāo)題 6 運行程序 在編輯框中輸入 Hello 單擊 Button1 OnButton1函數(shù)中的UpdateData將編輯框內(nèi)容保存到m strEdit變量中 從而執(zhí)行下一條語句后按鈕的名稱就變成了編輯框控件中的內(nèi)容 Hello 如圖 5 2靜態(tài)控件和按鈕 5 2 1靜態(tài)控件一個靜態(tài)控件是用來顯示一個字符串 框 矩形 圖標(biāo) 位圖或增強的圖元文件 它可以被用來作為標(biāo)簽 框或用來分隔其它的控件 一個靜態(tài)控件一般不接收用戶輸入 也不產(chǎn)生通知消息 5 2靜態(tài)控件和按鈕 用戶可以選擇圖片 類型 圖像 資源兩個組合框中的有關(guān)選項內(nèi)容 并可將應(yīng)用程序資源中的圖標(biāo) 位圖等內(nèi)容顯示在該靜態(tài)圖片控件中 用戶還可設(shè)置其風(fēng)格來改變控件的外觀以及圖像在控件的位置等 例如 下面的示例過程是在用靜態(tài)圖片控件在對話框中添加一個水平蝕刻線 1 打開Ex DlgCtrls項目中的對話框資源模板IDD EX DLGCTRLS DIALOG 2 在該對話框適當(dāng)?shù)奈恢锰幪砑右粋€靜態(tài)圖片控件 右擊該控件 從彈出的快捷菜單中選擇 屬性 對話框 如圖 5 2靜態(tài)控件和按鈕 3 在屬性對話框中 選擇 顏色 類型為Etched 然后關(guān)閉屬性對話框 4 將鼠標(biāo)移動到添加的靜態(tài)圖片控件的右下角位置 使鼠標(biāo)指針變成 拖動鼠標(biāo)使控件的大小變成一條水平線 單擊對話框測試按鈕 如圖 5 2靜態(tài)控件和按鈕 5 2 2按鈕在Windows常見的按鈕有 按鍵按鈕 單選按鈕 復(fù)選框按鈕 如圖 不同按鈕的作用按鍵按鈕常被稱為命令按鈕 有兩種風(fēng)格 標(biāo)準(zhǔn)按鍵按鈕和默認(rèn)按鍵按鈕 從外觀上來說 默認(rèn)按鍵按鈕是在標(biāo)準(zhǔn)按鍵按鈕的周圍加上一個黑色邊框 一般只把最常用的按鍵按鈕設(shè)定為默認(rèn)按鍵按鈕 具體設(shè)定的方法是在按鍵按鈕屬性對話框的Style頁面中選中 默認(rèn)按鈕 Defaultbutton 項 單選按鈕的外形是在文本前有一個圓圈 它被選中時 單選按鈕中就標(biāo)上一個黑點 它可分為一般和自動兩種類型 復(fù)選框當(dāng)它被選中 復(fù)選框中就加上一個 標(biāo)記 通常復(fù)選框只有選中和未選中兩種狀態(tài) 若復(fù)選框前面有一個灰色是 則這樣的復(fù)選框是三態(tài)復(fù)選框 5 2靜態(tài)控件和按鈕 按鈕的消息常見只有兩個 BN CLICKED 單擊 和BN DOUBLE CLICKED 雙擊 按鈕選中操作最常用的按鈕操作是設(shè)置或獲取一個按鈕或多個按鈕的選中狀態(tài) CButton類的成員函數(shù)SetCheck和GetCheck分別用來設(shè)置或獲取指定按鈕的選中狀態(tài) 其原型如下 voidSetCheck intnCheck intGetCheck const nCheck和GetCheck函數(shù)返回值 0表示不選中 1表示選中 2表示不確定 對多個單選按鈕的選中狀態(tài)的設(shè)置或獲取 需要使用通用窗口類CWnd的成員函數(shù)CheckRadioButton和GetCheckedRadioButton 原型如下 voidCheckRadioButton intnIDFirstButton intnIDLastButton intnIDCheckButton intGetCheckedRadioButton intnIDFirstButton intnIDLastButton nIDFirstButton和nIDLastButton分別指定這組單選按鈕的第一個和最后一個按鈕ID值 nIDCheckButton用來指定要設(shè)置選中狀態(tài)的按鈕ID值 函數(shù)GetCheckedRadioButton返回被選中的按鈕ID值 5 2靜態(tài)控件和按鈕 5 2 3實例 制作問卷調(diào)查 1 創(chuàng)建一個默認(rèn)的基于對話框應(yīng)用Ex Research 2 單擊對話框編輯器工具欄上的切換網(wǎng)格按鈕 標(biāo)題改為 上網(wǎng)問卷調(diào)查 3 刪除對話框的 TODO 在這里設(shè)置對話控制 控件 向?qū)υ捒蛑刑砑咏M框 Group 控件 然后調(diào)整其大小和位置 4 右擊添加的組框控件 選擇 屬性 將Caption屬性內(nèi)容由 Static 改成 你的年齡 在Styles屬性中 水平對齊 屬性用來指定文本的位置 5 在組框內(nèi)添加4個單選按鈕 在屬性中將ID屬性分別改成IDC AGE L18 IDC AGE 18T27 IDC AGE 28T38和IDC AGE M38 將其 標(biāo)題 Caption屬性內(nèi)容改成 38 如圖 5 2靜態(tài)控件和按鈕 6 添加一個靜態(tài)文本 標(biāo)題為 你使用的接入方式 添加4個單選按鈕 標(biāo)題分別是 FTTL或ADSL 單位LAN 撥號56K 和 其他 將ID屬性改成 IDC CM FTTL IDC CM LAN IDC CM 56K和IDC CM OTHER 用對話框編輯器工具欄的按鈕命令調(diào)整控件左右之間的間距 如圖 7 添加一個組框 標(biāo)題為 你上網(wǎng)主要是 添加四個復(fù)選框 其標(biāo)題為 收發(fā)郵件 瀏覽資料 聊天游戲 和 其他 ID為IDC DO POP IDC DO READ IDC DO GAME和IDC DO OTHER 如圖 8 單擊測試對話框 將每一組中的第一個單選按鈕的Group屬性選中 5 2靜態(tài)控件和按鈕 9 分別將這二個問題中的第一個單選按鈕的Group 組 屬性均選中 如圖是對第二個問題設(shè)置的結(jié)果 10 單擊對話框編輯器工具欄上的切換輔助線按鈕 將對話框中的控件調(diào)整到輔助線以內(nèi) 單擊工具欄上的測試對話框按鈕 如圖 11 將工作區(qū)切換到ClassView頁面 雙擊OnInitDialog函數(shù)名 在此函數(shù)添加下列初始化代碼 BOOLCEx ResearchDlg OnInitDialog CDialog OnInitDialog CheckRadioButton IDC AGE L18 IDC AGE M38 IDC AGE 18T27 CheckRadioButton IDC CM FTTL IDC CM OTHER IDC CM FTTL CButton pBtn CButton GetDlgItem IDC DO POP pBtn SetCheck 1 使 收發(fā)郵件 復(fù)選框選中returnTRUE 5 2靜態(tài)控件和按鈕 12 用MFCClassWizard在CEx ResearchDlg中添加IDO的BN CLICKED消息映射 添加代碼 voidCEx ResearchDlg OnOK CStringstr strCtrl CString是操作字符串的MFC類 獲取第一個問題的用戶選擇str 你的年齡 UINTnID GetCheckedRadioButton IDC AGE L18 IDC AGE M38 GetDlgItemText nID strCtrl 獲取指定控件的標(biāo)題文本str str strCtrl str str n你使用的接入方式 nID GetCheckedRadioButton IDC CM FTTL IDC CM OTHER GetDlgItemText nID strCtrl 獲取指定控件的標(biāo)題文本str str strCtrl 獲取第三個問題的用戶選擇str str n你上網(wǎng)主要是 n UINTnCheckIDs 4 IDC DO POP IDC DO READ IDC DO GAME IDC DO OTHER CButton pBtn for inti 0 iGetCheck pBtn GetWindowText strCtrl str str strCtrl str str MessageBox str CDialog OnOK 5 2靜態(tài)控件和按鈕 13 編譯并運行 出現(xiàn) 上網(wǎng)問卷調(diào)查 對話框 當(dāng)回答問題后 按 確定 按鈕 出現(xiàn)如圖的消息對話框 顯示用戶選擇的內(nèi)容 5 3編輯框和旋轉(zhuǎn)按鈕控件 5 3 1編輯框的屬性和通知消息編輯框的屬性對話框 編輯框的Style屬性 5 3編輯框和旋轉(zhuǎn)按鈕控件 編輯框的通知消息 5 3編輯框和旋轉(zhuǎn)按鈕控件 5 3 2編輯框的基本操作口令設(shè)置輸入的字符都被一個口令字符代替顯示 默認(rèn)的口令字符是 應(yīng)用程序可以用成員函數(shù)CEdit SetPasswordChar來定義自己的口令字符 函數(shù)原型 voidSetPasswordChar TCHARch 參數(shù)ch表示設(shè)定的口令字符 選擇文本鼠標(biāo)選擇文本 在文本的一端按下鼠標(biāo)左鍵并拖動鼠標(biāo) 到另一端釋放鼠標(biāo)鍵 鍵盤選擇文本 在按光標(biāo)方向移動鍵的同時 按住Shift鍵 通過編程選擇文本 調(diào)用成員函數(shù)CEdit SetSel 確定編輯框內(nèi)文本的選擇范圍 相對應(yīng)的還有CEdit GetSel 獲取編輯框中當(dāng)前被選擇文本的開始和結(jié)束位置 和CEdit ReplaceSel 替換當(dāng)前被選擇的文本 設(shè)置編輯框的頁面邊距調(diào)用成員函數(shù)CEdit SetMargins實現(xiàn) 函數(shù)的原型 voidSetMargins UINTnLeft UINTnRight 參數(shù)nLeft和nRight用來指定左 右邊距的像素大小 剪帖板操作編輯框通過CEdit類的Copy Paste和Cut成員函數(shù)實現(xiàn)文本的復(fù)制 粘貼 剪切 并自動支持鍵盤快捷操作 對應(yīng)的快捷健為Ctrl C Ctrl V和Ctrl X 應(yīng)用程序調(diào)用CEdit Undo函數(shù)時 還可撤消當(dāng)前的操作 再調(diào)用一次該函數(shù) 則恢復(fù)剛才的操作 5 3編輯框和旋轉(zhuǎn)按鈕控件 獲取多行編輯框文本獲取多行編輯框控件的文本的兩種方法 一種是使用DDX DDV 當(dāng)將編輯框控件所關(guān)聯(lián)的變量類型選定為CString后 則不管多行編輯框的文本有多少都可用此變量來保存 這種方法不能單獨獲得多行編輯框中的某一行文本 另一種方法是使用編輯框CEdit類的相關(guān)成員函數(shù)來獲取文本 例如 下面的代碼將顯示編輯框中第二行的文本內(nèi)容 charstr 100 if m Edit GetLineCount 2 判斷多行編輯框的文本是否有兩行以上 intnChars nChars m Edit LineLength m Edit LineIndex 1 m Edit GetLine 1 str nChars 獲取第二行文本str nChars 0 MessageBox str 調(diào)用GetLine獲得某行文本內(nèi)容時 不能自動在文本后添加文本的結(jié)束符 0 因此需要首先獲得某行文本的字符數(shù) 然后設(shè)置文本的結(jié)束符 5 3編輯框和旋轉(zhuǎn)按鈕控件 5 3 3旋轉(zhuǎn)按鈕控件旋轉(zhuǎn)按鈕控件常用的風(fēng)格旋轉(zhuǎn)按鈕控件屬性對話框 旋轉(zhuǎn)按鈕控件的Style屬性旋轉(zhuǎn)按鈕控件屬性對話框 5 3編輯框和旋轉(zhuǎn)按鈕控件 旋轉(zhuǎn)按鈕控件的基本操作成員函數(shù)SetBase用來設(shè)置基數(shù)的 這個基數(shù)值決定了伙伴窗口顯示的數(shù)字是十進(jìn)制還是十六進(jìn)制 成功返回先前的基數(shù)值 無效返回一個非零值 原型如下 intSetBase intnBase 參數(shù)nBase表示控件的新的基數(shù) 與此函數(shù)相對應(yīng)的成員函數(shù)GetBase是獲取旋轉(zhuǎn)按鈕控件的基數(shù) 成員函數(shù)SetPos和SetRange設(shè)置旋轉(zhuǎn)按鈕控件的當(dāng)前位置和范圍 原型 intSetPos intnPos voidSetRange intnLower intnUpper nPos表示控件的新位置 nLower和nUpper表示控件的上限和下限 任何一個界限值都不能大于0 x7fff或小于 0 x7fff 成員函數(shù)GetPos和GetRange用來獲取旋轉(zhuǎn)按鈕控件的當(dāng)前位置和范圍 旋轉(zhuǎn)按鈕控件的通知消息旋轉(zhuǎn)按鈕控件的通知消息只有一個 UDN DELTAPOS 它是在當(dāng)控件的當(dāng)前數(shù)值將要改變時向其父窗口發(fā)送的 5 3編輯框和旋轉(zhuǎn)按鈕控件 5 3 4實例 用對話框輸入學(xué)生成績具體步驟 1 創(chuàng)建一個默認(rèn)的單文檔應(yīng)用程序Ex CtrlSDI 2 添加一個新的對話框資源 ID號改為IDD INPUT 標(biāo)題為 學(xué)生成績輸入 將 OK 和 Cancel 按鈕標(biāo)題改為 確定 和 取消 3 將 確定 和 取消 移至對話框的下方 然后顯示對話框網(wǎng)格 4 向?qū)υ捒蛱砑涌丶?調(diào)整控件的位置 如圖 5 3編輯框和旋轉(zhuǎn)按鈕控件 5 選擇 編排 TabOrder 或按快捷鍵Ctrl D 單擊對話框中的控件 重新設(shè)置控件的Tab鍵次序 以保證旋轉(zhuǎn)按鈕控件的Tab鍵次序在相對應(yīng)的編輯框 伙伴窗口 之后 如圖 單擊對話框或按Enter鍵結(jié)束TabOrder方式 5 3編輯框和旋轉(zhuǎn)按鈕控件 6 雙擊對話框模板空白處 為該對話框模板創(chuàng)建一個對話框類CInputDlg 7 在ClassWizard的MemberVariables頁面中 確定Classname中是否已選擇了CInputDlg 選中所需的控件ID號 雙擊鼠標(biāo)或單擊AddVariables按鈕 依次為下列控件增加成員變量 5 3編輯框和旋轉(zhuǎn)按鈕控件 8 MesssageMaps頁面中 為CInputDlg添加WM INITDIALOG消息映射 添加代碼 BOOLCInputDlg OnInitDialog CDialog OnInitDialog m spinScore1 SetRange 0 100 設(shè)置旋轉(zhuǎn)按鈕控件范圍m spinScore2 SetRange 0 100 m spinScore3 SetRange 0 100 returnTRUE 9 為CInputDlg增加IDC SPIN S1控件的UDN DELTAPOS消息映射 添加代碼 voidCInputDlg OnDeltaposSpinS1 NMHDR pNMHDR LRESULT pResult NM UPDOWN pNMUpDown NM UPDOWN pNMHDR UpdateData TRUE 將控件的內(nèi)容保存到變量中m fScore1 float pNMUpDown iDelta 0 5f if m fScore1100 0 m fScore1 100 0f UpdateData FALSE 將變量的內(nèi)容顯示在控件中 pResult 0 NM UPDOWN結(jié)構(gòu)用于反映旋轉(zhuǎn)控件的當(dāng)前位置和增量大小 10 打開Ex CtrlSDI單文檔應(yīng)用程序的菜單資源 添加頂層菜單項 測試 T 在其下添加一個菜單項 學(xué)生成績輸入 I ID為ID TEST INPUT 5 3編輯框和旋轉(zhuǎn)按鈕控件 11 用MFCClassWizard為CMainFrame類添加菜單項ID TEST INPUT的COMMAND消息映射 添加代碼 voidCMainFrame OnTestInput CInputDlgdlg if IDOK dlg DoModal 獲取對話框數(shù)據(jù)CStringstr str Format s s 4 1f 4 1f 4 1f dlg m strName dlg m strNO dlg m fScore1 dlg m fScore2 dlg m fScore3 AfxMessageBox str if語句是判斷用戶是否單擊對話框的 確定 Format通過格式操作使任意類型的數(shù)據(jù)轉(zhuǎn)換成一個字符串 該函數(shù)的第一個參數(shù)是帶格式的字符串 每一個格式符依次對應(yīng)于該函數(shù)的后面參數(shù)表中的參數(shù)項 5 3編輯框和旋轉(zhuǎn)按鈕控件 12 在文件MainFrm cpp的前面添加CInputDlg類的包含語句 include Ex CtrlSDI h include MainFrm h include InputDlg h 13 編譯并運行 結(jié)果如圖5 26所示 單擊成績1的旋轉(zhuǎn)按鈕控件將以0 5增量來改變它的伙伴窗口的數(shù)值 而成績2和成績3的旋轉(zhuǎn)按鈕控件由于設(shè)置了Setbuddyinteger屬性 因此它按默認(rèn)增量1自動改變伙伴窗口的數(shù)值 5 4列表框 5 4 1列表框的風(fēng)格和消息列表框的屬性對話框 5 4列表框 5 4列表框 5 4 2列表框的基本操作添加列表項CListBox類成員函數(shù)AddString和InsertString向列表框增加列表項 函數(shù)原型 intAddString LPCTSTRlpszItem intInsertString intnIndex LPCTSTRlpszItem 列表項的字符串文本由參數(shù)lpszItem來指定 InsertString函數(shù)不會對列表項進(jìn)行排序 若nIndex等于 1 則列表項添加在列表框末尾 AddString函數(shù)當(dāng)列表框控件具有sort屬性時會自動將添加的列表項進(jìn)行排序 用戶需要根據(jù)列表項使用其他數(shù)據(jù) 就要調(diào)用CListBox的SetItemData和SetItemDataPtr 它們能使用戶數(shù)據(jù)和某個列表項關(guān)聯(lián)起來 intSetItemData intnIndex DWORDdwItemData intSetItemDataPtr intnIndex void pData SetItemData是將一個32位數(shù)與某列表項 由nIndex指定 關(guān)聯(lián)起來 SetItemDataPtr可以將用戶的數(shù)組 結(jié)構(gòu)體等大量的數(shù)據(jù)與列表項關(guān)聯(lián) GetItemData和GetItemDataPtr分別用來獲取相關(guān)聯(lián)的用戶數(shù)據(jù) 刪除列表項CListBox類成員函數(shù)DeleteString和ResetContent用來刪除指定的列表項和清除列表框所有項目 函數(shù)原型 intDeleteString UINTnIndex nIndex指定要刪除的列表項的索引voidResetContent 注意 若在添加列表項時使用SetItemDataPtr函數(shù) 不要忘記在進(jìn)行刪除操作時及時將關(guān)聯(lián)數(shù)據(jù)所占的內(nèi)存空間釋放出來 5 4列表框 查找列表項CListBox類成員函數(shù)FindString和FindStringExact在列表框中查找匹配的列表項 intFindString intnStartAfter LPCTSTRlpszItem const intFindStringExact intnIndexStart LPCTSTRlpszFind const lpszFind和lpszItem指定要查找的列表項文本 nStartAfter和nIndexStart指定查找的開始位置 查到后 兩個函數(shù)都將返回所匹配列表項的索引 列表框的單項選擇當(dāng)選中列表框中某個列表項 用戶可以使用CListBox GetCurSel來獲取這個結(jié)果 與該函數(shù)相對應(yīng)的CListBox SetCurSel函數(shù)是用來設(shè)定某個列表項呈選中狀態(tài) 高亮顯示 intGetCurSel const 返回當(dāng)前選擇項的索引intSetCurSel intnSelect nSelect指定要設(shè)置的列表項索引 錯誤時這兩個函數(shù)都將返回LB ERR 若要獲取某個列表項的字符串 可使用下列函數(shù) intGetText intnIndex LPTSTRlpszBuffer const voidGetText intnIndex CStringnIndex指定列表項索引 lpszBuffer和rString是用來存放列表項文本 5 4列表框 列表框的多項選擇在列表框的Style屬性中選中多選或擴(kuò)展多選類型后 就可以在列表框中進(jìn)行多項選擇 獲得選中的多個選項 需用MFCClassWizard映射列表框控件的LBN SELCHANGE消息 添加類似代碼 voidCListBoxDlg OnSelchangeList1 intnCount m list GetSelCount 獲取用戶選中的項數(shù)if nCount LB ERR int buffer newint nCount 開辟緩沖區(qū)m list GetSelItems nCount buffer 將各個選項的索引號內(nèi)容存放在緩沖區(qū)中CStringallStr str allStr Empty 字符串清空for inti 0 i nCount i m list GetText buffer i str 獲得各個索引的項目文本allStr allStr str 處理項目文本 delete buffer 釋放內(nèi)存 MessageBox allStr 處理獲得的文本 5 4列表框 5 4 3實例 城市郵政編碼如圖 單擊 添加 城市名和郵政編碼添加到列表框中 單擊列表框的城市名 將在編輯框中顯示出城市名和郵政編碼 單擊 修改 將以城市名作為列表框的查找關(guān)鍵字 找到后修改其郵政編碼內(nèi)容 步驟 1 打開前面創(chuàng)建的單文檔程序項目Ex CtrlSDI 2 添加一個對話框資源IDD CITYZIP 標(biāo)題定為 城市郵政編碼 將此對話框類設(shè)為CCityDlg 3 刪除原來的 Cancel 按鈕 將 OK 按鈕標(biāo)題改為 退出 4 打開對話框網(wǎng)格 用編輯器為對話框添加控件 5 4列表框 5 打開ClassWizard的MemberVariables 在Classname中選擇CCityDlg 選中所需的控件ID號 雙擊鼠標(biāo)或單擊AddVariables按鈕 6 將項目工作區(qū)切換到ClassView頁面 右擊CCityDlg類名 從彈出的快捷菜單中選擇 AddMemberFunction 彈出如圖5 30所示的對話框 在FunctionType 函數(shù)類型 框中輸入BOOL 在FunctionDeclaration 函數(shù)聲明 框中輸入IsValidate 單擊 OK 5 4列表框 7 在CCityDlg IsValidate函數(shù)輸入下列代碼 BOOLCCityDlg IsValidate UpdateData m strCity TrimLeft if m strCity IsEmpty MessageBox 城市名輸入無效 returnFALSE m strZip TrimLeft if m strZip IsEmpty MessageBox 郵政編碼輸入無效 returnFALSE returnTRUE TrimLeft是CString類的一個成員函數(shù) 用來去除字符串左邊的空格 IsValidate函數(shù)是判斷城市名和郵政編碼編輯框中的內(nèi)容是否是有效 5 4列表框 8 打開MFCClassWizard 切換到MesssageMaps頁面 為按鈕IDC BUTTON ADD添加BN CLICKED的消息映射 增加代碼 voidCCityDlg OnButtonAdd if IsValidate return intnIndex m ListBox FindStringExact 1 m strCity if nIndex LB ERR MessageBox 該城市已添加 return nIndex m ListBox AddString m strCity m ListBox SetItemDataPtr nIndex newCString m strZip 函數(shù)SetItemDataPtr可以將用戶的數(shù)組 包括字符串 結(jié)構(gòu)體等大型數(shù)據(jù)與列表項相關(guān)聯(lián) 調(diào)用時一般要用new運算符為對象分配內(nèi)存 9 用MFCClassWizard為按鈕IDC BUTTON CHANGE添加BN CLICKED的消息映射 增加代碼 voidCCityDlg OnButtonChange if IsValidate return intnIndex m ListBox FindStringExact 1 m strCity if nIndex LB ERR delete CString m ListBox GetItemDataPtr nIndex m ListBox SetItemDataPtr nIndex newCString m strZip 5 4列表框 10 用MFCClassWizard為列表框IDC LIST1添加LBN SELCHANGE 當(dāng)前選擇項發(fā)生改變 的消息映射 并增加下列代碼 voidCCityDlg OnSelchangeList1 intnIndex m ListBox GetCurSel if nIndex LB ERR m ListBox GetText nIndex m strCity m strZip CString m ListBox GetItemDataPtr nIndex UpdateData FALSE 11 用MFCClassWizard為對話框添加WM DESTROY的消息映射 增加代碼 voidCCityDlg OnDestroy 此消息是當(dāng)對話框關(guān)閉時發(fā)送的 for intnIndex m ListBox GetCount 1 nIndex 0 nIndex 刪除所有與列表項相關(guān)聯(lián)的CString數(shù)據(jù) 并釋放內(nèi)存delete CString m ListBox GetItemDataPtr nIndex CDialog OnDestroy 當(dāng)對話框從屏幕消失后 對話框被清除時發(fā)送WM DESTROY消息 在此消息的映射函數(shù)中添加一些對象刪除代碼 以便在對話框清除前有效地釋放內(nèi)存空間 5 4列表框 12 打開Ex CtrlSDI單文檔應(yīng)用程序的菜單資源 在頂層菜單項 測試 14 在文件MainFrm cpp的前面添加CCityDlg類的包含語句 include MainFrm h include InputDlg h include CityDlg h 15 編譯運行并測試 5 5組合框 5 5 1組合框的風(fēng)格類型和消息組合框分為三類 簡單組合框 下拉式組合框 下拉式列表框 如圖 簡單組合框和下拉式組合框都包含有列表框和編輯框 簡單組合框中的列表框不需要下拉 是直接顯示出來的 單擊下拉式組合框中的下拉按鈕時 下拉的列表框才被顯示出來 下拉式列表框雖然具有下拉式的列表 卻沒有文字編輯功能 組合框還有其他一些風(fēng)格 這些風(fēng)格可在如圖的組合框的屬性對話框中設(shè)置 5 5組合框 5 5組合框 5 5 3實例 簡單文件對話框?qū)嵗木唧w步驟如下 1 打開前面創(chuàng)建的單文檔應(yīng)用程序程序項目Ex CtrlSDI 2 添加一個對話框資源IDD SIMPLE 標(biāo)題定為 簡單文件對話框 將此對話框類設(shè)為CSimpFileDlg 3 將 OK 和 Cancel 按鈕標(biāo)題分別改為 確定 和 取消 4 打開對話框網(wǎng)格 用編輯器為對話框添加如下表所示的一些控件 組合框添加到對話框模板后 一定要單擊組合框的下拉按鈕 然后調(diào)整出現(xiàn)的下拉框大小 下拉框 5 5組合框 5 打開ClassWizard的MemberVariables頁面 在Classname中選擇CSimpFileDlg 選中所需的控件ID號 雙擊鼠標(biāo)或單擊AddVariables按鈕 6 為CSimpFileDlg類添加成員函數(shù)ResetFileCombo 函數(shù)代碼 voidCSimpFileDlg ResetFileCombo CStringstr m comboFile ResetContent 刪除原來的全部項m comboFile Dir DDL READWRITE DDL READONLY DDL ARCHIVE str 將當(dāng)前文件路徑下的文件添加到組合框中 函數(shù)Dir將指定路徑下的文件或文件夾名添加到組合框中 該函數(shù)有兩個參數(shù) 第一參數(shù)指定相應(yīng)的文件屬性 第二個參數(shù)指定文件類型或其他通配字符 文件屬性可以是一些預(yù)定義值或 組合 列表框類CListBox也有Dir成員函數(shù) 5 5組合框 7 為CSimpFileDlg類添加成員函數(shù)ResetFolderList 用來更新文件夾 目錄 列表中的內(nèi)容 函數(shù)代碼如下 voidCSimpFileDlg ResetFolderList CStringstr m listFolder ResetContent 刪除原來的全部項m listFolder Dir DDL DIRECTORY DDL EXCLUSIVE str 將當(dāng)前文件路徑下的文件夾添加到列表框中 8 用MFCClassWizard為組合框IDC COMBO TYPE添加CBN SELCHANGE 當(dāng)前選擇項發(fā)生改變 的消息映射 并增加下列代碼 voidCSimpFileDlg OnSelchangeComboType intnIndex m comboType GetCurSel 獲取當(dāng)前選擇項索引號if nIndex CB ERR CStringstr m comboType GetLBText nIndex str 獲取當(dāng)前選擇項內(nèi)容ResetFileCombo str 更新文件列表 5 5組合框 9 用MFCClassWizard為組合框IDC COMBO DRIVER添加CBN SELCHANGE的消息映射 增加代碼 voidCSimpFileDlg OnSelchangeComboDriver intnIndex m comboDriver GetCurSel 獲取當(dāng)前選擇項索引號if nIndex CB ERR CStringstr m comboDriver GetLBText nIndex str 獲取當(dāng)前選擇項內(nèi)容CStringstrPath strPath Format c str GetAt 2 SetCurrentDirectory strPath ResetFolderList 更新文件夾列表內(nèi)容OnSelchangeComboType 按 文件類型 更新文件列表內(nèi)容 若切換到D盤根目錄 則應(yīng)用 d 格式 因此用Format 函數(shù)來轉(zhuǎn)換 GetAt用來獲取字符串中指定位置的字符 str GetAt 2 是獲取字符串str的第3個字符 SetCurrentDirectory是一個系統(tǒng)API函數(shù) 用來設(shè)置當(dāng)前目錄 函數(shù)參數(shù)用來指定目錄的相對路徑或絕對路徑 函數(shù)SetCurrentDirectory調(diào)用前面加上的域作用符 是用來指定調(diào)用的函數(shù)是CSimpFileDlg類外部的函數(shù) 5 5組合框 10 用MFCClassWizard為列表框IDC LIST FOLDER添加LBN DBLCLK 雙擊列表項 的消息映射 并增加下列代碼 voidCSimpFileDlg OnDblclkListFolder intnIndex m listFolder GetCurSel 獲取當(dāng)前選擇項索引號if nIndex LB ERR CStringstr m listFolder GetText nIndex str 獲取當(dāng)前選擇項內(nèi)容CStringstrPath strPath str Mid 1 str GetLength 2 SetCurrentDirectory strPath 設(shè)置當(dāng)前目錄ResetFolderList 更新文件夾列表內(nèi)容OnSelchangeComboType 按 文件類型 更新文件列表內(nèi)容 必須將列表項文本內(nèi)容的方括號去除 CString類的成員函數(shù)Mid是用來取字符串中間的內(nèi)容 它有兩個參數(shù) 第一個參數(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度珠寶企業(yè)社會責(zé)任與環(huán)保合作合同
- 二零二五年度汽車贈與及二手車置換增值服務(wù)合同
- 二零二五年度放棄祖屋繼承權(quán)的明確合同
- 2025年度石材幕墻安裝與維護(hù)管理合同協(xié)議
- 二零二五年度水資源保護(hù)融資合同
- 二零二五年度土地租賃合同糾紛處理指南
- 2025年度貨物損失賠償協(xié)議書:跨境電商供應(yīng)鏈風(fēng)險分擔(dān)合同
- 二零二五年度師徒互助職業(yè)技能提升協(xié)議
- 二零二五年度足浴店轉(zhuǎn)讓與市場推廣合作框架協(xié)議
- 2025年度涂料行業(yè)綠色生產(chǎn)推廣合同
- 2024年廣東職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2025年湖北宜昌枝江金潤源集團(tuán)招聘17人高頻重點提升(共500題)附帶答案詳解
- 2023CSCO兒童及青少年白血病診療指南
- 第一單元 閱讀綜合實踐(同步課件)【知識精研】七年級語文下冊高效課堂(統(tǒng)編版)
- 初中物理競賽及自主招生專題講義:第8講 電路 (共5節(jié))含解析
- 2024年版慢性阻塞性肺疾病(COPD)診療指南解讀課件
- 2024解析:第八章牛頓第一定律、二力平衡-基礎(chǔ)練(解析版)
- 《傳媒法的原則》課件
- 2024解析:第十三章內(nèi)能-基礎(chǔ)練(解析版)
- 2024年網(wǎng)格員考試題庫含答案
- GB/Z 44047-2024漂浮式海上風(fēng)力發(fā)電機(jī)組設(shè)計要求
評論
0/150
提交評論