返回首页


{S0}简介
你是否曾经想过在你的程序中使用一个分割窗口,但不希望所有的文档/视图结构的额外的垃圾?
在新项目向导中,为了使"拆分窗口??"复选框可用,你必须选择"文档/视图结构支持??这使得很多额外的不必要的代码如果你想在你的项目是一个分裂的主要窗口。
在这篇文章中,我将步行通过创建一个简单的SDI与分裂的主要窗口,工具栏,状态栏。窗口将被分成左和右窗格中,资源为基础,可以在资源编辑器就像一个简单的基于对话框的应用程序很容易被修改。
这些说明和项目文件的Visual Studio 2005,虽然他们可能在旧版本的Visual Studio工作,你会在自己的适应。
启动Visual Studio并创建一个新项目。选择MFC应用程序,让您的项目名称,并点击"确定吗??


单击"下一步"。

为了保持尽可能简单,我们将使用我们的项目的最小选项。
选择"单文档??取消选中"文档/视图结构??取消"使用Unicode库??并选择"使用MFC静态库??单击"下一步"。

我们不希望任何数据库支持,所以只需单击"下一步"。
{五}
在此页面,我们将保持默认设置。这将为我们提供一个状态栏和工具栏。好东西,有一个SDI项目。点击Next。
{中六}
取消选中"ActiveX控件??和"共同控制清单??除非你知道你是要在您的项目中使用ActiveX控件和新的XP的特定控制,没有任何理由额外的开销。点击Next。
{七}
这里是哪里,这将是很好,如果他们让我们选择我们想要什么样的孩子查看,但他们不这样做,所以只打完成。
编译并运行该项目。

请注意,标题栏图标设置为默认的图标,而不是一个项目的资源文件中定义。这是在Visual Studio中的错误,多年来一直围绕。下面是如何解决它。

在IDE中,选择"类视图"的InitInstance和双击??

您应该看到:

要更改标题栏上的图标,首先我们需要创建一个,然后我们需要告诉应用程序主窗口,使用它。将下面的代码后??代码> UpdateWindow??但在此之前??代码>返回??

//Create and load the titlebar icon

HICON hIcon;

hIcon = LoadIcon(IDR_MAINFRAME);    

AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);

相反,你可能会认为,LoadIcon不实际加载的图标,它只是创建它。我们要告诉应用程序使用新的图标SendMessage函数。???
你的代码的InitInstance现在应该看起来像这样:

现在,当您编译和运行,你应该看到的资源定义标题栏图标。

现在可以使用资源编辑器更改图标到任何你想要的。
现在是时候添加分割窗口,我答应。为了有一个分割窗口,我们将使用名为CSplitterWnd的一类。在类视图中,右击CMainFrame中,选择"添加变量??改变访问??代码保护??变量的类型呢???代码> CSplitterWnd的??和变量名??代码> m_wndSplitter??并单击Finish。

由于分裂将会在客户区,它的代码将需要在OnCreateClient在CMainFrame重载函数。
在类视图中,选择CMainFrame的。在"属性"区域中,按"覆盖??"按钮,向下滚动到??代码> OnCreateClient??并添加功能与组合框的右侧。

OnCreateClient函数中添加以下代码:{C}
这会为我们创建一个静态拆分窗口,将有一排两列。
别急,还没有编制。我们还需要告诉分配器在每个窗格中显示的内容,我们需要摆脱旧观点的视觉工作室为我们创建的。
对于本教程,让我们使用资源的基础形式。这将可以很容易地添加控件,并为这个项目建设的其他应用程序作为模板使用。
切换到资源视图,展开对话框的叶,右击并选择"插入"对话框???这将插入一个新的对话框资源,在资源编辑器中打开它。

删除"确定吗?"和"取消吗??按钮。对话框上单击右键,并选择"属性"。
在"属性",更改:边界"吗??控制为"真? ID为"IDD_FORM_LEFT??风格"孩子??

现在以同样的方式添加一个新的对话框,但编号:IDD_FORM_RIGHT。
在资源视图中,双击IDD_FORM_LEFT。这将打开资源编辑器中左边的表格。右键单击编辑器对话框,选择"添加类???
更改基类??代码> CFormView的??这个名字呢???代码> CFormLeft??和命中完成。

IDD_FORM_RIGHT资源重复这个过程,但类名CFormRight。

现在我们已经分离器,以显示意见。
MainFrm.cpp,添加标题行:
#include "FormLeft.h"

#include "FormRight.h"

向下滚动到??代码> OnCreateClient??功能和创建视图调用添加到分离器。创建拆分后,但在返回之前,添加下面的代码。
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CFormLeft), CSize(125, 100), pContext) ||

    !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CFormRight), CSize(100, 100), pContext))

{

    m_wndSplitter.DestroyWindow();

    return FALSE;

}

你的OnCreateClient看起来应该像这样。

我们几乎有。现在,我们需要摆脱查看Visual Studio中为我们作出的任何用途的旧观点。
向上滚动的OnCmdMsg函数和删除:
if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

    return TRUE;

滚动OnSetFocus功能,并删除:
m_wndView.SetFocus();

滚动到OnCreate函数和删除:
// create a view to occupy the client area of the frame

if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,

    CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))

{

    TRACE0("Failed to create view window\n");

    return -1;

}

为MainFrm.h顶部,删除:
向下滚动并删除:
CChildView    m_wndView;

切换到"解决方案资源管理器,右键点击??EM> ChildView.h??然后选择删除。在弹出框,按"删除"按钮。

删除??EM> ChildView.cpp??以同样的方式。

您可以编译和运行现在,你将有一个分割窗口的SDI。试试吧,左右拖动分割栏:

没有在这一点上做任何事情,但你可以用资源编辑器添加控制。
然而,在每个窗格的控制只能影响控制在同一窗格。为了控制左窗格中的影响控制在右窗格中,我们将需要重新路由的一些消息。
在类视图中,右键单击"CformLeft??并选择"添加变量???请访问受保护的类型??代码>的CWnd *??名字??代码> m_target??点击完成。

在类视图中,右键单击"CFormLeft??并选择"添加功能???使返回类型为void,这个名字吗??代码> SetTarget??并添加一个参数类型??代码的CWnd *??命名??代码> m_cwnd??点击完成。

SetTarget功能,添加代码:
您应该看到:

下一步,我们将需要覆盖按需功能。选择??代码> CFormLeft??类视图。点击覆盖"按钮,向下滚动到按需和使用下拉框添加的功能。

在OnCommand函数,添加下面的代码:
if(m_target)

{           

    m_target->SendMessage(WM_COMMAND, wParam, lParam);

}

else

{

    CFormView::OnCommand(wParam, lParam);

}

return true;

您应该看到:

这将发送这种形式我们设定的目标窗口的消息。现在我们要设定目标的形式,在右窗格中。
在CMainFrame的OnCreateClient函数中添加以下代码分离器后创建的意见和返回之前:
//set the target for mapped messages

((CFormLeft*)m_wndSplitter.GetPane(0,0))->SetTarget(m_wndSplitter.GetPane(0,1));

你的函数现在应该看起来像:

现在让我们添加一些控件,并使用它。 IDD_FORM_RIGHT在资源编辑器打开,并添加一个静态文本控件。

更改ID IDC_STATIC_HELLO,标题为"按一下按钮??和文本对齐中心。

右键单击"静态控制,并选择添加变量。点击控制类型复选框,类型??代码> CStatic的??和名字??代码> m_hello??单击"完成"。

在资源编辑器打开IDD_FORM_LEFT,并添加一个按钮。

更改ID IDC_BUTTON_HELLO和标题说"你好??

右键单击该按钮,选择"添加事件处理程序??选择BN_CLICKED消息类型??代码> CFormRight??从类列表,然后点击添加和编辑。

在OnBnClickedButtonHello函数中,添加下面的代码:
m_hello.SetWindowText("Hello Window Splitter!");

你的函数看起来应该像:

编译并运行程序。按一下说Hello按钮,你应该看到在右窗格中的测试变化。现在,尝试拖动分割栏,你应该看到在右侧的文本窗格中移动拆分条。

我希望你觉得这篇文章有用。| kencocomputers

回答

评论会员:洁净和乐于助人的 时间:2011/12/06
。neuodpo
评论会员:游客 时间:2011/12/06
感谢您的教程。清洁和帮助。我在VC6.0环境下工作。有一个问题在VC6.0的最后一步。[报价]右键按一下按钮,并选择添加事件处理程序??选择BN_CLICKED消息类型和CFormRight??从类列表,然后点击添加和编辑。[/QUOTE]我不能按钮的事件映射到"CFormRight"。如何解决这个问题呢?你有什么sugguestion?感谢
。neuodpo
评论会员:游客 时间:2011/12/06
已resovled添加"BN_CLICKED"事件CLeftForm。就像如下:codeprelang="c++" spanclass="code-comment"///spanspanclass="code-comment"{{AFX_MSG(CLeftForm)/span spanclass="code-comment"///spanspanclass="code-comment"NOTE-theClassWizardwilladdandremovememberfunctionshere./span afx_msgspanclass="code-keyword"void/spanOnBtnHello();spanclass="code-comment"///spanspanclass="code-comment"}}AFX_MSG/span? BEGIN_MESSAGE_MAP(CLeftForm,CFormView)spanclass="code-comment"///spanspanclass="code-comment"{{AFX_MSG_MAP(CLeftForm)/span spanclass="code-comment"///spanspanclass="code-comment"NOTE-theClassWizardwilladdandremovemappingmacroshere./span ON_BN_CLICKED(IDC_BTN_HELLO,OnBtnHello)spanclass="code-comment"///spanspanclass="code-comment"}}AFX_MSG_MAP/spanEND_MESSAGE_MAP() ?  spanclass="code-keyword"void/spanCLeftForm::OnBtnHello(){ spanclass="code-comment"///spanspanclass="code-comment"TODO:Addyourcontrolnotificationhandlercodehere/span m_ctl_hello.SetWindowText(spanclass="code-string""/spanspanclass="code-string"HelloWorld!!!"/span);}/pre/codeCRightForm.cpp,然后将代码和修改类的名称为"CRightForm"。然后,它的工作
。代言
评论会员:简易明白我喜欢它 时间:2011/12/06
!会员7786265
评论会员:游客 时间:2011/12/06
非常清楚,写得很好。谢谢
!会员7740670
评论会员:游客 时间:2011/12/06
!您好,我是来自台湾的学生,这篇文章我真的有很大的帮助只是想感谢您的耐心和善良的你!希望你能保持这样写的伟大的东西最佳
!安东尼奥佩多
评论会员:伟大的教程 时间:2011/12/06
!!ashwani_gupt
评论会员:游客 时间:2011/12/06
您好所有,我试图用5窗格分割窗口,这里的技术。oncreateclient代码below.i"我dlg_plc类错误C2039从创建视图的语句。BOOL的CMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){//TODO:添加您的专用代码和/或调用基类如果(!m_wnd.CreateStatic(这一点,1,5)) 返回FALSE;如果(m_wnd.CreateView(0,0,RUNTIME_CLASS(CDlg_plc),CSIZE(125,100),pContext)||!m_wnd.CreateView(0,1,RUNTIME_CLASS(CDlg_plc),CSIZE(125,100),pContext)||!m_wnd.CreateView(0,2,RUNTIME_CLASS(CDlg_plc),CSIZE(125,100),pContext)|| !m_wnd.CreateView(0,3,RUNTIME_CLASS(CDlg_plc),CSIZE(125,100),pContext)|| !m_wnd.CreateView(0,4,RUNTIME_CLASS(CDlg_plc),CSIZE(100,100),pContext)){m_wnd.DestroyWindow()返回FALSE;}CFrameWnd的:OnCreateClient(lpcs,pContext);}下面给出的错误列表。编译...MainFrm.cppC:\PROGRAMFILES\的MicrosoftVisualStudio\MyProjects\S2\MainFrm.cpp(134):错误C2039:"classCDlg_plc":是不是"CDlg_plc"成员C:\程序文件\微软VisualStudio\myprojects\S2\dlg_plc.h(13):见申报"CDlg_plc"C:\PROGRAMFILES\的MicrosoftVisualStudio\MyProjects\S2\MainFrm.cpp(134):错误C2065:'classCDlg_plc":未声明的标识符C:\PROGRAMFILES\的MicrosoftVisualStudio\MyProjects\S2\MainFrm.cpp(135):错误C2039:'classCDlg_plc":是不是一种"CDlg_plc"C:\程序文件\微软VisualStudio\myprojects\S2\dlg_plc.h(13):见申报"CDlg_plc"C:\PROGRAMFILES\的MicrosoftVisualStudio\MyProjects\S2\MainFrm.cpp(136):错误C2039:'classCDlg_plc":是不是一种"CDlg_plc"C:\程序文件\微软VisualStudio\myprojects\S2\dlg_plc.h(13):见申报"CDlg_plc"C:\PROGRAMFILES\的MicrosoftVisualStudio\MyProjects\S2\MainFrm.cpp(137):错误C2039:"classCDlg_plc":是不是"CDlg_plc"成员C:\程序文件\微软VisualStudio\myprojects\S2\dlg_plc.h(13):见申报"CDlg_plc"C:\PROGRAMFILES\的MicrosoftVisualStudio\MyProjects\S2\MainFrm.cpp(138):错误C2039:'classCDlg_plc":是不是一种"CDlg_plc" C:\程序文件\微软VisualStudio\myprojects\S2\dlg_plc.h(13):见申报"CDlg_plc"执行cl.exe时出错。s2.exe-6错误(S),0个警告(S)可有人请帮助我,我在发言中指出的错误?thnxashwani修订于12月29日(星期三),20104:04
ashwani_gupt
评论会员:游客 时间:2011/12/06
我mistake.i我曾使用FormView的DLG类,而不是。thnx
hiddensoul
评论会员:游客 时间:2011/12/06
这是帮助我做我的exercies
StoreThick_StartThin
评论会员:游客 时间:2011/12/06
非常好,你是一个大好人
!fanliu
评论会员:游客 时间:2011/12/06
非常感谢你!它是有帮助的
。KinjalMansi
评论会员:游客 时间:2011/12/06
您好主席先生,这篇文章是非常有用的和自我解释。非常感谢您分享。的亲切问候,KinjalKanani
会员3432398
评论会员:游客 时间:2011/12/06
您好,我在VC的MFC工作。我与分配器(2,2)//2行2columsMDI文档我需要修复的分隔栏的中心位置,它不应该动产。为我所用SetRowInfo和SetColumnInfo,但couldnt帮助解决问题。一多,我可以添加Dialog类(基地CDialog的)为splitter.CreateView()函数
。kencocomputers
评论会员:游客 时间:2011/12/06
以冻结拆分窗口的位置,您将需要子类CSplitterWnd的你需要一些类变量记录是否锁定或不分配器。你可以在子类中重载鼠标事件功能,以防止移动吧。例如:无效CLockSplitter:SetLocked(BOOLbState){封锁=bState}BEGIN_MESSAGE_MAP(CLockSplitter,CSplitterWnd的)ON_WM_LBUTTONDOWN()ON_WM_SETCURSOR()ON_WM_MOUSEMOVE()END_MESSAGE_MAP()无效CLockSplitter::OnLButtonDown(UINTnFlags,口岸系统点){(封锁)的CWnd::OnLButtonDown(nFlags,点);ELSECSplitterWnd的::OnLButtonDown(nFlags,点);}BOOLCLockSplitter::OnSetCursor(的CWnd*pWnd,nHitTestUINT,UINT的消息)(封锁)返回的CWnd::OnSetCursor(pWnd,nHitTest,消息);ELSECSplitterWnd的:OnSetCursor(pWnd,nHitTest,消息)}无效CLockSplitter:的OnMouseMove(UINTnFlags,口岸系统点){(封锁)的CWnd::的OnMouseMove(nFlags,点);ELSE CSplitterWnd的::的OnMouseMove(nFlags,点);}如果有一个更难的方式做一些事情,我一定要找到它
会员3432398
评论会员:游客 时间:2011/12/06
感谢您的答复其实我也已经实施分配器修复您的代码相同。不过,我想分成4个对称窗格使用分配器(CSplitterWnd对象)(每个窗格的同一维度)的框架窗口。在这里,我作为一个窗格考虑的CView。我有上述问题的书面解决方案:-我通过以下步骤(伪代码),约得到的结果即分配器中心,但不完全是。覆盖的OnSize(){1.GetClientRect2。若(splitterCreated){SetRowInfo()//0行SetColumInfo()//0列RecalcLayout() }}如果我最小化或最大化窗口,由于OnSize,分配器得到反映。如果您有任何想法或解决方案,使分配器确切的中心位置,并设置所有的意见都相同大小,请建议我。修改,2009年6月27日,日(星期六)2:36
temp0x007
评论会员:游客 时间:2011/12/06
!真棒〜〜感谢花花公子
。Machesis
评论会员:游客 时间:2011/12/06
这是很难找到了一篇文章,介绍了如何做好这一点。本文明确和代码工作顺利。欢呼声,Machesis
Jijo拉吉
评论会员:游客 时间:2011/12/06
我是这个搜索。那么,请你告诉我怎么办"对话框中的项目,而不是的SDI?的问候,Jijo。_____________________________________________________{BR}{A}]的VisualC提示和技巧。每日更新
lookupstar
评论会员:非常感谢 时间:2011/12/06
ntimesc
评论会员:游客 时间:2011/12/06
喜...,{BR}你的文章是信息......但我只是希望修改位你可以告诉我如何在这个例子中,分割条FREEZ唯一的方式变得更聪明,通过发挥智慧对手
xtra2000
评论会员:游客 时间:2011/12/06
这真是一个好工作。冻结拆分栏的解决方案可能是:------------------------------------------------------------------------{BR}1,创建一个新的CSplitterWnd的派生类,假设类的名称是"CSplitterWndEx"。2,响应WM_LBUTTONDOWN消息和使用的CWnd::OnLButtonDown(nFlags,点),而不是CSplitterWnd的:OnLButtonDown(nFlags,点);3,作者的代码替换下面的行:CSplitterWnd的m_wndSplitter;与CSplitterWndExm_wndSplitter;修改上周日,5月30日,20103:28
count0
评论会员:游客 时间:2011/12/06
全部细节,截图很多,容易遵循。感谢
yanjing_2407
评论会员:游客 时间:2011/12/06
好,我want.Thanks。
kokosan
评论会员:游客 时间:2011/12/06
感谢你的恩情我的心一百万......imgsrc=http://www.orcode.com/upimg/2011_12_06_23_22_16_38.gif我kokosan