CDockablePane是vs2008后提供的一个很好的父类,在使用的过程中一般有两种方法:
(1)新建一个对话框,然后新建一个类,基类为CDialog或者CDialogEx,为了使用CDockPane将对话框基类改为CDockPane,不能使用多继承,因为MFC不支持多继承!然后将构造函数中CDialogEx和DoDataExchange中涉及到的改为CDockabelPane即可;
(2)新建一个MFC类,基类直接指定为CDockabelPane即可,如果想插入其他的资源显示在该Pane上,将对话框作为其成员变量,在Oncreate函数中create该对话框然后在Onsize中将对话框移动覆盖整个Pane区域即可;
问题来了,虽然你建立好了你自己的Pane并且任意放置你想放置的东西,但是但你放大或缩小MainFram时或者你拖动Pane边框时会留下残影,这个一个很悲剧的事情,最后我试了试,在Onsize中用Invalidate和InvalidateRect都不好使,甚至用最直接的UpdateWindow都无法解决该残影问题,没办法,只好覆盖OnPain进行定制重绘,用其北京色重新绘制!!方法终于解决了!!
但是问题又来了,如果你重写OnPaint方法,不应该在你绘制之前再次调用CDockablePane::OnPaint方法,也就是不能调用父类的OnPaint方法,去掉父类的OnPaint方法或者你在绘制完了你自己的之后在调用父类的OnPaint方法如:
A.
//CDockablePane::OnPaint();
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDockablePane::OnPaint()
CRect rc;
GetClientRect(rc);
CBrush brush;
brush.CreateSolidBrush(COLORREF(RGB(255, 255, 255)));
dc.FillRect(&rc,&brush);
brush.DeleteObject();
或者:
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDockablePane::OnPaint()
CRect rc;
GetClientRect(rc);
CBrush brush;
brush.CreateSolidBrush(COLORREF(RGB(255, 255, 255)));
dc.FillRect(&rc,&brush);
brush.DeleteObject();
CDockablePane::OnPaint();