vs2010中使用CDockablePane出现的几个问题

yuliyang 2012-02-02 12:19:57
大家好。我想在多文档程序中添加一个停靠栏,里面放置一些控件。为了方便界面设计,我在停靠栏里集成了一个对话框。我的做法如下:
1、首先添加了一个对话框资源,并添加相应的对话框类CRenderDlg;
2、从CDockablePane类派生出一个类CRenderPanel,在这个类里添加对话框成员,并重写了该类的析构函数、OnSize和OnCreate函数如下:

class CRenderPanel : public CDockablePane
{
...
public:
CRenderDlg m_RenderDlg;//对话框成员
...
};


void CRenderPanel::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (GetSafeHwnd() == NULL)
{
return;
}

CRect rectClient;
GetClientRect(&rectClient);

m_RenderDlg.MoveWindow(rectClient);
}


int CRenderPanel::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
m_RenderDlg.Create(IDD_FORMVIEW_RENDER,this);
m_RenderDlg.ShowWindow(SW_SHOW);
return 0;
}


CRenderPanel::~CRenderPanel()
{
m_RenderDlg.DestroyWindow();
}

3、在框架类中添加CRenderPanel成员

CRenderPanel m_RenderPanel;

4、在框架类的OnCreate函数中创建停靠栏:

m_RenderPanel.Create("Render Control",this,CRect(0,0,300,200),TRUE,IDS_RENDER_PANEL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI);
m_RenderPanel.EnableDocking(CBRS_ALIGN_ANY);

CTabbedPane* pTabbedBar = new CTabbedPane(TRUE);

pTabbedBar->Create(_T("Test"),this,CRect(0,0,300,200),TRUE,666,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI);

pTabbedBar->AddTab(&m_RenderPanel);

DockPane(pTabbedBar);

完成以上工作后,最初停靠栏可以正常创建出来。这是正常情况下的界面截图:

但是后来不知道为什么,每次程序启动后,停靠栏默认不显示了,每次都要手动打开才行。
后来我把停靠栏拖离左侧,让它变成悬浮状态,退出程序后再次进入,结果在刚才的悬浮位置和原来的停靠位置分别出现了一个停靠栏。悬浮状态的那个没有重绘,但是上面的关闭按钮可以点,而停靠在左边的那个也可以正常用。如图:
http://hi.csdn.net/attachment/201202/2/358543_13281560564V1o.jpg
如果再次重复刚才的步骤,居然又会多出一个悬浮状态的停靠栏,截图如下:


虽然可以用EnableLoadDockState解决我现在的问题,但是网上的资料说,程序退出后,注册表中会保存停靠栏的状态,下次启动的时候程序去注册表中读取,既然这样,我的问题是:
1、为什么会出现程序启动时停靠栏不显示的情况?
2、为什么又会出现多个停靠栏的情况?
谢谢大家耐心看完这么长的问题!
...全文
1015 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjmshpz 2014-10-10
  • 打赏
  • 举报
回复
帖子好早了,不过我也在学习这个,不太了解
binbinyantai 2013-06-02
  • 打赏
  • 举报
回复
我也会有同样的问题,求解
少秋 2013-04-27
  • 打赏
  • 举报
回复
关注中,不知楼主解决这个问题没有?
yuliyang 2012-02-04
  • 打赏
  • 举报
回复
周末人多求关注。。。
yuliyang 2012-02-02
  • 打赏
  • 举报
回复
请有使用CDockablePane经验的朋友们介绍下使用这个类的注意事项,常见问题。谢谢各位过路的大神。
yuliyang 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leeedreadful 的回复:]

没有全看完,不知道 “CTabbedPane* pTabbedBar = new CTabbedPane(TRUE);”有delete 过程吗?
[/Quote]
谢谢提醒。确实忘了delete。考虑到停靠栏是以成员变量的方式添加的,我在框架类里又添加了一个CTabbedPane成员,但修改后原来的问题仍然存在。
Less 2012-02-02
  • 打赏
  • 举报
回复
没有全看完,不知道 “CTabbedPane* pTabbedBar = new CTabbedPane(TRUE);”有delete 过程吗?

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧