1. 程式人生 > >C++控件關聯對象

C++控件關聯對象

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++控件關聯對象