16,548
社区成员




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: }
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("返回的节点句柄不为空"));
}