CDockbalePane 使用问题

wenluderen 2014-09-22 09:57:48
CDockbalePane 是微软提供的一个类,最近要实现一个功能:
就是在一个单文档MFC程序里面,添加CDockablePane类 。
并且在框架类里面添加CDockbale类的对象。

然后添加一个对话框,将这个对话框添加到CDockable类里面,

目前这一步出问题了。

在网上有个教程,
1、首先创建多文档应用程序,创建一个对话框类CTestDlg。
2、在程序添加一个停靠栏类,名为ControlPanel,其父类为CDockablePane,在该类中添加对话框成员。
需要将对话框的style设置为child。另外border设置为none的话,得到的界面看上去会更主流一点。
1: class ControlPanel : public CDockablePane
2: {
3: .....
4: public:
5: CTestDlg m_dlg;
6: };
3、在ControlPanel的OnCreate方法中创建并显示对话框。
1: int ControlPanel::OnCreate(LPCREATESTRUCT lpCreateStruct)
2: {
3: if (CDockablePane::OnCreate(lpCreateStruct) == -1)
4: return -1;
5:
6: // TODO: Add your specialized creation code here
7:
8: m_dlg.Create(IDD_DIALOG_TEST,this);
9: m_dlg.ShowWindow(SW_SHOW);
10: return 0;
11: }
4、ControlPanel销毁时,对话框也销毁掉:
1: void ControlPanel::OnDestroy()
2: {
3: CDockablePane::OnDestroy();
4:
5: // TODO: Add your message handler code here
6: m_dlg.DestroyWindow();
7: }
5、ControlPanel尺寸变化、隐藏的时候,对话框也要做相关处理:
1: void ControlPanel::OnSize(UINT nType, int cx, int cy)
2: {
3: CDockablePane::OnSize(nType, cx, cy);
4:
5: // TODO: Add your message handler code here
6: if(m_dlg.GetSafeHwnd())
7: {
8: CRect rct;
9: GetClientRect(rct);
10: m_dlg.MoveWindow(rct);
11: }
12: }
6、在框架类中添加ControlPanel成员:
1: class CMainFrame : public CMDIFrameWndEx
2: {
3: ...
4: ControlPanel m_Panel;
5: ...
6: };
7、在框架类创建时,创建这个ControlPanel对象:
Create函数里面的666是这个停靠栏的ID,这里是随便指定的一个数值,只要不和其他已用资源重复即可,真正应用的时候,以在字符串表中添加一个ID。
1: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
2: {
3: ...
4: m_Panel.Create(_T("tset"),this,CRect(0,0,300,300),TRUE,666,
5: WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI);
6: m_Panel.EnableDocking(CBRS_ALIGN_ANY);
7:
8: EnableDocking(CBRS_ALIGN_ANY);
9: DockPane(&m_Panel);
10: ...
11: }


在第三步就出现问题了, 找不到CDockable类的OnCreate函数。
也没有OnDestroy函数。
这些函数需要自己添加吗?
...全文
159 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenluderen 2014-09-26
  • 打赏
  • 举报
回复
感谢 CSDN:54321 CSDN:yjmshpz 鸡啄米网站.... 等众位大神。
目前已经实现功能如下:
第一:在VS2010 里面创建单文档 程序
第二:添加继承子CDockablePane类的 类 并且在框架类里面添加 这个类的实例化对象

第三步:在资源里面添加对话框

第四步:int CDockablePaneGsz::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: 在此添加您专用的创建代码
m_DialogGsz.Create(IDD_DIALOG_GSZ,this);
m_DialogGsz.ShowWindow(SW_SHOW);

return 0;
}

第五步:在添加的对话框里添加 CTreeCtrl 控件 。
在BOOL CDialogGsz::OnInitDialog() 里设计CTreeCtrl控件的

第六步:在对话框里面添加 CTreeCtrl节点的双击事件响应函数。

效果如下



核心代码:
BOOL CDialogGsz::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO: 在此添加额外的初始化

HICON hIcon[3];//图标的句柄数组
HTREEITEM hRoot;//树的根节点句柄
HTREEITEM hCataItem;//可表示任意分类的句柄
HTREEITEM hArtItem;//可表示任意文章节点的句柄


//加载三个图标,并将它们的句柄保存到数组
hIcon[0]=theApp.LoadIconW(IDI_ICON_WEB);
hIcon[1]=theApp.LoadIconW(IDI_ICON_CATALOG);
hIcon[2]=theApp.LoadIconW(IDI_ICON_ARTICLE);

//创建图像序列
m_imageList.Create(32,32,ILC_COLOR32,3,3);

//将三个图标图标添加到 序列中
for (int i=0;i<3;i++)
{
m_imageList.Add(hIcon[i]);
}
//为树形控件添加 图像序列
m_TreeCtrl_Catalog.SetImageList(&m_imageList,TVSIL_NORMAL);
//插入根节点
hRoot=m_TreeCtrl_Catalog.InsertItem(_T("鸡啄米"),0,0);




//在根节点下 插入子节点
//包含项目文本的字符串的地址。
//项目的图像的索引在树视图控件图形的列表。 节点没有被选择是的图片
//项目中的选定图像的索引在树视图控件图形的列表。 节点没被选择是的图片
//插入项的父级的句柄。
//要插入该项目,然后后新项目的句柄。 就是告诉插入的节点在已存在节点的后面
hCataItem=m_TreeCtrl_Catalog.InsertItem(_T("IT互联网"),2,1,hRoot,TVI_LAST);
//为“IT互联网”为节点添加附加的编号数据,在鼠标滑过该节点时候显示
m_TreeCtrl_Catalog.SetItemData(hCataItem,1);
//在“IT互联网”下添加插入子节点
hArtItem= m_TreeCtrl_Catalog.InsertItem(_T("百度文章1"),2,2,hCataItem,TVI_LAST);
//为“百度文章1”为节点添加附加的编号数据,在鼠标滑过该节点时候显示
m_TreeCtrl_Catalog.SetItemData(hArtItem,2);
// 在“IT互联网”节点下插入另一子节点
hArtItem=m_TreeCtrl_Catalog.InsertItem(_T("谷歌文章2"),2,2,hCataItem,TVI_LAST);
// 为“谷歌文章2”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem,3);



// 在根节点下插入第二个子节点
hCataItem=m_TreeCtrl_Catalog.InsertItem(_T("数码生活"),1,1,hRoot,TVI_LAST);
// 为“数码生活”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hCataItem,4);
// 在“数码生活”节点下插入子节点
hArtItem=m_TreeCtrl_Catalog.InsertItem(_T("智能手机文章1"),2,2,hCataItem,TVI_LAST);
// 为“智能手机文章1”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem,5);
// 在“数码生活”节点下插入另一子节点
hArtItem=m_TreeCtrl_Catalog.InsertItem(_T("平面电脑文章2"),2,2,hCataItem,TVI_LAST);
// 为“平板电脑文章2”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem,6);



// 在根节点下插入第三个子节点
hCataItem =m_TreeCtrl_Catalog.InsertItem(_T("软件开发"),1,1,hRoot,TVI_LAST);
// 为“软件开发”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hCataItem,7);
// 在“软件开发”节点下插入子节点
hArtItem= m_TreeCtrl_Catalog.InsertItem(_T("C++编程入门系列1"),2,2,hCataItem,TVI_LAST);
// 为“C++编程入门系列1”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem,8);
// 在“软件开发”节点下插入另一子节点
hArtItem=m_TreeCtrl_Catalog.InsertItem(_T("VS2010/MFC 编程入门2"),2,2,hCataItem,TVI_LAST);
// 为“VS2010/MFC编程入门2”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem,9);


// 在根节点下插入第四个子节点
hCataItem = m_TreeCtrl_Catalog.InsertItem(_T("娱乐休闲"), 1, 1, hRoot, TVI_LAST);
// 为“娱乐休闲”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hCataItem, 10);
// 在“娱乐休闲”节点下插入子节点
hArtItem = m_TreeCtrl_Catalog.InsertItem(_T("玛雅文明文章1"), 2, 2, hCataItem, TVI_LAST);
// 为“玛雅文明文章1”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem, 11);
// 在“娱乐休闲”节点下插入另一子节点
hArtItem = m_TreeCtrl_Catalog.InsertItem(_T("IT笑话2"), 2, 2, hCataItem, TVI_LAST);
// 为“IT笑话2”节点添加附加的编号数据,在鼠标划过该节点时显示
m_TreeCtrl_Catalog.SetItemData(hArtItem, 12);




return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

相关事件的处理函数

void CDialogGsz::OnTvnSelchangedTreeCatalog(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

CString strText;//树节点的标签的文本的字符串
//获取当前 选中 的节点的句柄
HTREEITEM hItem = m_TreeCtrl_Catalog.GetSelectedItem();
//获取选中节点标签的字符串
strText=m_TreeCtrl_Catalog.GetItemText(hItem);
//将字符串显示到编辑框中
SetDlgItemText(IDC_EDIT_ITEM_SEL,strText);

}


void CDialogGsz::OnTvnGetInfoTipTreeCatalog(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;


// 将传入的pNMHDR转换为NMTVGETINFOTIP指针类型
NMTVGETINFOTIP *pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR;
// 获取树的根节点
HTREEITEM hRoot = m_TreeCtrl_Catalog.GetRootItem();
// 每个树节点的提示信息
CString strText;

if (pTVTipInfo->hItem==hRoot)
{
// 如果鼠标划过的节点是根节点,则提示信息为空
strText=_T("");
}
else
{
// 如果鼠标划过的节点不是根节点,则将该节点的附加32位数据格式化为字符串
strText.Format(_T("%d"),pTVTipInfo->hItem);
}
// 将strText字符串拷贝到pTVTipInfo结构体变量的pszText成员中,这样就能显示内容为strText的提示信息
wcscpy(pTVTipInfo->pszText,strText);
}


void CDialogGsz::OnNMDblclkTreeCatalog(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
CString curtext;//实例化话一个字符串 对象
HTREEITEM hCurSel = m_TreeCtrl_Catalog.GetSelectedItem();//实例化一个CTreeCtrl类的对象 并且将当前选择的节点 的句柄传递过来
if (NULL!= hCurSel)//如果返回的节点句柄不为空
{
curtext = m_TreeCtrl_Catalog.GetItemText(hCurSel);
}
AfxMessageBox(_T("返回的节点句柄不为空"));



}


开发环境: win7 旗舰64位 ++++VS2010

想参与的探讨的坛友 请致信:wenluderen@gmail.com 谢谢
源代码地址:
http://pan.baidu.com/s/1ntE5TNz
wenluderen 2014-09-23
  • 打赏
  • 举报
回复
引用 2 楼 yjmshpz 的回复:
感谢你的回复。 我似乎没有把 对象的成员函数(create )和对象的消息响应函数(OnCreate)分清楚。 通过点按那个小方块(在VS2010叫重写)里面有create函数,这是添加类的成员函数 小方块的左面 是消息 是添加对象的 消息响应函数。 在左面是事件。 我在尝试一下。。。。
yjmshpz 2014-09-23
  • 打赏
  • 举报
回复
wenluderen 2014-09-22
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/bb984433.aspx 上述链接是微软对CDockablePane类的解释。 谁能提点我实现上述文档中提到的功能,愿奉上30元话费。 钱不在多少,只是表达感谢之意。 谢谢

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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