WEB开发网
开发学院软件开发VC MFC程序员WTL指南(5)对话框与控件 阅读

MFC程序员WTL指南(5)对话框与控件

 2008-01-18 20:24:13 来源:WEB开发网   
核心提示:钩住一个CContainedWindow对象需要做四件事: 在对话框中创建一个CContainedWindowT 成员变量, 将消息处理添加到对话框消息映射的ALT_MSG_MAP小节,MFC程序员WTL指南(5)对话框与控件(3), 在对话框的构造函数中调用CContainedWindowT 构

钩住一个CContainedWindow对象需要做四件事:

  1. 在对话框中创建一个CContainedWindowT 成员变量。
  2. 将消息处理添加到对话框消息映射的ALT_MSG_MAP小节。
  3. 在对话框的构造函数中调用CContainedWindowT 构造函数并告诉它哪个ALT_MSG_MAP小节的消息需要处理。
  4. 在OnInitDialog()中调用CContainedWindowT::SubclassWindow() 方法与控件建立关联。

在ControlMania1中,我对三个按钮分别使用了一个CContainedWindow,对话框处理发送到每一个按钮的WM_SETCURSOR消息,并改变鼠标指针形状。

现在仔细看看这一步,首先,我们在CMainDlg中添加了CContainedWindow成员。

class CMainDlg : public CDialogImpl<CMainDlg>
{
// ...
protected:
   CContainedWindow m_wndOKBtn, m_wndExitBtn;
};

其次,我们添加了ALT_MSG_MAP小节,OK按钮使用1小节,Exit按钮使用2小节。这意味着所有发送给OK按钮的消息将由ALT_MSG_MAP(1)小节处理,所有发给Exit按钮的消息将由ALT_MSG_MAP(2)小节处理。

class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
   BEGIN_MSG_MAP_EX(CMainDlg)
     MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
     COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
     COMMAND_ID_HANDLER(IDOK, OnOK)
     COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
   ALT_MSG_MAP(1)
     MSG_WM_SETCURSOR(OnSetCursor_OK)
   ALT_MSG_MAP(2)
     MSG_WM_SETCURSOR(OnSetCursor_Exit)
   END_MSG_MAP()
   LRESULT OnSetCursor_OK(HWND hwndCtrl, UINT uHitTest, UINT uMouseMsg);
   LRESULT OnSetCursor_Exit(HWND hwndCtrl, UINT uHitTest, UINT uMouseMsg);
};

接着,我们调用每个CContainedWindow的构造函数,告诉它使用ALT_MSG_MAP的哪个小节。

CMainDlg::CMainDlg() : m_wndOKBtn(this, 1),
            m_wndExitBtn(this, 2)
{
}

构造函数的参数是消息映射链的地址和ALT_MSG_MAP的小节号码,第一个参数通常使用this,就是使用对话框自己的消息映射链,第二个参数告诉对象将消息发给ALT_MSG_MAP的哪个小节。

最后,我们将每个CContainedWindow对象与控件关联起来。

LRESULT CMainDlg::OnInitDialog(...)
{
// ...
   // Attach CContainedWindows to OK and Exit buttons
   m_wndOKBtn.SubclassWindow ( GetDlgItem(IDOK) );
   m_wndExitBtn.SubclassWindow ( GetDlgItem(IDCANCEL) );
   return TRUE;
}

下面是新的WM_SETCURSOR消息处理函数:

LRESULT CMainDlg::OnSetCursor_OK (HWND hwndCtrl, UINT uHitTest, UINT uMouseMsg )
{
static HCURSOR hcur = LoadCursor ( NULL, IDC_HAND );
   if ( NULL != hcur )
     {
     SetCursor ( hcur );
     return TRUE;
     }
   else
     {
     SetMsgHandled(false);
     return FALSE;
     }
}
LRESULT CMainDlg::OnSetCursor_Exit ( HWND hwndCtrl, UINT uHitTest, UINT uMouseMsg )
{
static HCURSOR hcur = LoadCursor ( NULL, IDC_NO );
   if ( NULL != hcur )
     {
     SetCursor ( hcur );
     return TRUE;
     }
   else
     {
     SetMsgHandled(false);
     return FALSE;
     }
}

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接