在多文档中实现CTreeCtrl

来源:互联网 发布:java volatile 作用 编辑:程序博客网 时间:2024/06/05 14:33
从CTreeCtrl 派生一个类出来


主要用于树状控件的实现


响应控件的消息OnNotify
什么都不做,但实验结果Item还是收缩自如,这样可以确认想通过给父窗口的通知消息来控制
“展开/合拢”是不行的,控件自己在发生Notify之前就已经把自己的事情做完了,
现在的问题是修改CTreeCtrl的代码还是自定义一个继承自CTreeCtrl的Tree类,
重写某些处理函数达到期望目的。


#pragma once// CViewTreeclass CViewTree : public CTreeCtrl{DECLARE_DYNAMIC(CViewTree)public:CViewTree();virtual ~CViewTree();virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);protected:DECLARE_MESSAGE_MAP()};

#include "stdafx.h"#include "paint2.0.h"#include "ViewTree.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CViewTreeIMPLEMENT_DYNAMIC(CViewTree, CTreeCtrl)CViewTree::CViewTree(){}CViewTree::~CViewTree(){}BEGIN_MESSAGE_MAP(CViewTree, CTreeCtrl)END_MESSAGE_MAP()// CViewTree 消息处理程序BOOL CViewTree::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult){BOOL bRes = CTreeCtrl::OnNotify(wParam, lParam, pResult);NMHDR* pNMHDR = (NMHDR*)lParam;ASSERT(pNMHDR != NULL);if (pNMHDR && pNMHDR->code == TTN_SHOW && GetToolTips() != NULL){GetToolTips()->SetWindowPos(&wndTop, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE);}return bRes;}

#pragma once#include "ViewTree.h"class CDrawToolBar:public CMFCToolBar{public: virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler) { CMFCToolBar::OnUpdateCmdUI((CFrameWnd*)GetOwner(), bDisableIfNoHndler); } virtual BOOL AllowShowOnList() const { return FALSE; } //定位工具栏是否在工具栏列表显示在 自定义 对话框的 工具栏 窗格中。private:};class CDrawView :public CDockablePane{public:CDrawView();virtual ~CDrawView();public:CViewTree m_wndDrawView;CImageList m_DrawViewImage;CDrawToolBar m_wndToolBar;public:void AdjustLayout();   // Call this method when the toolbar has been created to recalculate its size and position.DECLARE_MESSAGE_MAP()afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);   // 创建时调用afx_msg void OnSize(UINT nType, int cx, int cy);// 和AdjustLayout() 共同的响应};


#include "stdafx.h"#include "DrawView.h"#include "Resource.h"CDrawView::CDrawView(){}CDrawView::~CDrawView(){}BEGIN_MESSAGE_MAP(CDrawView, CDockablePane)ON_WM_CREATE()ON_WM_SIZE()END_MESSAGE_MAP()void CDrawView::AdjustLayout(){if (GetSafeHwnd()==NULL)  // 安全的获得 窗口句柄的指针{return;}CRect rectClient;GetClientRect(rectClient);  // 获取view视图int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;  //工具条的竖直高度m_wndToolBar.SetWindowPos(NULL, rectClient.left , rectClient.top,rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);//调整工具栏的高度m_wndDrawView.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1,rectClient.Width() - 2,rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);//绘图的大小设置}int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDockablePane::OnCreate(lpCreateStruct) == -1)return -1;// TODO:  在此添加您专用的创建代码CRect rectDummy;rectDummy.SetRectEmpty();  //const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_EXPLORER);m_wndToolBar.LoadToolBar(IDR_EXPLORER, 0, 0, TRUE /* 已锁定*/);if (!m_wndDrawView.Create(dwViewStyle, rectDummy, this, 4)){TRACE0("未能创建文件视图\n");return -1;      // 未能创建}// 加载视图图像m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));//SetOwner Identifies the new owner of the window object. If this parameter is NULL, the window object has no owner.m_wndToolBar.SetOwner(this);// 所有命令将通过此控件路由,而不是通过主框架路由: //如果此参数是 TRUE,父框架将命令发送到工具栏。 否则,所有者将命令发送到工具栏。/*CMFCToolBar::SetRouteCommandsViaFrame指定父框架或所有者是否将命令发送到工具栏。void SetRouteCommandsViaFrame(BOOL bValue);*/m_wndToolBar.SetRouteCommandsViaFrame(FALSE);AdjustLayout();return 0;}void CDrawView::OnSize(UINT nType, int cx, int cy)//尺寸改变了响应{CDockablePane::OnSize(nType, cx, cy);// TODO:  在此处添加消息处理程序代码AdjustLayout();}


在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)加入// 创建停靠窗口if (!CreateDockingWindows()){TRACE0("未能创建停靠窗口\n");return -1;}m_wndDrawView.EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndDrawView);添加基本的消息响应大概的框架就做出来了BOOL CMainFrame::CreateDockingWindows(){BOOL bNameValid;// 创建画图的视图CString strDrawName;bNameValid = strDrawName.LoadStringW(IDS_DRAW_VIEW);ASSERT(bNameValid);if (!m_wndDrawView.Create(strDrawName, this, CRect(0, 0, 200, 200), TRUE, ID_DRAW_DRAWVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)){TRACE0("未能创建“文件视图”窗口\n");return FALSE; // 未能创建}SetDockingWindowIcons(theApp.m_bHiColorIcons);return TRUE;}void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons){HICON hFileViewIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_FILE_VIEW_HC : IDI_FILE_VIEW), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);m_wndDrawView.SetIcon(hFileViewIcon, FALSE);UpdateMDITabbedBarsIcons();//Sets the icon for each MDI tabbed pane.}


0 0
原创粉丝点击