DoDataExchange_总结

记两种方便的:

1. ATL_Subclassing

类对象 绑定 到 ALL CONTROL 时, 可以捕获消息。

#1 写类, 开启

class CButtonImpl : public CWindowImpl<CButtonImpl, CButton>
{
BEGIN_MSG_MAP_EX(CButtonImpl)
MSG_WM_SETCURSOR(OnSetCursor)
END_MSG_MAP()

LRESULT OnSetCursor(HWND hwndCtrl, UINT uHitTest, UINT uMouseMsg)
{
static HCURSOR hcur = LoadCursor ( NULL, IDC_SIZEALL );

if ( NULL != hcur )
{
SetCursor ( hcur );
return TRUE;
}
else
{
SetMsgHandled(
false);
return FALSE;
}
}
};

#2 声明对象

class CMainDlg : public CDialogImpl<CMainDlg>
{

protected:
CButtonImpl m_wndAboutBtn;
};

#3 链接 类和控件

LRESULT CMainDlg::OnInitDialog(...)
{
// CButtonImpl: subclass the About button
m_wndAboutBtn.SubclassWindow ( GetDlgItem(ID_APP_ABOUT) );
return TRUE;
}

2. WTL_DoDataExchange 

绑定ALL  CONTROL 到 类时, 可以捕获消息。 

绑定Edit, Radio 到 变量 时, 可以直接更新数据.

o1 捕获消息的

#1 开启

class CMainDlg : public CDialogImpl<CMainDlg>,
public CWinDataExchange<CMainDlg>
{

};

#2 写类

class CEditImpl : public CWindowImpl<CEditImpl, CEdit>
{
BEGIN_MSG_MAP_EX(CEditImpl)
MSG_WM_CONTEXTMENU(OnContextMenu)
END_MSG_MAP()

void OnContextMenu ( HWND hwndCtrl, CPoint ptClick )
{
MessageBox(
"Edit control handled WM_CONTEXTMENU");
}
};

#3 链接 对象和控件

class CMainDlg : public CDialogImpl<CMainDlg>,
public CWinDataExchange<CMainDlg>
{

BEGIN_DDX_MAP(CMainDlg)
DDX_CONTROL(IDC_EDIT, m_wndEdit)
END_DDX_MAP()
protected:
CEditImpl m_wndEdit;
};

#4 触发

LRESULT CMainDlg::OnInitDialog(...)
{

m_wndAboutBtn.SubclassWindow ( GetDlgItem(ID_APP_ABOUT) );

// First DDX call, hooks up variables to controls.
DoDataExchange(
false);
return TRUE;
}

o2 直接更新数据的

#1 绑定 变量 到 Control

class CMainDlg : public ...
{
//...

BEGIN_DDX_MAP(CMainDlg)
DDX_CONTROL(IDC_EDIT, m_wndEdit)
DDX_TEXT(IDC_EDIT, m_sEditContents)
DDX_INT(IDC_EDIT, m_nEditNumber)
END_DDX_MAP()

protected:
// DDX variables

CString m_sEditContents;
int m_nEditNumber;
};

#2 触发

LRESULT CMainDlg::OnOK ( UINT uCode, int nID, HWND hWndCtl )
{
CString str;

// Transfer data from the controls to member variables.

if ( !DoDataExchange(DDX_SAVE) )
return;

m_wndList.DeleteAllItems();

m_wndList.InsertItem (
0, _T("DDX_TEXT") );
m_wndList.SetItemText (
0, 1, m_sEditContents );

str.Format ( _T(
"%d"), m_nEditNumber );
m_wndList.InsertItem (
1, _T("DDX_INT") );
m_wndList.SetItemText (
1, 1, str );
}

posted on 2011-03-07 09:28  oleeceo  阅读(3217)  评论(0)    收藏  举报

导航