返回首页


简介
这篇简短的文章介绍了一种简单的方法内添加一个或多个窗格的拆分窗口的工具栏。通常当你创建一个拆分窗口在CMainFrame类的OnCreateClient方法,您提供的CSplitterWnd的CView派生类:CreateView的方法。然而,提供的类并不需要一个CView的派生类。它可以是任何CWnd的派生类。 CSplitterWnd的类,如果你看看MFC代码里面,你会看到这个类使用的CWnd指针CView的指针。在CSplitterWnd的类的方法,处理与Windows,使用CWnd的指针。举例来说,CSplitterWnd的::GetPane返回一个CWnd。这使我们能够使用CFrameWnd派生类,而不是一个CView派生类。自CFrameWnd类提供了所有的工具栏/对接的支持,我们可以很容易地从CFrameWnd派生的每个分隔窗格添加一个工具栏。下面是从我的示例应用程序的OnCreateClient代码:BOOL的CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext * pContext){ m_wndSplit.CreateStatic(这一点,1,2); m_wndSplit.CreateView(0,0,pContext - GT; m_pNewViewClass,CSIZE(175,500) pContext); / /创建视图使用一个CFrameWnd派生类。 m_wndSplit.CreateView(0,1,RUNTIME_CLASS(CSplitFrame),CSIZE(175,500) pContext); / /激活视图窗格。 & #160;SetActiveView((CView的*)m_wndSplit.GetPane(0,0));  60; RecalcLayout(); 返回TRUE;   ; / /返回CFrameWnd的:OnCreateClient(lpcs,pContext);}
现在,你的CFrameWnd派生类必须做两件事。首先,它已在OnCreateClient方法创建你的视图类。我的示例代码使用一个CFormView派生类:BOOL CSplitFrame::OnCreateClient(LPCREATESTRUCT lpcs CCreateContext * pContext){ CSplitView * PVIEW; / /创建一个上下文。 CCreateContext范围内; pContext =安培;上下文; / /指定自定义视图。 pContext - GT; m_pNewViewClass = RUNTIME_CLASS(CSplitView); & #160;/ /创建视图。 PVIEW =(CSplitView *)CreateView的(pContext,AFX_IDW_PANE_FIRST); 如果(PVIEW == NULL) 0; 返回FALSE; / /通知视图。 60; PVIEW - GT; SendMessage消息(WM_INITIALUPDATE);  60;SetActiveView(PVIEW,FALSE); 返回TRUE;}
CFrameWnd派生类必须做的第二件事是创建工具栏将出现在拆分窗格:INT CSplitFrame:在OnCreate(LPCREATESTRUCT lpCreateStruct){ (CFrameWnd的:在OnCreate(lpCreateStruct)== -1) 返回-1;  60; (!m_wndToolBar.CreateEx(这一点,TBSTYLE_FLAT  60; WS_CHILD | WS_VISIBLE | CBRS_TOP  60; | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)| | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("无法创建工具栏"\ nquot"); 返回-1; / /未能创建 } m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.SetBorders(3,3,3,3); & #160; EnableDocking(CBRS_ALIGN_ANY); DockControlBar(AMP; m_wndToolBar); 返回0;}
这就是它!现在你有一个完全可停靠的工具栏,您的拆分窗口的窗格。很简单!|汤姆舒普

回答

评论会员:游客 时间:2011/11/29
你好我想知道如果我能在商业用途中使用此代码。非常感谢。叶夫根Milshteinit@controp.co.il
AwinHuang
评论会员:游客 时间:2011/11/29
在下面的函数,删除两行,你将有你的正确的文件链接和消息传递:删除线:CCreateContext上下文;pContext=背景;BOOLCSplitFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){CSplitView*PVIEW;//创建一个上下文。//CCreateContext上下文;//pContext=背景; //分配自定义视图。pContext-m_pNewViewClass=RUNTIME_CLASS(CSplitView) //创建视图。PVIEW=(CSplitView*)CreateView的(pContext,AFX_IDW_PANE_FIRST);(PVIEW==NULL)返回FALSE; //通知视图。PVIEW-SendMessage消息(WM_INITIALUPDATE)SetActiveView(PVIEW,FALSE)返回TRUE;}FC
jhwurmbach
评论会员:游客 时间:2011/11/29
左侧视图如果要信号的右侧,如何做到这一点?
菲尔捷
评论会员:游客 时间:2011/11/29
AwinHuang写道:如果左侧视图右侧的信号,如何做到这一点?这个老问题,但..发送查看调用文件中的功能,进而调用UpdateAllViews与特定的提示。任何有兴趣在此提示可以处理的OnUpdate"我们刻苦训练,但它似乎每次我们开始形成团队,我们将重组我以后学习生活中,我们往往通过重组,以满足任何新的形势:一个美妙的方法可用于创建的进展的假象,而产生混乱,效率低下,士气消沉的。"-凯厄斯Petronius,罗马领事,66AD
亚历克斯埃文斯
评论会员:游客 时间:2011/11/29
是一个放置在另一个framewnd帧WND的问题如果在CSplitFrame的看法是相同的CDocument作为主框架,那么当您关闭主框架,你会不会提示保存的文件。这是因为MFC的外观,并认为有在同一文档中打开另一个框架WND。
Damos
评论会员:游客 时间:2011/11/29
您好我有一个工具栏,其中一个按钮,下拉/浮动菜单(例如,CFileDialog的对话框)-?我怎样才能得到处理,菜单感谢亚历克斯
巴巴克阿萨迪
评论会员:游客 时间:2011/11/29
您好!好主意,但...-"F6"的beetween窗格开关无法正常工作(硬盘修复-CView的检查其母公司,如果它不CSplitterderrived的CView将禁用命令"F6")-设定焦点的窗格不激活此窗格imgsrc=http://www.orcode.com/upimg/2011_11_29_00_26_42_1.gif任何有想法如何解决它?禁用/启用方面的共同工具栏上的按钮取决于"ActivePane"MessageMap。最好的问候!
罗伯托罗科
评论会员:游客 时间:2011/11/29
您好,我不停地接收断言,直到我意识到,要为孩子在其属性对话框资源。伟大的文章!
dongdks
评论会员:游客 时间:2011/11/29
我在我的应用程序中使用这种技术,但有一个非常难看的错误(地方)......如果调整在CFrameWnd的窗格中,基本的观点将失效并重绘每个WM_PAINT消息的两倍。当第一重绘的情况下,GetClientRect返回时创建的CFrameWnd/CView中使用的尺寸:codeprem_split.CreateView(spanclass="code-digit"0/span,spanclass="code-digit"1/span,RUNTIME_CLASS(CMyFrame),CSize(spanclass="code-digit"100/span,spanclass="code-digit"100/span),pContext);/pre/code......IE浏览器。GetClientRect在视图将返回一个100x100的矩形。第二重绘发生时,GetClientRect返回的实际窗口RECT。这确实是一个问题,如果你的看法是规模客户端RECT大小,您会看到两个不同的看法大小调整窗口的大小时,或只是部分无效(顶部拖动另一个窗口,导致WM_PAINT消息)。出现这种情况,即使没有工具栏,你可以用一个简单的裸机测试程序重复。{​​BR}任何想法?投票没有任何反应,就是要遵循的懦夫的方式
。AnthonyWinters
评论会员:游客 时间:2011/11/29
...像往常一样,问这个问题解决了这个问题。如果您创建一个大小为(0,0)的观点,它看起来像失效的问题消失。C投票没有反应,就是要遵循的懦夫的方式
。Ridgeley于
评论会员:游客 时间:2011/11/29
我已经找到一个解决方案是设置在OnCreateClientm_pCurrentDoc成员(这样子)的方法://创建一个上下文。CCreateContext上下文;context.m_pCurrentDoc=pContext-m_pCurrentDoc;context.m_pNewDocTemplate=pContext-m_pNewDocTemplate;pContext=背景;罗伯托罗科
托比亚斯斯文森
评论会员:NGU 时间:2011/11/29
Timbit
评论会员:游客 时间:2011/11/29
这是没有直接关系到这篇文章,但我以为你会知道如何帮助我。我想在一个CTreeViewMFC生成的程序禁用的工具栏按钮。在OnCreate函数MainFraim.cpp中,我做了以下内容:CToolBarCtrl工具=m_wndToolBar.GetToolBarCtrl()tools.EnableButton(ID_ADD_PAGE,FALSE);EnableButton函数什么也不做!像DeleteButton和不确定的正常工作,但EnableButton其他功能无法正常工作。我做别的事情,使这一变化生效?非常感谢安东尼
Timbit
评论会员:游客 时间:2011/11/29
!我遇到同样的问题我已经尝试了很多可能的解决方案,但在白白imgsrc=http://www.orcode.com/upimg/2011_11_29_00_26_42_2.gif任何人都可以给我一些建议吗?{B​​R}感谢了很多......
沃伦加德纳
评论会员:游客 时间:2011/11/29
MFC处理这个问题有点不同。它要求一个更新程序,以检查是否该按钮应禁用或不。如果没有这样的程序提供MFC将使按钮,这使得您的EnableButton通话不按预期工作。你需要写一个更新处理程序,启用/禁用按钮。这是很容易做到与类向导BEGIN_MESSAGE_MAP(CMainFrame中,CFrameWnd中) ON_UPDATE_COMMAND_UI(ID_BUTTON,OnUpdateButton)END_MESSAGE_MAP()无效的CMainFrame::OnUpdateButton(CCmdUI*pCmdUI){//这里总是diabled,提供您自己的检查pCmdUI-启用(F​​ALSE);}托比亚斯
约翰Famiglietti
评论会员:游客 时间:2011/11/29
我不得不做出一些改变,所以是在分割帧创建收到文件指针在OnInitialUpdate,而不是创建一个新的CCreateContextOnCreateClient对象,我只是重用。另外,我不发送WM_INITIALUPDATE消息。这已经是SetActiveView()调用这是我结束了。BOOLCSplitFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){CSplitView*PVIEW;//指定自定义视图。pContext-m_pNewViewClass=RUNTIME_CLASS(CSplitView);//创建视图。PVIEW=(CSplitView*)CreateView的(pContext,AFX_IDW_PANE_FIRST); 如果(PVIEW==NULL)返回FALSE; SetActiveView(PVIEW,FALSE);返回TRUE;}