View视图类与Dialog对话框通信实例
生活随笔
收集整理的這篇文章主要介紹了
View视图类与Dialog对话框通信实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.實例任務
探究視圖與對話框的數(shù)據(jù)交流關系。具體功能如下圖所示:具體研究的問題包括: 1.如何建立菜單菜單欄子項與子對話框的關聯(lián) 2.如何建立視圖類中數(shù)據(jù)(計算、繪圖等)與子對話框數(shù)據(jù)的交流
2.逐步實現(xiàn)
建立MFC應用項目(單文檔結構非文檔視圖):單獨建立視圖類(ChildView)中的數(shù)據(jù)應用: CChilView.h文件中定義數(shù)據(jù)變量:
class CChildView : public CWnd { public:// 構造CChildView(); // 操作 public:// 重寫 protected:virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // 實現(xiàn) public:virtual ~CChildView();// 生成的消息映射函數(shù) protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()int m_nWidth;int m_nHeight;int m_nUnits; };CChildView.cpp文件中進行數(shù)據(jù)初始化以及功能實現(xiàn):
CChildView::CChildView() {//構造函數(shù)進行數(shù)據(jù)初始化m_nWidth = 4;m_nHeight = 2;m_nUnits = 0; }void CChildView::OnPaint() {//數(shù)據(jù)用途CPaintDC dc(this); // 用于繪制的設備上下文CBrush brush(RGB(255, 0, 255));CBrush* pOldBrush = dc.SelectObject(&brush);switch (m_nUnits){case 0://Inchesdc.SetMapMode(MM_LOENGLISH);dc.Rectangle(0, 0, m_nWidth * 100, -m_nHeight * 100);break;case 1:dc.SetMapMode(MM_LOMETRIC);dc.Rectangle(0, 0, m_nWidth * 100, -m_nHeight * 100);break;case 2:dc.SetMapMode(MM_TEXT);dc.Rectangle(0, 0, m_nWidth * 100, -m_nHeight * 100);}dc.SelectObject(pOldBrush); } 單獨建立子對話框的功能關系: 構建/設計對話框面板:
更改名稱以及ID號。此處只需注意一點,對于單選按鈕組合情況,應該每一組的第一個設為Group=True;Tabstop=True。 為對話框構建新類,命名定義為“COptionsDlg”. 在OptionsDlg.h文件中添加數(shù)據(jù)成員:
OptionsDlg.h
class OptionsDlg : public CDialogEx {DECLARE_DYNAMIC(OptionsDlg)public:OptionsDlg(CWnd* pParent = NULL); // 標準構造函數(shù)virtual ~OptionsDlg();// 對話框數(shù)據(jù) #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG1 }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP() public:afx_msg void OnBnClickedButtonReset();int m_nHeight;int m_nWidth;int m_nUnits; }; OptionsDlg.cpp void OptionsDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT_HEIGHT, m_nHeight);DDV_MinMaxInt(pDX, m_nHeight, 1, 128);DDX_Text(pDX, IDC_EDIT_WIDTH, m_nWidth);DDV_MinMaxInt(pDX, m_nWidth, 1, 128);DDX_Radio(pDX, IDC_RADIO_INCHES, m_nUnits); }在進行Reset按鈕功能設置: void OptionsDlg::OnBnClickedButtonReset() {m_nWidth = 4;m_nHeight = 2;m_nUnits = 0;UpdateData(FALSE);//內存向空間傳遞數(shù)據(jù) } 建立視圖框與子對話框的聯(lián)系(彈出機制): 構建面板:
構建視圖與對話框的命令消息COMMAND
建立視圖與Options子對話框的數(shù)據(jù)交流關系: 在ChildView.cpp文件中: void CChildView::OnOnFileOptions() {OptionsDlg dlg;//向子對話框傳遞初始化參數(shù)dlg.m_nWidth = m_nWidth;dlg.m_nHeight = m_nHeight;dlg.m_nUnits = m_nUnits;if ( dlg.DoModal() == IDOK) //打開模態(tài)對話框{//將子對話框的數(shù)據(jù)傳遞到主視圖 并進行圖像繪制m_nWidth = dlg.m_nWidth;m_nHeight = dlg.m_nHeight;m_nUnits = dlg.m_nUnits;Invalidate(); //強行刷新 觸發(fā)WM_OPAIN消息} } 這里我要十分強調一點,就是子對話框的調用機理: 首先看一下子對話框的構造函數(shù)(OptionsDlg.cpp): OptionsDlg::OptionsDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_OPTIONS, pParent), m_nHeight(0), m_nWidth(0), m_nUnits(0) {}機理:(主視圖文件 ChildView.cpp)->點擊Options菜單->執(zhí)行OptionsDlg dlg,構造子對話框對象,實例化->調用子對話框構造函數(shù)OptionsDlg::OptionsDlg(){}->初始化CDialogEx(IDD_OPTIONS,pParent) ? IDD_OPTIONS就是子對話框ID號!
3.心得感受
獨立構建兩個視圖板塊 關鍵在如何進行是關聯(lián),核心思想在于主視圖中進行對象實例化,子文件中構造函數(shù)構造子對話框,關鍵是子對話框ID號要正確 所謂的數(shù)據(jù)交流,就是進行兩套數(shù)據(jù)進行互相傳遞總結
以上是生活随笔為你收集整理的View视图类与Dialog对话框通信实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: D8016“/ZI”和“/Gy-”命令行
- 下一篇: 我们究竟该看待百度更新?