




已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
對話框編程 對話框用戶界面程序的編寫 如何向?qū)υ捒蚩丶?lián)接數(shù)據(jù)成員及其實現(xiàn)機理 如何向?qū)υ捒蚩仃P(guān)聯(lián)控件類 如何利用對話框類的成員函數(shù)向控件發(fā)送消息和獲取對話框控件的類指針 如何直接利用對話框控件類操縱對話框控件 發(fā)送消息和直接調(diào)用成員函數(shù) 如何在程序運行時產(chǎn)生和銷毀控件 對話框控件的幾種操作方式 對話框及控件 對話框及控件 如何實現(xiàn)對話框的部分收縮和展開 如何制作屬性頁對話框和向?qū)υ捒蛉绾问褂米煮w對話框如何改變對話框和控件的背景色如何改變控件的文本顏色 通過本章的學習 掌握對話框的編程 包括模式對話框 無模式對話框以及屬性表和屬性頁理解對話框控件和相對應(yīng)的變量之間的交互 會熟練使用UpdateData函數(shù)掌握各種控件的使用 尤其是編輯框 列表框 組合框 按鈕要熟練 理解TabOrder的含義會使用位圖按鈕 以及一些其它的通用控件 如進展控制 動畫控制 微調(diào)按鈕 滑動條控制等 對話框編程 要在窗口中顯示一個對話框 步驟如下 插入一個對話框資源 對話框本身也是窗口 在MFC中 對資源的操作都是通過相應(yīng)類來完成的 對話框資源也有相應(yīng)的一個類 這個類叫CDialog CDialog是從CWnd派生出來的 是一個窗口 通過ClassWizard創(chuàng)建一個類來與這個對話框資源相關(guān)聯(lián)創(chuàng)建對話框窗口 分有模式對話框的創(chuàng)建 DoModal 和非模式對話框的創(chuàng)建 Create 對話框的種類有模式對話框用于交換一些重要信息 強制用戶完成所要求的動作有模式對話框在打開狀態(tài)時 禁止用戶在應(yīng)用的其它地方進行工作 但多數(shù)允許用戶切換到其他的應(yīng)用程序中 無模式對話框不禁止父窗口 它允許用戶不需要關(guān)閉該無模式對話框 就可返回到另一任務(wù) Find對話框就是一例 無模式對話框當點擊OK按鈕時 非模態(tài)對話框并沒有銷毀 它只是隱藏了 當我們點擊OK按鈕時 它是由基類的OnOk虛函數(shù)來響應(yīng)的 它只是不可見 并沒有銷毀它 這是編寫非模態(tài)對話框應(yīng)注意的地方 要在你的類中去覆蓋OnOk函數(shù) 在函數(shù)內(nèi)去調(diào)用DestroyWindow銷毀對話框窗口 對話框上動態(tài)創(chuàng)建按鈕實現(xiàn)功能 在對話框上添加一個按鈕 當點擊這個按鈕時在對話框上動態(tài)增加一個按鈕 任何從CWnd派生的類都有一個成員m hWnd 保存了與這個對象相關(guān)聯(lián)的窗口句柄 if m btn m hWnd NULL m btn Create 編程 BS DEFPUSHBUTTON WS VISIBLE WS CHILD CRect 0 0 100 100 this 123 else m btn DestroyWindow 技巧 如果想放置同樣類型的控件 按照Ctrl鍵 選擇對話框上已有的控件拖動就可實現(xiàn)復(fù)制粘貼功能 對于靜態(tài)文本框 它主要是起標記作用 所以它的ID號都是一樣的 缺省情況下它不接收點擊事件 如果我們要響應(yīng)文本框的點擊事件 要把它的ID值改變一下 然后打開靜態(tài)文本框的屬性對話框 選中Styles的標簽頁中的Notify復(fù)選框 對話框上文本框和編輯框的編程 對話框控件訪問七種方式 GetDlgItem Get Set WindowText GetDlgItemText SetDlgItemText GetDlgItemInt SetDlgItemInt 將控件和數(shù)值型變量相關(guān)聯(lián)將控件和控件變量相關(guān)聯(lián)SendMessage SendDlgItemMessage 要用到UpdataData函數(shù) 這個函數(shù)的作用是用來初始化數(shù)據(jù) 或者用來校驗對話框數(shù)據(jù) 這個函數(shù)帶一個參數(shù) 如果為真 表示數(shù)據(jù)從控件獲取 如果為假 表示控件正在被初始化 框架在一個模態(tài)對話框被創(chuàng)建時會自動調(diào)用這個函數(shù)將參數(shù)設(shè)為FALSE 改變對話框以及對話框控件的顏色 窗口消息WM CTLCOLOR OnCtlColor是用來響應(yīng)WM CTLCOLOR消息的響應(yīng)函數(shù) 返回值是畫刷的句柄 是用來繪制控件的背景色 當控件將要繪制時 框架會調(diào)用這個函數(shù) 大多數(shù)控件會發(fā)送這個消息給它的父窗口 通常是對話框 用來準備pDc來繪制控件 要改變控件文本的顏色 通過調(diào)用SetTextColor函數(shù) OnCtlColor函數(shù) 第二個參數(shù)是請求顏色的控件的指針 第三個參數(shù)是考慮正在繪制的是哪個控件 在對話框中 每個控件的繪制都要發(fā)送WM CTLCOLOR 也就是說 在一個對話框中 WM CTLCOLOR被調(diào)用多次 每一個控件都會準備一個CDC的指針 通過第一個參數(shù)傳遞進來 第二個參數(shù)表明請求顏色的是哪個控件 第三個參數(shù)是那一種類型的控件 對話框捕獲WM CTLCOLOR消息OnCtlColor CDC pDC CWnd pWnd UINTnCtlColor HBRUSHhbr CDialog OnCtlColor pDC pWnd nCtlColor returnhbr 要改變背景 只要自定義一個畫刷 然后返回這個畫刷即可 改變對話框以及對話框控件的顏色 在對話框中定義CBrushm brush 在構(gòu)造函數(shù)中m brush CreateSolidBrush RGB 0 0 255 然后直接返回OnCtlColor CDC pDC CWnd pWnd UINTnCtlColor HBRUSHhbr CDialog OnCtlColor pDC pWnd nCtlColor returnhbr returnm brush 改變對話框以及對話框控件的顏色 只改變某些控件的顏色 要判讀當前正在繪制的是哪個控件 而通過第三個參數(shù)只能知道當前正在繪制的是哪類控件 要精確控制哪個控件 需要用到GetDlgCtrID 它返回的是子控件的ID號 也可返回子窗口的ID值 if pWnd GetDlgCtrlID IDC EDIT1 pDC SetTextColor RGB 255 0 0 pDC SetBkMode TRANSPARENT returnm brush 只改變某些控件的顏色 要改變文字的字體 在繪制控件時 按照指定的字體去繪制控件例 定義CFontm font 初始化m font CreatePointFont 200 華文行楷 if pWnd GetDlgCtrlID IDC TEXT pDC SelectObject 改變某控件的文字的字體 對于按鈕 要實現(xiàn)自繪的文本和顏色 應(yīng)該去編寫一個Button類 從CButton類派生 然后重載DrawItem這個函數(shù) 框架會調(diào)用DrawItem函數(shù)實現(xiàn)繪制 自繪按鈕必須有BS OWNERDRAW這個屬性 改變按鈕的外觀 對話框收縮與展開 實現(xiàn)收縮和擴展功能 要用到函數(shù)SetWindowPos該函數(shù)的第一個參數(shù)是Z順序 什么是Z次序 窗口的Z次序表明了重疊窗口堆中窗口的位置 這個窗口堆是按一個假想的軸定位的 這個軸就是從屏幕向外伸展的Z軸 Z次序最上面的窗口覆蓋所有其它的窗口 Z次序最底層的窗口被所有其它的窗口覆蓋 應(yīng)用程序設(shè)置窗口在Z次序中的位置是通過把它放在一個給定窗口的后面 或是放在窗口堆的頂部或底部 Ok按鈕的消息處理函數(shù) 如果在編輯框上按回車鍵 對話框就關(guān)閉了 原因是OK按鈕是缺省按鈕 作為缺省按鈕 當你在對話框上按了回車鍵后 就由你的缺省按鈕的處理函數(shù)來進行響應(yīng) 在基類的OnOk函數(shù)中 關(guān)閉對話框 WM INITDIALOG WM INITDIALOG消息 是在對話框創(chuàng)建完成以及它上面的控件創(chuàng)建完成 在顯示之前發(fā)送的消息 我們可以捕獲這個消息 在這個消息處理函數(shù)中進行對話框的一些初始化工作 基于對話框應(yīng)用程序的編程 逃跑按鈕的簡便實現(xiàn) 實現(xiàn) 在對話框上設(shè)置一個按鈕 當你用鼠標點擊這個按鈕時 這個按鈕就自動移到別的位置 也就是說你無法抓到它 思路 在對話框上再添加一個與剛才一模一樣的按鈕 當點擊第一個按鈕時 把這個按鈕隱藏 第二個按鈕顯示出來 當點擊第二個按鈕時 則先隱藏第二個按鈕 再把第一個按鈕顯示出來 因為這2個按鈕是一樣的 這樣實現(xiàn) 給用戶的感覺就是你點擊按鈕時 它跑到另一個位置 當你又點擊它時 它又跑走了 給用戶的感覺就是你永遠抓不到它 定義新類CMyButton 要實現(xiàn)這個功能 首先要捕獲鼠標移動消息 由誰來捕獲這個消息 由對話框來捕獲鼠標移動的消息 當鼠標移動到對話框上的時候 這個消息處理函數(shù)就開始工作了 即按鈕上下移動 這顯然不是我們需要的 我們是需要當鼠標移動到這個按鈕時 才執(zhí)行按鈕的跑動工作 即按鈕上下移動 也就是說我們鼠標移動的消息由按鈕來捕獲 在MFC中去創(chuàng)建一個新的類 讓它從CButton派生出來 將按鈕關(guān)聯(lián)一個成員變量 這個變量的類型就是我們新定義的CButton類 這樣就將控件與新定義的類關(guān)聯(lián)上了 實現(xiàn)機制 可以通過CMyButton類來捕獲鼠標移動的消息 在消息響應(yīng)函數(shù)OnMouseMove中讓一個控件隱藏 一個控件顯示 當鼠標移到這個控件時 OnMouseMove這個函數(shù)會響應(yīng) 在這個函數(shù)中讓這個控件執(zhí)行ShowWindow SW HIDE 就可隱藏 如何讓另外控件顯示出來 要是知道這個控件所關(guān)聯(lián)的對象的內(nèi)存地址 讓他調(diào)用ShowWindow就可讓它顯示出來 實現(xiàn)機制 如何獲取這個控件的指針 最簡單的辦法就是在CMyButton中定義一個新的指針變量m pMyBtn 它的類型是CMyButton 當我們用CMyButton這個類去實例化這2個對象的時候 每個對象內(nèi)部都有這樣一個成員變量m pMyBtn 這2個對象的地址互相交換一下 對于每個對象來說 它的m pMyBtn里面保存的就是對方的地址 在WM INITDIALOG消息的響應(yīng)函數(shù)OnInitDialog中 m btn1 m pMyBtn 完成了這2個對象的地址交換 m pMyBtn 0088 4400 m pMyBtn 0088 4660 0088 4400 0088 4660 m btn1 m btn2 CMyButtonm btn1 CMyButtonm btn2 實現(xiàn)機制 在OnMouseMove中ShowWindow SW HIDE 先隱藏自己m pBtn ShowWindow SW SHOW 再顯示對方 逃跑按鈕的其他實現(xiàn)方法 可以只創(chuàng)建一個按鈕 將這個按鈕關(guān)聯(lián)我們新創(chuàng)建的類 然后跟蹤鼠標移動消息 通過SetWindowPos或MoveWindow函數(shù)來移動按鈕實現(xiàn) GetClientRect rect 是得到窗口客戶區(qū)域的大小 左上角坐標永遠是 0 0 右下角坐標是窗口的寬度和高度 GetWindowRect rect 是得到整個窗口的大小和位置 左上角坐標和右下角坐標 是相對于屏幕左上角來說的 MoveWindow或SetWindowPos中的x y坐標 對于對話框來說 是相對于屏幕左上角的 對于對話框上的控件來說 是相對于對話框的客戶區(qū)的左上角來說的 要得到下圖中控件在對話框上的位置 即左上角坐標 36 56 必須這樣GetDlgItem IDC CONTROL GetWindowRect 此時 rect中的left和top成員分別是 109 186 然后ScreenToClient rect 將rect轉(zhuǎn)換為相對于對話框客戶區(qū)的坐標 此時rect中的left和top成員分別是 36 56 逃跑按鈕的其他實現(xiàn)方法 voidCMyButton OnMouseMove UINTnFlags CPointpoint staticCRectrect staticintflag 0 staticintheight width if rect IsRectNull GetWindowRect SetWindowPos NULL 100 20 width height SWP NOZORDER 按鈕在原始位置和 120 20 之間移動 逃跑按鈕的其他實現(xiàn)方法 如果按鈕在對話框上隨機移動 該如何修改 voidCMyButton OnMouseMove UINTnFlags CPointpoint staticintnRectH nRectW staticintnParentRectH nParentRectW intx y if 0 nParentRectH CRectrect GetClientRect 逃跑按鈕的其他實現(xiàn)方法 如果按鈕在對話框上隨機移動 該如何修改 GetParent GetClientRect 按鈕的標識不再是單純的文本 而是一個帶有圖形標識的按鈕一個位圖按鈕最多可以包含4個位圖 分別用來表示如下狀態(tài)抬起狀態(tài) 或一般狀態(tài) Up 按下 或被選擇 Down 獲得焦點 Focused 禁止狀態(tài) Disabled 有四個位圖來表示相應(yīng)的狀態(tài) 但只有第一個位圖是必須的 其它均是可選的 位圖按鈕 如果按鈕的位圖資源名是以U結(jié)尾的 當按鈕為正常狀態(tài) 按鈕釋放 時 位圖顯示 如果按鈕的位圖資源名是以D結(jié)尾的 當按鈕按下時 位圖才會顯示 如果按鈕的位圖資源名是以F結(jié)尾的 則當按鈕獲得當前輸入狀態(tài)時 位圖才會顯示 如果按鈕的位圖資源名是以X結(jié)尾的 只有當按鈕被禁止時 通過CWnd類的EnableWindows的函數(shù)將其禁止 位圖才會出現(xiàn) 注意 按鈕的標題和位圖資源名是相對應(yīng)的 位圖按鈕 位圖按鈕由CBitmapButton類來管理 CBitmapButton類的AutoLoad函數(shù)能對自畫式按鈕進行初始化 它自動裝載位圖 并且能夠自動調(diào)整按鈕的大小 使其適合位圖 一般在OnInitDialog函數(shù)中調(diào)用AutoLoad函數(shù) 位圖按鈕 按以下步驟可以在對話框中設(shè)置一個位圖按鈕控件 1 為按鈕生成1 4個位圖圖片 2 在對話框中加入一個具有擁有者繪制風格的按鈕即將按鈕的屬性對話框中的OwnerDraw復(fù)選框置上選擇標記即可 3 設(shè)置按鈕的標題 比如MYIMAGE 并且為按鈕任意設(shè)置一個ID 如ID MYBUTTON 位圖按鈕的編程 4 在應(yīng)用程序的資源瀏覽中 按以下方式為準備好的每個位圖設(shè)置ID 標識按鈕抬起 壓下 獲取焦點和無效的位圖ID分別設(shè)為按鈕的標題加上一個字符 U D F 和 X 即 MYIMAGEU MYIMAGED MYIMAGEF 和 MYIMAGEX 必須為位圖指定的ID加上雙引號 位圖按鈕的編程 5 在用戶應(yīng)用程序的對話框類中加上一個CBitmapButton類型的對象 例public CBitmapButtonm mybutton 6 為對話框加入消息處理函數(shù)OnInitDialog 在該函數(shù)中調(diào)用CBitmapButton對象的AutoLoad函數(shù) 如m mybutton AutoLoad ID MYBUTTON this 位圖按鈕的編程 屬性頁和屬性表 屬性頁和屬性表 一個屬性表是由一個或多個屬性頁構(gòu)成 它有效解決了大量信息無法在一個對話框上顯示的問題 并提供了信息的分類和組織管理 可把相關(guān)的信息放在一個屬性頁中 屬性頁和屬性表編程 一 創(chuàng)建屬性頁方法一 通過Insert中的Dialog 有屬性頁的資源 插入3個Large 修改ID值和標題 屬性頁的標題就是在屬性表單中出現(xiàn)的選項卡的名字 方法二 可以通過插入一個平常的對話框來實現(xiàn) 此時要修改這個對話框的風格來實現(xiàn)屬性頁的外觀 必須是Child屬性 沒有系統(tǒng)菜單 屬性頁和屬性表編程 二 在每一個屬性頁中增加一些控件三 為每一個屬性頁增加一個類基類為CPropertyPage四 創(chuàng)建屬性表插入一個新的類 名字為CSheet 從CPropertySheet派生 五 把屬性頁添加到屬性表單中在屬性表的構(gòu)造函數(shù)中利用AddPage函數(shù) 把屬性頁添加到屬性表單中 在屬性表中定義CPage1m page1 CPage2m page2 CPage3m page3 同時 include Page1 h include Page2 h include Page3 h 在2個構(gòu)造函
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 區(qū)域經(jīng)濟學(碩士課程)第5章 中國農(nóng)村區(qū)域經(jīng)濟及其發(fā)展
- 人教版(2024)七年級下冊生物期末復(fù)習全冊考點背誦提綱
- 幼兒園小班數(shù)學教案《比長短》
- 2025年公共政策與社會服務(wù)相關(guān)知識考試試卷及答案
- 2025年工程造價師職業(yè)資格考試題及答案
- 2025年普惠金融和微型信貸考試試卷及答案
- 綜合部部門半年工作總結(jié)
- 專題:低碳經(jīng)濟-沖刺 高考地理熱點梳理情境對點練 課件
- 湖北省隨州市高新區(qū)大堰坡中學2025屆英語七下期中教學質(zhì)量檢測試題含答案
- 2025年房地產(chǎn)金融投資專業(yè)綜合能力測試卷及答案
- 2025年安徽新華傳媒股份有限公司招聘筆試參考題庫含答案解析
- 《國防動員實施》課件
- H3CNE認證考試題庫及答案詳解
- 景觀綠化工程監(jiān)理規(guī)劃范文
- 公路工程施工質(zhì)量控制培訓(xùn)
- 中國高血壓防治指南(2024年修訂版)
- 2025國家公務(wù)員政治理論應(yīng)知應(yīng)會知識考試題庫(含答案)
- 蔬菜種植基地管理手冊
- 【MOOC】微處理器與嵌入式系統(tǒng)設(shè)計-電子科技大學 中國大學慕課MOOC答案
- 《扭傷后怎么辦》課件
- 食品檢驗員考試題庫單選題100道及答案解析
評論
0/150
提交評論