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


    当做到第三步的自定义视图时,采用的是将自己的视图直接覆盖原来的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 }

    这样,一个粗略的自定义视图就完成了,后面还会接着进行完善和优化。

  • 相关阅读:
    BAPI / RFC with Delphi(系列之一)--安装部件
    如何动态改变Table Control的列抬头
    如何实现标准TCODE的屏幕增强(HOWTO:Implement a screen exit to a standard SAP transaction)
    JNDI 连接Windows Active Directory 教程
    BAPI / RFC with Delphi(系列之三)--TSAPLogonControl使用(无对话框的登录sap的delphi源代码)
    BAPI / RFC with Delphi(系列之二)--TSAPLogonControl使用(有对话框的登录sap的delphi源代码)
    asp.net
    关于ETL的经验总结[经典](转)
    保持Oracle的优良性能
    保持Oracle的优良性能
  • 原文地址:https://www.cnblogs.com/cjingzm/p/2117662.html
Copyright © 2020-2023  润新知