C++控件關聯對象
阿新 • • 發佈:2017-12-28
its chang 空間 處理 ext dial 在屏幕上 pan map
1.C++控件關聯對象
方法1:用向導關聯變量
void DrawPoint::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_edit); }
方法2:GetDlgItem(IDC_EDIT1)獲取句柄賦值
CEdit× m_edit;
m_edit = (CEdit*)GetDlgItem(IDC_EDIT1);// GetDlgItem只能獲取子控件,可以在AboutDialog創建時,把句柄或窗口類的指針保存起來 // GetDlgItem返回CWIN*,這種方法關聯的控件必須是CWIN類的派生類
方法3: 在用Tab控件添加關聯變量時發現控件變量那裏是灰的, 為了關聯控件變量,有一種方法:
1.首先為控件添加變量,如CTabCtrl m_TabCtrl.
2.在OnInitDialog函數中,添加 m_TabCtrl.SubclassDlgItem(IDC_TAB1,this); //IDC_TAB1是控件ID
3.這樣m_TabCtrl就是控件IDC_TAB1的關聯變量。
關於窗口子類化:SubclassDlgItem
子類化概念: 用一個窗口過程替換另一個過程的行為叫SUBCLASSING,這是WINDOWS意義上的派生子類,與面向對象語言的派生子類是完全不同的概念。 (向導添加關聯變量)在VC 中,DoDataExchange函數中的DDX_Control之類的函數會調用SubClassDlgItem完成窗口子類化,這樣控件自己就能處理消息了。 子類化步驟: (1)窗體上放一個基類控件,如:CEdit—拖放 (2)有基類派生一個派生類,並生成該對象---如果這裏用的是基類控件對象而不派生==就相當於變量關聯 CEdit->(繼承)CMyEdit; // 派生類的定義 CMyEdit m_myEdit; // 創建派生類對象 (3)將窗體上控件子類化(subclass)為派生類的對象CMyEdit, 等價於將窗體上拖放的控件改變為派生類的對象—類型變了 BOOL CMyDialog::OnInitDialog() //在窗體初始化函數OnInitDialog中進行子類化 { CDialog::OnInitDialog(); m_MyEdit.SubclassDlgItem(ID,CWnd* pParent,this); return TRUE; } 子類化後的效果以及相關函數: 簡單來就是 對象轉化和過程替換,拖放對象轉化為派生對象,拖放對象的事件過程都有派生對象同名過程替換即由派生對象處理。 1.基類控件對象(拖放控件)變成了(自己派生的對象)派生控件對象 ; 2.該派生對象將接管控件對象的消息處理; 3.過程替換-對Dialog 上面的某個控件SubClass(子類化)後,其原控件對象的WindowProc(事件過程等)替換成你自己寫的新派生控件CYourCWndClass 的 WindowProc(同名過程),這樣你就可以處理這個控件的所有消息了;用 ClassWizard 維護自己的 CYourCWndClass 就可以了 SubclassDlgItem把某個空間類派生對象與對窗體中已有的控件動態連接起來,該派生對象將接管控件對象的消息處理,從而使控件變為派生對象的類型,具有新的特性. 實際應用—設計新的控件: 要在程序中創建新設計的控件,顯然不能用自動創建的辦法,因為對話框模板對新控件的特性一無所知. 原始方法:程序可以用手工方法創建控件,在調用派生類的Create函數時,派生類會調用基類的Create函數創建控件.用Create函數創建控件是一件比較麻煩的工作, 程序需要為函數指定一大堆的控件風格以及控件的坐標和ID.特別是控件的坐標,沒有經驗的程序員很難確切地安排控件的位置和大小,往往需要反復調整. 利用子類化方法:利用MFC的CWnd::SubclassDlgItem提供的動態連接功能,可以避免Create函數的許多麻煩,該函數大大簡化了在對話框中創建派生控件的過程. 區別: 1.原始方法的過程:在用手工方法創建控件時,先要構建一個控件對象,然後再用Create函數在屏幕上創建控件窗口,也就是說,控件的創建工作是由控件對象完成的. 2.子類化方法的過程:動態連接的思路則不同,SubclassDlgItem可以把對話框中已有的控件與某個窗口對象動態連接起來,該窗口對象將接管控件的消息處理,從而使控件具有新的特性.
2.子窗口Create
m_drawPointDlg為子對話框(style) m_drawPointDlg.Create(ID, ParentHandle);
3.ATL SubclassWindow
std::map<DWORD, boost::shared_ptr<CEdit2>> m_mapEdits; m_mapEdits[textBox_IPUseID].reset( new CEdit2() ); m_mapEdits[textBox_IPUseID]->SubclassWindow( GetDlgItem(textBox_IPUseID) );
4.ATL控件IVSFlexGridPtr
IVSFlexGridPtr m_spGrid; CAxWindow wndGrid = GetDlgItem(Grid_EigyoJikan); wndGrid.QueryControl(&m_spGrid);// http://helpcentral.componentone.com/docs/vsflexgrid8/vsflexgridpropertieseventsandmethods.htm
C++控件關聯對象