您的位置:首页 > 其它

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

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

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

#pragma once
private class CMyView : public CView
{
public:
CMyView ();
virtual ~ CMyView ();
DECLARE_DYNCREATE(CMyView)
public:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnMButtonDown(UINT nFlags,CPoint point);
public:
BOOL m_DesignMode;
HWND m_ParentHwnd;
ToolCallbackNative * m_pCallBack;

protected:
DECLARE_MESSAGE_MAP()
};


CPP文件实现暂且不写。

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

CMyView* m_MyView;

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



System::Void MyViewControl:: MyViewControl _Load(System::Object^  sender, System::EventArgs^  e)
{
IntPtr ptr = this->Handle;                            //得到当前句柄
Void * pWnd = ptr.ToPointer();
RECT  rc;
::GetWindowRect((HWND)(int)this->Handle, &rc);        //得到窗体的大小
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.top = rc.left = 0;

if (!m_MyView->Create(0, 0, WS_VISIBLE|WS_CHILD, rc, CWnd::FromHandle((HWND)(int)this->Handle), 100))
{
LONG  e = GetLastError();
delete m_MyView;
m_MyView = 0;
}
//得到父窗口句柄
m_MyView->m_ParentHwnd = (HWND)(int)this->Handle;

}


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

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

System::Void MyViewControl:: MyViewControl _SizeChanged(System::Object^  sender, System::EventArgs^  e)
{
RECT rc;
::GetWindowRect((HWND)(int)this->Handle, &rc);
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.top = rc.left = 0;
if(m_MyView)
{
int cx, cy;
cx = rc.right - rc.left;
cy = rc.bottom - rc.top;
::SetWindowPos(m_MyView ->m_hWnd, NULL, 0,
0, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE);
}
}


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