您的位置:首页 > 其它

CLR自定义.NET控件制作(4)——鼠标消息的响应

2011-07-26 21:26 218 查看
当做到第三步的自定义视图时,采用的是将自己的视图直接覆盖原来的Control视图,由此引发了原有的Control捕获不到鼠标消息,因此我们需要增加一些方法来实现的消息响应。

采用发送消息的方式,实现鼠标消息的响应,

MyView.cpp文件的实现如下:

#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "myview.h"

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_CONTEXTMENU()
ON_WM_MBUTTONDOWN()

END_MESSAGE_MAP()

CMyView:: CMyView ()
{
// TODO: 在此处添加构造代码
m_ParentHwnd = NULL;
m_pCallBack = NULL;
}

CMyView::~CMyView()
{
}

void CMyView::OnLButtonUp(UINT nFlags, CPoint point)
{
CMyView::OnLButtonUp(nFlags, point);
// TODO: 在此添加消息处理程序代码和/或调用默认值
LONG x = point.x;
LONG y = point.y;
LPARAM  lparam = MAKELPARAM(x,y);
::SendMessage(m_ParentHwnd, WM_LBUTTONUP, 0, lparam);
}
//其他的鼠标响应函数省略
//……


在MyViewControl.h设计器中响应MouseDown事件,在System::Void MyViweControl:: MyViweControl _MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)中添加相应的代码,就会响应了,由于这里只有MouseDown,所以要判断鼠标左键或者是右键,则通过参数e来判断。

对于我制作的视图,鼠标滚轮和键盘的消息无法直接发送给Control,则我重写消息处理函数DefWndProc来截获滚轮消息。MyViewControl.h中代码如下:

void MyViweControl::DefWndProc(System::Windows::Forms::Message% m)
{
switch (m.Msg)
{
//触发键盘落下消息
case WM_KEYDOWN:
{
this->Focus();
switch (m.WParam.ToInt32())
{
case VK_F5:
MessageBox::Show("F5");
break;

default:
break;
}
}
case WM_KEYUP:
{
}
break;
//触发鼠标滚轮消息
case WM_MOUSEWHEEL:
{
short zDelta = GET_WHEEL_DELTA_WPARAM(m.WParam.ToInt32());    //判断滚轮滚动方向
long xPos = GET_X_LPARAM(m.LParam.ToInt32());                //得到当前坐标X值
long yPos = GET_Y_LPARAM(m.LParam.ToInt32());                //得到当前坐标X值

}
break;

default:
break;
}
UserControl::DefWndProc(m);
}


这样,一个粗略的自定义视图就完成了,后面还会接着进行完善和优化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: