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 }

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

原文地址:https://www.cnblogs.com/cjingzm/p/2117658.html