您的位置:首页 > 其它

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

2017-04-18 14:07 387 查看
当我们想要制作一个自己的视图控件时,就在在原控件视图上贴上我们自己的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 }


运行生成,则简单的视图控件创建成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: