【MFC】实现停靠窗口(CDockablePane类)

停靠窗口(CDockablePane)

今天工作中,涉及到了停靠窗口,MFC这边实在是让我费解。所以就查询了资料,并记录下来,希望下次遇到可以快速回忆。

MFC停靠:微软搞这个最初是支持工具栏的停靠,随着后面使用的广泛,其他窗口也得到了支持。
效果:拖动框,会显示停靠的上下左右位置进行停靠。

  • 步骤:
    1、定义一个继承自CDockablePane的类。
class CainPane : public CDockablePane
{
	//类中实现CDockablePane类的接口
	//MFC代码,C++语言写.
	CLARE_MESSAGE_MAP()
	public:
		afx_msg int OnCreate(LPCREATESTRUCT lpcreatestruct);
		afx_msg void OnSize(UINT nType,int cx, int cy);
}

2、MainFrm.h中声明。

CainPane m_CainPane;

3.CMainFrame::OnCreate中创建

EnableAutoHidePanes(CBRS_ALIGN_ANY);//窗口自动停靠
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));
m_dockableTest.EnableDocking(CBRS_ALIGN_ANY);//使可停靠和浮动
DockPane(&m_dockableTest);
  • 问题解答:
    Q:停靠窗口隐藏后,鼠标移动到停靠窗口标签上显示停靠窗口,会有残影。

    A: ①在CDockableTest类中添加OnCreate和OnSize函数
    ②CDockableTest::OnCreate中创建控件

CRect rectDummy;
rectDummy.SetRectEmpty();
const DWORD dwViewStyle = WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
if(!m_pointsInfo.Create(dwViewStyle,rectDummy,this,4/*ID*/))
{
    TRACE0(MyLoadString(IDS_CREATEPOINTINFOVIEW_ERROR));
     return -1;  
}

③CDockable::OnSize中根据停靠窗口位置调整控件大小

if(GetSafeHwnd() == NULL)
{
    return;
}
CRect rectClient;
GetClientRect(rectClient);
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);

关于MFC停靠暂时就写这些,以后遇到问题再补充。工作之余写点博客,如果对你们有帮助,就是有价值的。 谢谢大家!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cain Xcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值