C++及Windows程序設(shè)計(jì)A:第10章 對(duì)話框_第1頁
C++及Windows程序設(shè)計(jì)A:第10章 對(duì)話框_第2頁
C++及Windows程序設(shè)計(jì)A:第10章 對(duì)話框_第3頁
C++及Windows程序設(shè)計(jì)A:第10章 對(duì)話框_第4頁
C++及Windows程序設(shè)計(jì)A:第10章 對(duì)話框_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、對(duì)話框第10章本章主要內(nèi)容10.2 常用控件的使用10.3 無模式對(duì)話框10.1 模式對(duì)話框基礎(chǔ)10.4 通用對(duì)話框簡介10.5 基于對(duì)話框的應(yīng)用程序10.1.1 模式對(duì)話框基礎(chǔ)對(duì)話框基本概念創(chuàng)建對(duì)話框資源關(guān)聯(lián)對(duì)話框類調(diào)用對(duì)話框1、對(duì)話框基本概念對(duì)話框是應(yīng)用程序與用戶交互信息的重要途徑,對(duì)話框窗口中通常會(huì)包含若干控件。控件是對(duì)話框的子窗口。對(duì)話框的三個(gè)概念對(duì)話框資源:描述對(duì)話框的外觀和控件布局,在資源描述文件中有對(duì)話框的定義;對(duì)話框類:為每個(gè)對(duì)話框資源關(guān)聯(lián)一個(gè)對(duì)話框類,常派生與CDialog,通過該類對(duì)象間接操縱對(duì)話框;在程序需要的地方調(diào)用對(duì)話框,完成數(shù)據(jù)交換2、創(chuàng)建對(duì)話框資源對(duì)話框資源編輯器

2、,為對(duì)話框、每個(gè)控件分配一個(gè)ID標(biāo)識(shí)符。必須指定每個(gè)控件的ID號(hào)對(duì)應(yīng)的資源描述IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 98STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION “實(shí)驗(yàn)對(duì)話框FONT 10, SystemBEGIN DEFPUSHBUTTON 確定,IDOK,30,67,50,14 PUSHBUTTON 取消,IDCANCEL,107,68,50,14 EDITTEXT IDC_INPUTNAME,78,27,78,14,ES_AUTOHSCROLL LTEXT

3、請(qǐng)輸入姓名,IDC_STATIC,29,29,41,8END3、關(guān)聯(lián)對(duì)話框類雙擊新對(duì)話框資源的空白處,可以為對(duì)話框資源關(guān)聯(lián)一個(gè)對(duì)話框類。輸入對(duì)話框類的類名選擇基類,一般情況下選擇CDialog4、調(diào)用對(duì)話框假定為對(duì)話框資源關(guān)聯(lián)了CTestDlg類,如果主程序需要調(diào)用該對(duì)話框。定義一個(gè)CTestDlg類對(duì)象;調(diào)用該對(duì)象的DoModal()方法,創(chuàng)建并顯示模式對(duì)話框;調(diào)用代碼所在文件中,要包含CTestDlg類的頭文件。#include “TestDlg.h”調(diào)用對(duì)話框示例void CMainFrame:OnCalldlg() CTestDlg dlg;dlg.DoModal();在主框架窗口類實(shí)

4、現(xiàn)文件頭部包含頭文件#include “TestDlg.h”10.1.2 數(shù)據(jù)交換數(shù)據(jù)交換的概念關(guān)聯(lián)成員變量對(duì)話框內(nèi)更新數(shù)據(jù)與主程序交換數(shù)據(jù)1、數(shù)據(jù)交換的概念對(duì)話框是用戶與主程序交換數(shù)據(jù)的重要途徑,MFC采用獨(dú)特的DDX和DDV技術(shù),可以輕松實(shí)現(xiàn)數(shù)據(jù)在控件之間及主程序之間的傳遞。使用ClassWizard可以為控件關(guān)聯(lián)一個(gè)成員變量。借助成員變量及一組成員函數(shù),可以方便地實(shí)現(xiàn)數(shù)據(jù)交換。2、關(guān)聯(lián)成員變量選擇要關(guān)聯(lián)的控件ID,雙擊輸入成員變量名,選擇類型關(guān)聯(lián)成員變量在Category框中可選擇Value和Control兩種類型Control類型:為對(duì)話框中的控件關(guān)聯(lián)一個(gè)控件類對(duì)象,通過對(duì)象操作控件本

5、身??申P(guān)聯(lián)控件類類型取決于所使用的控件。Value類型:為控件窗口中依附的值(如編輯框中的文本)關(guān)聯(lián)一個(gè)成員變量,通過成員變量獲取控件中依附的值。不同類型控件,可關(guān)聯(lián)的數(shù)據(jù)類型會(huì)有所不同。每個(gè)控件最多只能關(guān)聯(lián)Control和Value類型成員變量各1個(gè)。設(shè)置有效性規(guī)則編輯框中最多只能輸入20個(gè)字符,對(duì)于數(shù)值類型,可以指定數(shù)值范圍ClassWizard生成的代碼在CTestDlg類中增加數(shù)據(jù)成員定義CStringm_input;構(gòu)造函數(shù)中進(jìn)行初始化m_input = _T();通過DDX和DDV宏關(guān)聯(lián)控件和成員變量void CTestDlg:DoDataExchange()CDialog:DoD

6、ataExchange(pDX);/AFX_DATA_MAP(CTestDlg)DDX_Text(pDX, IDC_TESTEDIT, m_input);DDV_MaxChars(pDX, m_input, 20);/AFX_DATA_MAP3、對(duì)話框內(nèi)更新數(shù)據(jù)CDialog中的UpdateData成員函數(shù)非常重要,用于成員變量和控件之間的數(shù)據(jù)傳遞UpdateData(true);提取控件窗口中的值,將值傳遞給相關(guān)聯(lián)的成員變量。默認(rèn)參數(shù)為true。UpdateData(false);將成員變量的值傳遞給控件窗口,并更新控件窗口顯示。4、主程序獲取數(shù)據(jù)主程序CMainFrame定義CString

7、 test;void CMainFrame:OnCalldlg() CTestDlg dlg;if(dlg.DoModal()=IDOK)test=dlg.m_input;如果用戶點(diǎn)擊“確定”,返回IDOK,否則返回IDCANCEL通過成員變量,獲取用戶在對(duì)話框中輸入的值為對(duì)話框控件賦初值在主程序的CMainFrame中,定義CString test;成員,用于保存對(duì)話框中傳遞的數(shù)據(jù)void CMainFrame:OnCalldlg() CTestDlg dlg;dlg.m_input=test;if(dlg.DoModal()=IDOK)test=dlg.m_input;對(duì)話框類對(duì)象、對(duì)話框

8、窗口是兩個(gè)不同的東西,有不同的生命周期。通過關(guān)聯(lián)的成員變量,傳遞初始參數(shù)10.1.3 對(duì)話框的構(gòu)造與控制對(duì)話框創(chuàng)建過程對(duì)話框的結(jié)束控件消息映射1、對(duì)話框的創(chuàng)建調(diào)用對(duì)話框類對(duì)象的DoModal,創(chuàng)建對(duì)話框;對(duì)話框創(chuàng)建后,發(fā)送WM_CREATE消息,在該消息處理代碼中創(chuàng)建各控件;創(chuàng)建完控件后,發(fā)送WM_INITDIALOG消息,一般會(huì)重載該消息處理函數(shù)OnInitDialog ,完成對(duì)對(duì)話框及控件的初始化?;惖腛nInitDialog會(huì)調(diào)用UpdateData(false)調(diào)用DoDataExchange,將成員變量的值傳遞給控件,完成初始化。最后顯示對(duì)話框。/DlgCore.cpp中2、對(duì)話框

9、的結(jié)束DoModal函數(shù)直到用戶關(guān)閉對(duì)話框后才返回。當(dāng)用戶點(diǎn)擊“確定”關(guān)閉對(duì)話框時(shí),調(diào)用OnOK,通常在映射的函數(shù)中調(diào)用基類CDialog的OnOK,調(diào)用UpdateData(true);調(diào)用DoDataExchange將控件的值傳遞到成員變量中,最后調(diào)用EndDialog結(jié)束對(duì)話框。DoModal返回IDOK當(dāng)用戶點(diǎn)擊“取消”關(guān)閉對(duì)話框時(shí),直接調(diào)用基類的EndDialog結(jié)束對(duì)話框,DoMdal返回IDCANCEL。3、映射控件消息用戶操作對(duì)話框中的控件,會(huì)激發(fā)控件通知消息,可以使用ClassWizard映射這些消息。不同的控件所產(chǎn)生的消息是不同的,比如按鈕控件,可以映射BN_CLICKED

10、和BN_DOUBLECLICKED消息,對(duì)應(yīng)單擊或雙擊該按鈕時(shí)產(chǎn)生的消息。通常情況下,將控件通知消息映射到包含它們的對(duì)話框類中。映射控件消息選擇正確的類選擇控件的ID選擇要映射的消息,雙擊消息映射機(jī)制對(duì)話框類中定義成員函數(shù) afx_msg void OnButton1(); 實(shí)現(xiàn)成員函數(shù) void CTestDlg:OnButton1() 定義消息映射宏BEGIN_MESSAGE_MAP(CTestDlg, CDialog)/AFX_MSG_MAP(CTestDlg)ON_BN_CLICKED(IDC_BUTTON1,OnButton1)/AFX_MSG_MAPEND_MESSAGE_MAP(

11、)消息映射小結(jié)菜單命令消息、控件通知消息、標(biāo)準(zhǔn)Windows消息的映射機(jī)制都非常類似在類頭文件中定義消息映射函數(shù)在類實(shí)現(xiàn)文件中實(shí)現(xiàn)成員函數(shù)在類實(shí)現(xiàn)文件中加入消息映射條目不同類型消息在消息映射表中使用的宏不同命令消息:ON_COMMAND(菜單ID,fun)標(biāo)準(zhǔn)Windows消息:ON_WM_MOUSEMOVE()控件消息:ON_BN_CLICKED(控件ID,fun)不同的控件使用不同的宏本章主要內(nèi)容10.2 常用控件的使用10.3 無模式對(duì)話框10.1 對(duì)話框基礎(chǔ)10.4 通用對(duì)話框10.5 基于對(duì)話框的應(yīng)用程序10.2.1 控件簡介靜態(tài)控件命令按鈕單選按鈕復(fù)選框編輯框列表框組合框滾動(dòng)條旋轉(zhuǎn)

12、按鈕進(jìn)度條1、靜態(tài)控件:CStatic可顯示字符串、圖標(biāo)、位圖等,一般不接收用戶輸入,也不產(chǎn)生通知消息。分為三種:靜態(tài)文本、組框、靜態(tài)圖片。通常用于顯示內(nèi)容固定的文本,可以在設(shè)計(jì)對(duì)話框時(shí)直接指定,也可以在程序運(yùn)行時(shí)動(dòng)態(tài)改變其內(nèi)容。如果要在程序中動(dòng)態(tài)改變靜態(tài)控件的文本: 修改控件的默認(rèn)標(biāo)識(shí)符,確保其ID唯一 調(diào)用SetWindowText,改變所顯示文本2、命令按鈕:CButton單擊時(shí)往往會(huì)執(zhí)行某個(gè)命令,被稱為命令按鈕,可映射的消息有BN_CLICKED和BN_DOUBLECLICKED消息。必須設(shè)置的屬性:ID號(hào)和按鈕標(biāo)題。在對(duì)話框的所有按鈕中,有一個(gè)按鈕的Default button屬性被

13、選中,稱為默認(rèn)按鈕,回車表示點(diǎn)擊該按鈕。重要的成員 SetWindowText:設(shè)置按鈕標(biāo)題 EnableWindow:設(shè)置按鈕允許狀態(tài)3、單選按鈕:CButton確保用戶在一組選項(xiàng)中只能選中一個(gè)選項(xiàng)。放置多個(gè)單選按鈕構(gòu)成一組選項(xiàng)時(shí),第一個(gè)單選按鈕的Group屬性要選中,其后的按鈕Group屬性不選中,直至開始一個(gè)新的選項(xiàng)組。通過單選按鈕獲取用戶當(dāng)前選項(xiàng)的方法為一組單選按鈕的第一個(gè)按鈕關(guān)聯(lián)int類型的成員變量,如m_a。用戶改變選項(xiàng),調(diào)用UpdateData(true) ,m_a保存用戶選項(xiàng)的序號(hào),從0開始編號(hào)。設(shè)置m_a的值,調(diào)用UpdateData(false),可強(qiáng)行改變當(dāng)前選項(xiàng)。單選按

14、鈕:CButton對(duì)于特定的單選按鈕(CButton類成員)void SetCheck(int nCheck);int GetCheck()const;0表示不選中,1表示選中CWnd類提供的方法void CheckRadioButton(int nIDFirst,int nIDLast, int nIDChecked);int GetCheckedRadioButton(int nIDFirst,int nIDLast);4、復(fù)選框:CButton通過復(fù)選框,提供用戶任意選擇的若干選項(xiàng);多個(gè)復(fù)選框之間是并列關(guān)系,編程時(shí)需要單獨(dú)檢查每個(gè)復(fù)選框的狀態(tài)。通常為復(fù)選框關(guān)聯(lián)BOOL型成員變量,通過Up

15、dateData控制選中或讀取狀態(tài)。也可以使用下面的成員函數(shù)進(jìn)行控制。 SetCheck:設(shè)置選中狀態(tài) GetCheck:獲取選中狀態(tài)5、編輯框:CEdit編輯框常用的屬性設(shè)置Multiline:選中設(shè)置多行編輯框,多行方式下可設(shè)置水平、垂直滾動(dòng)條Password:設(shè)置后,用于輸入密碼,用戶的輸入默認(rèn)以*顯示Number:選中后只能輸入數(shù)字Read-only:設(shè)置后,用戶不能輸入內(nèi)容,但能顯示內(nèi)容編輯框:CEdit編輯框CEdit :常用方法SetLimitTet:限制輸入字符數(shù)SetPasswordChar:指定口令字符SetSel:選擇文本GetSel:獲得所選取的文本GetLineCou

16、nt:獲得文本行數(shù)LineLength:獲得指定行的字符數(shù)GetLine:獲得某行文本GetWindowText:獲得文本編輯框:CEdit編輯框關(guān)注的消息EN_CHANGE:編輯框中的文本發(fā)生變化EN_KILLFOCUS:失去焦點(diǎn)EN_SETFOCUS:獲得焦點(diǎn)6、列表框:CListBox基本特征窗口內(nèi)列出一系列文本,每個(gè)占一行每行顯示為一個(gè)字符串;各行有一個(gè)索引值,從0開始;還可以為每行關(guān)聯(lián)一個(gè)值屬性selection:選中single屬性用戶每次只能選擇一個(gè)選項(xiàng),選中multiple屬性則可多選(通過按Ctrl或Shift選擇)選中sort屬性:添加或刪除列表項(xiàng)后,列表項(xiàng)自動(dòng)排序列表框:

17、CListBox列表類的基本方法(一)AddString:添加行DeleteString:刪除行,需要指定行的序號(hào),序號(hào)從0開始GetCount:獲得列表框中總行數(shù)GetCurSel:獲得當(dāng)前選中行的序號(hào)SetCurSel:選中某行,需要指定行的序號(hào)ResetContent:清除所有行GetText:獲得某行顯示的字符串列表框:CListBox多行列表類的基本方法(二)GetSelCount:返回被選中的行數(shù)GetSelItems(int nMaxItems,LPINT rgIndex):將每個(gè)選中行的序號(hào)存入int型數(shù)組rgIndex中GetText:獲得某行的字符串列表框:CListBox

18、多行列表類的其它方法(三)FindString:查找匹配的列表項(xiàng),返回找到行的序號(hào);SetItemData:為指定列表項(xiàng)關(guān)聯(lián)一個(gè)32位的DWORD數(shù)據(jù);注意序號(hào)、列表項(xiàng)文本和關(guān)聯(lián)數(shù)據(jù)的關(guān)系。SetItemDataPtr:為指定列表項(xiàng)關(guān)聯(lián)一個(gè)void指針,可指向數(shù)組、結(jié)構(gòu)體等大量數(shù)據(jù)GetItemData:獲得關(guān)聯(lián)的32位數(shù)據(jù)GetItemDataPtr:獲得關(guān)聯(lián)的指針列表框:CListBox常用的消息LBN_DBLCLK:雙擊列表項(xiàng)LBN_SELCHANGE:當(dāng)用戶更改列表項(xiàng)LBN_KILLFOCUS:失去焦點(diǎn)7、組合框:CComboBox基本特征在type屬性中選DropDown,為下拉組合

19、框,可以下拉,也可以通過編輯框輸入選中simple,為簡單組合框,無須下拉,可以通過編輯框輸入選中Drop List,為下拉列表框,可以下拉,但不能直接輸入組合框: CComboBox常用方法列表框類方法,如AddString、GetCurSel、SetCurSel、GetCount等編輯框類方法:常用消息列表框類消息:CBN_DBLCLK、CBN_SELCHANGE編輯框類消息:CBN_EDITCHANGE等8、滾動(dòng)條: CScrollBar滾動(dòng)條基本操作(1)設(shè)置滾動(dòng)范圍:SetScrollRange操作滾動(dòng)條后,產(chǎn)生WM_HSCROLL、WM_VSCROLL消息,如果有多個(gè)滾動(dòng)條,需要在

20、OnHScroll中加以區(qū)分滾動(dòng)消息產(chǎn)生后,不同操作會(huì)產(chǎn)生不同的通知碼,點(diǎn)擊箭頭的通知碼為SB_LINELEFT、SB_LINERIGHT、點(diǎn)擊滾動(dòng)塊左右空白為SB_PAGELEFT、拖動(dòng)滾動(dòng)塊SB_THUMBTRACK滾動(dòng)條: CScrollBarSB_LINELEFT SB_LINERIGHT SB_PAGELEFT SB_PAGERIGHTSB_LINEUPSB_PAGEUPSB_THUMBTRACK和SB_THUMBPOSITIONSB_PAGEDOWNSB_LINEDOWN滾動(dòng)條: CScrollBar滾動(dòng)條基本操作(2)設(shè)置滾動(dòng)塊位置:SetScrollPos,操作滾動(dòng)條后,滾動(dòng)塊

21、不會(huì)自動(dòng)變化位置,必須調(diào)用該方法調(diào)整滾動(dòng)塊位置GetScrollRange:獲得滾動(dòng)范圍GetScrollPos:獲得當(dāng)前滾動(dòng)位置9、滑動(dòng)條:CSliderCtrl基本操作由滑動(dòng)塊和刻度線構(gòu)成,按指定增量移動(dòng)常用屬性 Orientation:設(shè)置刻度線方向 Tick marks:顯示刻度線 Point:設(shè)置刻度線及滑塊尖頭的方向 Auto ticks:按一定步長間隔顯示刻度線, 默認(rèn)間隔為1滑動(dòng)條:CSliderCtrl基本方法設(shè)置滑動(dòng)條范圍:SetRange設(shè)置滑塊位置:SetPosSetTic:設(shè)置刻度線位置,一次只能設(shè)置一個(gè)刻度線,用于手動(dòng)設(shè)置刻度線SetTicFreq:設(shè)置刻度線的疏密

22、程度,配合Auto ticks屬性使用,每隔一定單位自動(dòng)顯示一條刻度線10、旋轉(zhuǎn)按鈕:CSpinButtonCtrl基本操作是一對(duì)箭頭按鈕,也稱上下控件通常與其它控件相伴,一般與Tab順序相鄰的控件相伴,最常用的是編輯框控件一般將Auto buddy和Set buddy integer屬性選中設(shè)置Alignment屬性為Right,選中的按鈕將嵌入在編輯框控件的右側(cè)旋轉(zhuǎn)按鈕:CSpinButtonCtrl基本方法設(shè)置范圍:SetRange設(shè)置當(dāng)前位置:SetPos設(shè)置基數(shù):SetBase,設(shè)置顯示的基數(shù),16進(jìn)制或十進(jìn)制11、進(jìn)度條:CProgressCtrl進(jìn)度條基本操作設(shè)置進(jìn)度條范圍:Se

23、tRange設(shè)置填充步長:SetStep設(shè)置當(dāng)前位置:SetPos前進(jìn)一個(gè)步長:StepIt選中Smooth屬性,表示平滑地填充進(jìn)度條,否則按塊進(jìn)行填充。進(jìn)度條往往與WM_TIMER消息配合使用10.2.2 示例:訪問編輯框任務(wù):在一個(gè)對(duì)話框中,設(shè)置三個(gè)編輯框和一個(gè)按鈕,前兩個(gè)用于輸入加數(shù),點(diǎn)擊“加法”按鈕后,將前兩個(gè)數(shù)的和輸出到第三個(gè)編輯框中。關(guān)聯(lián)對(duì)話框類關(guān)聯(lián)對(duì)話框類為CAddDlg。映射按鈕IDC_ADD的單擊消息void CAddDlg:OnAdd() 1、獲取控件窗口指針void CAddDlg:OnAdd() int num1,num2,result;char ch110, ch21

24、0, ch310;GetDlgItem(IDC_NUM1)-GetWindowText(ch1, 10);GetDlgItem(IDC_NUM2)-GetWindowText(ch2, 10);num1=atoi(ch1); num2=atoi(ch2);result=num1+num2;itoa(result, ch3,10);GetDlgItem(IDC_SUM)-SetWindowText(ch3);得到指定ID號(hào)控件的窗口指針。2、直接讀取編輯框void CAddDlg:OnAdd() int num1,num2,result;char ch110, ch210, ch310;GetD

25、lgItemText(IDC_NUM1,ch1,10);GetDlgItemText(IDC_NUM2,ch2,10);num1=atoi(ch1); num2=atoi(ch2);result=num1+num2;itoa(result, ch3,10);SetDlgItemText(IDC_RESULT,ch3);3、讀取為整數(shù)void CAddDlg:OnAdd() int num1,num2,result;num1 = GetDlgItemInt(IDC_NUM1);num2 = GetDlgItemInt(IDC_NUM2);result = num1+num2;SetDlgItem

26、Int(IDC_SUM,result);4、關(guān)聯(lián)值成員變量void CAddDlg:OnAdd() UpdateData(true);m_sum = m_num1+m_num2;UpdateData(false);5、關(guān)聯(lián)控件成員變量關(guān)聯(lián)控件成員變量void CAddDlg:OnAdd() int num1, num2, result;char ch110, ch210, ch310;m_Edit1.GetWindowText(ch1,10);m_Edit2.GetWindowText(ch2,10);num1=atoi(ch1); num2=atoi(ch2);result = num1+n

27、um2;itoa(result, ch3,10);m_Edit3.SetWindowText(ch3);10.2.3 示例:設(shè)置畫筆顏色1、關(guān)聯(lián)成員變量IDC_DRAW:用于繪圖的Static控件IDC_RED:int m_red,輸入紅色的編輯框IDC_GREEN:int m_greenIDC_BLUE:int m_blueIDC_SCROLLRED:滾動(dòng)條,CScrollBarm_scrollIDC_SLIDEGREEN:CSliderCtrlm_sliderIDC_SPINBLUE:CSpinButtonCtrl m_spin2、初始化控件BOOL CScrollDlg:OnInitDi

28、alog() CDialog:OnInitDialog();m_scroll.SetScrollRange(0,255);m_scroll.SetScrollPos(m_red);m_slider.SetRange(0,255);m_slider.SetPos(m_green);m_slider.SetTicFreq(10);m_spin.SetRange(0,255);UpdateData(false);first = false;return TRUE;3、編輯框更新映射編輯框更新消息EN_CHANGEvoid CScrollDlg:OnChange() UpdateData();m_sc

29、roll.SetScrollPos(m_red);m_slider.SetPos(m_green);Draw(); /類中將要定義的繪圖函數(shù)/將前兩個(gè)編輯框的EN_CHANGE均映射到同一個(gè)處理函數(shù)中。編輯框更新第三個(gè)編輯框更新消息EN_CHANGEvoid CScrollDlg:OnChange2() if(first) return;UpdateData();Draw(); /類中將要定義的繪圖函數(shù)/ first作用:對(duì)話框類的bool型成員,在構(gòu)造函數(shù)中初始化為true,首次調(diào)用時(shí)旋轉(zhuǎn)按鈕還沒有初始化好,避免出現(xiàn)問題;在InitialDialog完成初始化之后,將first置為false

30、 。4、WM_HSCROLLvoid CScrollDlg:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) / 判斷由那個(gè)控件發(fā)出int nID=pScrollBar-GetDlgCtrlID();if(nID=IDC_SLIDERGREEN) / 由滑動(dòng)條產(chǎn)生 m_green=m_slider.GetPos();獲得發(fā)送消息的控件ID號(hào), 滾動(dòng)條和滑動(dòng)條都會(huì)產(chǎn)生WM_HSCROLL消息,OnHscroll中傳遞一個(gè)指向發(fā)送消息的控件指針WM_HSCROLLvoid CScrollDlg:OnHScroll(UINT nSB

31、Code, ) / 由滾動(dòng)條產(chǎn)生if(nID=IDC_SCROLLRED)switch(nSBCode) /判斷nSBCode通知碼 case SB_LINELEFT:m_red-; break;case SB_LINERIGHT:m_red+; break;case SB_PAGELEFT:m_red-=10; break;case SB_PAGERIGHT:m_red+=10; break;case SB_THUMBTRACK:m_red=nPos; break; WM_HSCROLLvoid CScrollDlg:OnHScroll(UINT nSBCode, ) if(nID=IDC_

32、SCROLLRED)switch(nSBCode) if(m_red255) m_red=255;m_scroll.SetScrollPos(m_red); /人為控制滾動(dòng)條的位置,滑動(dòng)條無須手工設(shè)置UpdateData(false);Draw();CDialog:OnHScroll(nSBCode, nPos, ScrollBar);5、WM_PAINTvoid CScrollDlg:OnPaint() CPaintDC dc(this); CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd-UpdateWindow(); /更新窗口Draw(); / 繪制窗口區(qū)域6、

33、輔助繪圖void CScrollDlg:Draw()CWnd *pWnd=GetDlgItem(IDC_DRAW);CDC *pDC=pWnd-GetDC();CBrush brush(RGB(m_red,m_green,m_blue);CBrush *pOldBrush =pDC-SelectObject(&brush);CRect client;pWnd-GetClientRect(client);pDC-Rectangle(client);pDC-SelectObject(pOldBrush);7、主程序交互在視圖類中定義COLORREF color,用于保存設(shè)置的顏色;在視圖類構(gòu)造函數(shù)

34、中,初始化color為黑色color = RGB(0,0,0);主程序交互void CMyView:OnCalldlg() CColorDlg dlg;dlg.m_red=GetRValue(color);dlg.m_green=GetGValue(color);dlg.m_blue=GetBValue(color);if(dlg.DoModal()=IDOK) color=RGB(dlg.m_red,dlg.m_green,dlg.m_blue);Invalidate();8、視圖類的OnDrawvoid CMyView:OnDraw(CDC* pDC)CPen pen(PS_SOLID,2

35、,color);CPen *pOldPen=pDC-SelectObject(&pen);pDC-SetTextColor(color);pDC-TextOut(20,20,用指定的顏色畫線);pDC-MoveTo(30,60);pDC-LineTo(200,300);pDC-SelectObject(pOldPen);本章主要內(nèi)容10.2 常用控件的使用10.3 無模式對(duì)話框10.1 對(duì)話框基礎(chǔ)10.4 通用對(duì)話框10.5 基于對(duì)話框的應(yīng)用程序1、模式與無模式對(duì)話框模式對(duì)話框的過程創(chuàng)建對(duì)話框資源,關(guān)聯(lián)對(duì)話框類,定義對(duì)話框類對(duì)象,調(diào)用DoModal創(chuàng)建并顯示對(duì)話框;用戶結(jié)束對(duì)話框后,銷毀對(duì)話框

36、后DoModal返回?zé)o模式對(duì)話框無模式對(duì)話框顯示后,主窗口可以繼續(xù)接收用戶輸入,情況比較復(fù)雜。建立對(duì)話框資源,關(guān)聯(lián)對(duì)話框類相同;用戶調(diào)用Create創(chuàng)建對(duì)話框,用戶負(fù)責(zé)銷毀對(duì)話框(調(diào)用DestroyWindow)。模式與無模式對(duì)話框模式對(duì)話框的過程通常定義一個(gè)對(duì)話框類局部對(duì)象,DoModal返回后,對(duì)話框窗口已經(jīng)被銷毀,對(duì)話框類對(duì)象已經(jīng)沒有存在的必要。無模式對(duì)話框通常在堆中動(dòng)態(tài)構(gòu)建一個(gè)無模式對(duì)話框類對(duì)象,調(diào)用Create創(chuàng)建對(duì)話框窗口后,Create立即返回,對(duì)話框窗口依然存在,當(dāng)然對(duì)話框類對(duì)象不能被銷毀。當(dāng)用戶點(diǎn)擊“取消”按鈕后,要確保對(duì)話框窗口和對(duì)話框?qū)ο蠹皶r(shí)銷毀。2、模式對(duì)話框的創(chuàng)建vo

37、id CMyView:OnCallDlg()pDlg=new CMyDlg(this);pDlg-Create(IDD_MYDLG);pDlg-ShowWindow(SW_SHOW);相關(guān)聯(lián)的對(duì)話框資源ID傳入對(duì)話框的窗口指針3、用戶自定義消息用戶在操作無模式對(duì)話框時(shí),可隨時(shí)點(diǎn)擊“確定”、“取消”、“應(yīng)用”按鈕,必須借助某種機(jī)制通知主程序。往往通過發(fā)送用戶自定義消息通知主程序自定義消息語法#define WM_DLGNOTIFY WM_USER+5向指定的窗口發(fā)送消息 /CWnd成員BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARA

38、M lParam = 0 );SendMessage4、無模式對(duì)話框簡單示例建立對(duì)話框資源創(chuàng)建對(duì)話框資源與創(chuàng)建普通對(duì)話框一樣對(duì)話框的ID為IDD_DIALOG2IDC_RED,選中Group屬性,關(guān)聯(lián)成員變量 int m_color;IDC_GREENIDC_BLUE對(duì)話框類為CModallessDlg修改對(duì)話框構(gòu)造函數(shù)CModallessDlg:CModallessDlg(CWnd* pParent) : CDialog(CModallessDlg:IDD, pParent)ASSERT(pParent);m_pView=pParent;CWnd *m_pView,對(duì)話框類添加的成員,用于保

39、存調(diào)用者的窗口指針調(diào)用對(duì)話框void CMyView:OnCalldlg() if(dlg=NULL)dlg=new CModallessDlg(this);dlg-m_color=m_color;dlg-Create(IDD_DIALOG2);dlg-ShowWindow(SW_SHOW);else dlg-SetActiveWindow(); /dlg定義為視圖類中數(shù)據(jù)成員 CModallessDlg* dlg; 在構(gòu)造函數(shù)中初始為NULL視圖類成員,用于保存對(duì)話框中設(shè)置的顏色,構(gòu)造函數(shù)中初始0防止重復(fù)創(chuàng)建自定義消息和常量對(duì)話框類的頭文件中#define WM_DLGNOTIFY WM_U

40、SER+5#define ID_PRESS_OK 1#define ID_PRESS_CANCEL 2#define ID_PRESS_APPLY 3映射對(duì)話框應(yīng)用按鈕void CModallessDlg:OnApply() UpdateData(); m_pView-SendMessage(WM_DLGNOTIFY, ID_PRESS_APPLY ); /發(fā)送自定義消息至視圖類對(duì)象映射對(duì)話框確定按鈕void CModallessDlg:OnOK() UpdateData(); m_pView-SendMessage(WM_DLGNOTIFY, ID_PRESS_OK ); /發(fā)送自定義消息至

41、視圖類對(duì)象映射對(duì)話框取消按鈕void CModallessDlg:OnCancel() m_pView-SendMessage(WM_DLGNOTIFY, ID_PRESS_CANCEL ); /發(fā)送自定義消息至視圖類對(duì)象視圖類中手工映射消息用戶自定義消息不能用ClassWizard映射視圖類頭文件中聲明函數(shù)afx_msg void OnDlgNotify( WPARAM wParam, LPARAM lParam);添加消息映射條目,構(gòu)造函數(shù)中/AFX_MSG_MAP(CMyView)ON_MESSAGE(WM_DLGNOTIFY, OnDlgNotify)/AFX_MSG_MAP視圖類中手

42、工映射消息void CMyView:OnDlgNotify( WPARAM wParam, LPARAM lParam);switch(wParam) case ID_PRESS_APPLY:m_color=dlg-m_color;Invalidate(); break;case ID_PRESS_OK:m_color=dlg-m_color;Invalidate();case ID_PRESS_CANCEL:dlg-DestroyWindow();delete dlg; dlg=NULL; break;OnDrawvoid CMyView:OnDraw(CDC *pDC)COLORREF c

43、olor;switch(m_color) case 0: color=RGB(255,0,0);break;case 1: color=RGB(0,255,0); break;case 2: color=RGB(0,0,255);break; CPen pen(PS_SOLID,1,color);CPen *oldPen=pDC-SelectObject(&pen);pDC-Ellipse(0,0,200,200);本章主要內(nèi)容10.2 常用控件的使用10.3 無模式對(duì)話框10.1 對(duì)話框基礎(chǔ)10.4 通用對(duì)話框10.5 基于對(duì)話框的應(yīng)用程序1、6大通用對(duì)話框Window系統(tǒng)中集成了一些常用的

44、公用對(duì)話框,可以直接使用,不用創(chuàng)建對(duì)話框資源模板、關(guān)聯(lián)對(duì)話框類,方便使用。MFC封裝了6個(gè)公用對(duì)話框文件選擇對(duì)話框:CFileDialog顏色選擇對(duì)話框:CColorDialog字體選擇對(duì)話框:CFontDialog查找與替換對(duì)話框:CFindReplaceDialog打印對(duì)話框:CPrintDialog頁面設(shè)置對(duì)話框:CPageSetupDialog2、顏色通用對(duì)話框構(gòu)造函數(shù)CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd *pParentWnd=NULL)clrInit指定初始顏色,默認(rèn)黑色dwFlag為選項(xiàng),定制對(duì)話框初始外觀pParentWnd為父窗口指針DoModal返回后,可以調(diào)用顏色對(duì)話框的GetColor函數(shù),獲得用戶所選擇的顏色3、字體通用對(duì)話框構(gòu)造函數(shù)CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = , CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL ); 通常定義一個(gè)LOGFONT結(jié)構(gòu)體,作為初始

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論