科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件MFC程序员的WTL指南之对话框与控件

MFC程序员的WTL指南之对话框与控件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

MFC 的对话框和控件的封装真得可以节省你很多时间和功夫

作者:lithe 来源:BLOG 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
使用DDX

  在CMainDlg中添加几个变量,演示DDX的使用方法。

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;
};

  在OK按钮的处理函数中,我们首先调用DoDataExchange()将将edit控件的数据传送给我们刚刚添加的两个变量,然后将结果显示在列表控件中。

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

 // Transfer data from the controls to member variables.
 if ( !DoDataExchange(true) )
  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 );
}


  如果编辑控件输入的不是数字,DDX_INT将会失败并触发OnDataExchangeError()的调用,CMainDlg重载了OnDataExchangeError()函数显示一个消息框:

void CMainDlg::OnDataExchangeError ( UINT nCtrlID, BOOL bSave )
{
 CString str;

 str.Format ( _T("DDX error during exchange with control: %u"), nCtrlID );
 MessageBox ( str, _T("ControlMania1"), MB_ICONWARNING );

 ::SetFocus ( GetDlgItem(nCtrlID) );
}


  作为最后一个使用DDX的例子,我们添加一个check box演示DDX_CHECK的使用:


  DDX_CHECK使用的变量类型是int型,它的可能值是0,1,2,分别对应check box的未选择状态,选择状态和不确定状态。你也可以使用常量BST_UNCHECKED,BST_CHECKED,和 BST_INDETERMINATE代替,对于check box来说只有选择和未选择两种状态,你可以将其视为布尔型变量。

  以下是为使用check box的DDX而做的改动:

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)
  DDX_CHECK(IDC_SHOW_MSG, m_nShowMsg)
 END_DDX_MAP()

 protected:
  // DDX variables
  CString m_sEditContents;
  int m_nEditNumber;
  int m_nShowMsg;
};

  在OnOK()的最后,检查m_nShowMsg的值看看check box是否被选中。

void CMainDlg::OnOK ( UINT uCode, int nID, HWND hWndCtl )
{
 // Transfer data from the controls to member variables.
 if ( !DoDataExchange(true) )
  return;
  //...
 if ( m_nShowMsg )
  MessageBox ( _T("DDX complete!"), _T("ControlMania1"), MB_ICONINFORMATION );
}

  使用其它DDX_*宏的例子代码包含在例子工程中。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章