对话框响应鼠标事件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

pMsg是PreTranslateMessage传进来的参数,你在类向导里添加虚函数时vc自动生成;m_Btn是定义在CMyDlg类里的成员变量,可以是public的

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class if (WM_RBUTTONDOWN == pMsg->message)

{

RECT rect;

m_btn.GetWindowRect(&rect);

POINT point;

GetCursorPos(&point);

if (PtInRect(&rect, point))

{

AfxMessageBox("OnRButton1");

}

}

return CDialog::PreTranslateMessage(pMsg);

}

在WM_CONTEXTMENU中处理

//自定义右键菜单

void CMyEdit::OnContextMenu(CWnd* pWnd, CPoint point)

{

if (point.x == -1 && point.y == -1)

{

//keystroke invocation

CRect rect;

GetClientRect(rect);

ClientToScreen(rect);

point = rect.TopLeft();

point.Offset(5, 5);

}

CMenu menu;

VERIFY(menu.LoadMenu(IDR_VOL_V ALUE));

CMenu* pPopup = menu.GetSubMenu(0);

ASSERT(pPopup != NULL);

CTestView *pView = (CTestView*)(GetParent());

pView->m_pCurEdit = this;

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pView);

}

在它的父窗口(CTestView)中定义了一个CMyEdit的指针

CEditBox *m_pCurEdit;用来保存当然右键点击的是哪个控件,在控件的OnContextMenu()函数中把this指针付给其父控件的m_pCurEdit变量,这样其父窗口就得到了点击的控件。右键响应函数放在它的父窗口中,响应函数类似如下:

//电压等幅值

void CTestView::OnV olEqual()

{

// TODO: Add your command handler code here

if(m_pCurEdit == &m_valueUa)

{

AfxMessageBox("Ua");

}

m_pCurEdit = NULL;

}

如何让编辑框响应鼠标单击

分类:VC相关2007-03-08 20:54 824人阅读评论(2) 收藏举报

鼠标单击会产生WM_LBUTTONDOWN消息,此消息属于标准窗口消息。标准窗口消息的路由是从子类向父类传递,因此我们可以利用标准消息的路由来实现。

默认情况下编辑框是不响应鼠标单击的,因为当你单击编辑框时产生的

WM_LBUTTONDOWN消息都流向了编辑框的基类CEdit。

所以我们要想编辑框响应鼠标单击,就得为编辑框派生一个新类。这样当我们单击编辑框时,WM_LBUTTONDOWN消息就会流向我们派生的新类,在这个新类中我们就有机会处理该消息。

比如:

首先建一个基于对话框的应用程序,工程名为Test,建成以后通过类向导给当前工程添加一个新类取名为NewEdit,这样在我们的工程Test中就有了一个新类CNewEdit

然后通过类向导,为编辑框关联一个CNewEdit类型的控件变量

CNewEdit m_newEdit;

再给我们的新类CNewEdit添加一个WM_LBUTTONDOWN消息处理函数,在这个消息处理函数中我们就可以处理编辑框的鼠标单击消息了!!

其实上面的方法是通用的,我们要让编辑框响应鼠标双击,右击,让按钮

响应鼠标移动等等,我们都可以利用上面的方法来实现,实现的关键在于你

能否理解标准消息的传递路由。

让编辑框响应鼠标单击新方法:

假设有一个EditBox关联的CEdti变量为m_test

建一个基于对话框的程序,然后重载PreTranslateMessage函数

添加如下代码:

BOOL CTestDialogDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class if( pMsg->message == WM_LBUTTONDOWN && //鼠标单击消息pMsg->hwnd == m_test.m_hWnd ) //产生单击消息的窗口为编辑框{

TRACE( "Clicked/r/n" );

}

return CDialog::PreTranslateMessage(pMsg);

}

相关文档
最新文档