• CLR自定义.NET控件制作(3)——自定义视图控件


    当我们想要制作一个自己的视图控件时,就在在原控件视图上贴上我们自己的View view可以随意开发,比如你开发一个View继承自CView,可以显示图片,影像,地图等。下面就以开发一个视图控件为例。

    首先,你先要在CLR工程中,添加一个纯C++ View类,例如我添加名字为MyView的类,头文件:

     1 #pragma once
    2 private class CMyView : public CView
    3 {
    4 public:
    5 CMyView ();
    6 virtual ~ CMyView ();
    7 DECLARE_DYNCREATE(CMyView)
    8 public:
    9 afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    10 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    11 afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    12 afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
    13 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    14 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
    15 afx_msg void OnMButtonDown(UINT nFlags,CPoint point);
    16 public:
    17 BOOL m_DesignMode;
    18 HWND m_ParentHwnd;
    19 ToolCallbackNative * m_pCallBack;
    20
    21 protected:
    22 DECLARE_MESSAGE_MAP()
    23 };

    CPP文件实现暂且不写。

    然后,在CLR工程中的MyViewControl.h文件中的类私有成员中,添加一个成员变量

    CMyView*   m_MyView;

    打开MyViewControl.h的设计器,查看属性,找到事件Load,双击,在MyViewControl.h代码文件中添加如下代码;

     1 System::Void MyViewControl:: MyViewControl _Load(System::Object^  sender, System::EventArgs^  e)
    2 {
    3 IntPtr ptr = this->Handle; //得到当前句柄
    4 Void * pWnd = ptr.ToPointer();
    5 RECT rc;
    6 ::GetWindowRect((HWND)(int)this->Handle, &rc); //得到窗体的大小
    7 rc.right -= rc.left;
    8 rc.bottom -= rc.top;
    9 rc.top = rc.left = 0;
    10
    11 if (!m_MyView->Create(0, 0, WS_VISIBLE|WS_CHILD, rc, CWnd::FromHandle((HWND)(int)this->Handle), 100))
    12 {
    13 LONG e = GetLastError();
    14 delete m_MyView;
    15 m_MyView = 0;
    16 }
    17 //得到父窗口句柄
    18 m_MyView->m_ParentHwnd = (HWND)(int)this->Handle;
    19
    20 }

    运行生成,则视图创建成功。

    再在设计器中响应sizeChanged事件,使得控件在Form窗体上,可以随意改变大小和拖动。

     1 System::Void MyViewControl:: MyViewControl _SizeChanged(System::Object^  sender, System::EventArgs^  e) 
    2 {
    3 RECT rc;
    4 ::GetWindowRect((HWND)(int)this->Handle, &rc);
    5 rc.right -= rc.left;
    6 rc.bottom -= rc.top;
    7 rc.top = rc.left = 0;
    8 if(m_MyView)
    9 {
    10 int cx, cy;
    11 cx = rc.right - rc.left;
    12 cy = rc.bottom - rc.top;
    13 ::SetWindowPos(m_MyView ->m_hWnd, NULL, 0,
    14 0, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE);
    15 }
    16 }

    运行生成,则简单的视图控件创建成功。

  • 相关阅读:
    jwplayer播放器停止 单页内多个jwplayer对象停止问题
    jquery.smint.js 页面菜单浮动之谷歌浏览器异常
    jquery获取不到append出来的新元素的解决办法
    Received an invalid response. Origin 'null' is therefore not allowed access
    Java中转UTC时间字符串(含有T Z)为local时间
    OSS 图片处理流程
    java8中的map 和reduce
    MySQL的语句执行顺序
    数据库死锁解决办法
    mysql查询用if控制显示列
  • 原文地址:https://www.cnblogs.com/cjingzm/p/2117658.html
Copyright © 2020-2023  润新知