工作中编写MFC界面程序时用到了停靠窗口,为了避免之后用到时再去查询,这里记录下。
步骤
1.定义一个继承自CDockablePane的类
Class CDockableTest : public CDockablePane{}
2.MainFrm.h中声明
CDockableTest m_dockableTest;
3.CMainFrame::OnCreate中创建
1 EnableAutoHidePanes(CBRS_ALIGN_ANY);//窗口自动停靠 2 m_dockableTest.Create("Test",this,CRect(0,0,100,100),TRUE,ID_DOCKTEST/*自己定义*/,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI)); 3 m_dockableTest.EnableDocking(CBRS_ALIGN_ANY);//使可停靠和浮动 4 DockPane(&m_dockableTest);
问题&解答
Q:停靠窗口隐藏后,鼠标移动到停靠窗口标签上显示停靠窗口,会有残影。
A: ①在CDockableTest类中添加OnCreate和OnSize函数
②CDockableTest::OnCreate中创建控件
1 CRect rectDummy; 2 rectDummy.SetRectEmpty(); 3 const DWORD dwViewStyle = WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS|WS_CLIPSIBLINGS|WS_CLIPCHILDREN; 4 if(!m_pointsInfo.Create(dwViewStyle,rectDummy,this,4/*ID*/)) 5 { 6 TRACE0(MyLoadString(IDS_CREATEPOINTINFOVIEW_ERROR)); 7 return -1; 8 }
③CDockable::OnSize中根据停靠窗口位置调整控件大小
1 if(GetSafeHwnd() == NULL) 2 { 3 return; 4 } 5 CRect rectClient; 6 GetClientRect(rectClient); 7 m_pointsInfo.SetWindowPos(NULL,rectClient.left+1,rectClient.top+1,rectClient.Width()-2,rectClient.Height()-2,SWP_NOACTIVATE|SWP_NOZORDER);
Q:隐藏停靠窗口右键菜单
A:添加WM_CONTEXTMENU消息,不实现其内容即可
afx_msg void OnContextMenu(CWnd* pWnd,CPoint point);