当做到第三步的自定义视图时,采用的是将自己的视图直接覆盖原来的Control视图,由此引发了原有的Control捕获不到鼠标消息,因此我们需要增加一些方法来实现的消息响应。
采用发送消息的方式,实现鼠标消息的响应,
MyView.cpp文件的实现如下:
1 #include "stdafx.h"
2 #ifdef _DEBUG
3 #define new DEBUG_NEW
4 #endif
5 #include "myview.h"
6
7 IMPLEMENT_DYNCREATE(CMyView, CView)
8
9 BEGIN_MESSAGE_MAP(CMyView, CView)
10 ON_WM_LBUTTONDOWN()
11 ON_WM_LBUTTONUP()
12 ON_WM_RBUTTONDOWN()
13 ON_WM_RBUTTONUP()
14 ON_WM_MOUSEMOVE()
15 ON_WM_CONTEXTMENU()
16 ON_WM_MBUTTONDOWN()
17
18 END_MESSAGE_MAP()
19
20 CMyView:: CMyView ()
21 {
22 // TODO: 在此处添加构造代码
23 m_ParentHwnd = NULL;
24 m_pCallBack = NULL;
25 }
26
27 CMyView::~CMyView()
28 {
29 }
30
31 void CMyView::OnLButtonUp(UINT nFlags, CPoint point)
32 {
33 CMyView::OnLButtonUp(nFlags, point);
34 // TODO: 在此添加消息处理程序代码和/或调用默认值
35 LONG x = point.x;
36 LONG y = point.y;
37 LPARAM lparam = MAKELPARAM(x,y);
38 ::SendMessage(m_ParentHwnd, WM_LBUTTONUP, 0, lparam);
39 }
40 //其他的鼠标响应函数省略
41 //……
在MyViewControl.h设计器中响应MouseDown事件,在System::Void MyViweControl:: MyViweControl _MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)中添加相应的代码,就会响应了,由于这里只有MouseDown,所以要判断鼠标左键或者是右键,则通过参数e来判断。
对于我制作的视图,鼠标滚轮和键盘的消息无法直接发送给Control,则我重写消息处理函数DefWndProc来截获滚轮消息。MyViewControl.h中代码如下:
1 void MyViweControl::DefWndProc(System::Windows::Forms::Message% m)
2 {
3 switch (m.Msg)
4 {
5 //触发键盘落下消息
6 case WM_KEYDOWN:
7 {
8 this->Focus();
9 switch (m.WParam.ToInt32())
10 {
11 case VK_F5:
12 MessageBox::Show("F5");
13 break;
14
15 default:
16 break;
17 }
18 }
19 case WM_KEYUP:
20 {
21 }
22 break;
23 //触发鼠标滚轮消息
24 case WM_MOUSEWHEEL:
25 {
26 short zDelta = GET_WHEEL_DELTA_WPARAM(m.WParam.ToInt32()); //判断滚轮滚动方向
27 long xPos = GET_X_LPARAM(m.LParam.ToInt32()); //得到当前坐标X值
28 long yPos = GET_Y_LPARAM(m.LParam.ToInt32()); //得到当前坐标X值
29
30 }
31 break;
32
33 default:
34 break;
35 }
36 UserControl::DefWndProc(m);
37 }
这样,一个粗略的自定义视图就完成了,后面还会接着进行完善和优化。