当前位置:职场发展 > vs2010中有两种窗体_VS2010 MFC中窗口分割的实现

vs2010中有两种窗体_VS2010 MFC中窗口分割的实现

  • 发布:2023-10-01 08:46

使用VS2010创建windows窗体应用程序。在右侧已安装的模板中,选择Visual C#,右侧会显示各种项目类型。这里的第一项是 Windows 窗体应用程序。

默认情况下会自动生成一个表单文件。该形式是主要的启动形式。程序运行时,会先运行这个窗体。如果需要修改,可以在创建项目时默认生成的Program.cs文件中进行修改。

桌面应用程序中通常有多种表单。我们可以右键单击项目名称,在“添加”选项中选择“新建项目”来添加表单。注意不要选择错误,否则会进行其他操作。

在弹出的对话框中,从左侧已安装的模板中选择“Visual C#”,然后从右侧列出的选项中选择“Windows Forms”。这里的第三项是。然后单击“添加”按钮添加新表单。您可以在文本框中更改表单的名称。

有了表单,我们可以在表单上放置各种控件。左侧工具箱中有各种控件,如按钮、文本框、复选框等,使用鼠标按住工具箱中的某个控件并将其拖到窗体中即可将控件添加到窗体中。您也可以直接双击工具箱中的控件,将控件添加到窗体中。

您可以使用鼠标拖动窗体上的控件来改变控件在窗体上的位置。当鼠标移到窗体中的控件上时,鼠标指针将变为十字形。单击并按住左键进行拖动。

右键单击​​窗体中的控件,在右键菜单中选择“属性”,右侧会出现该控件的属性设置栏。在属性设置栏中,可以设置控件的各种属性。有显示文字、颜色等

双击某个控件,会跳转到相应的代码编辑页面,编写相应的操作响应事件代码。例如,双击按钮会跳转到代码编写页面,编写响应按钮点击事件的代码。可以在这里编程各种事件。

基本控制和代码完成后,需要进行调试和运行。单击上面的调试按钮即可生成、运行和调试表单应用程序。如果没有报错,则说明编译成功,可以运行。

注释

winform程序也是从main方法开始运行的,它的main方法也在创建新项目时默认生成的Program.cs文件中

打开软件vs2010后,点击左上角“新建项目...”,会弹出一个窗口,然后

接下来,开始制作表格:

?使用相同的步骤创建以下小表单。接下来,点击第一个“显示新表单”,就会出现另一个新表单

之后,创建Form2表单

然后双击Form1中的“显示新表单”,会弹出编写代码的页面,添加代码

??第一个小表格的制作已经完成,剩下的小表格可以按照同样的步骤制作。

接下来,创建第五个小表格“错误提示”。首先双击Form1中的“错误提示”小表格,如下:

?

Windows Forms应用程序的基本使用演示已经完成。

分割窗口概述

? ? ? ?分割窗口,顾名思义,就是将一个窗口分割成多个窗格,每个窗格中都包含视图,要么是同一类型的视图,要么是不同类型的视图。

??????MFC有两种分割窗口的方式,动态分割和静态分割。

??????动态分割窗口通常用于创建对应于同一个文档的多个视图,并且这些视图一般是同一类型的视图,这可以在用户编辑文档的不同部分时提供方便。

???????如果你看看Word中的动态分割窗口你就会明白了。接受这个词吗?以2007文档为例,点击菜单中的“查看”->“分割”,可以看到一个随鼠标移动的分割条。当我们在文档中的某处按下鼠标左键时,分隔栏被固定并生成两个分隔窗格。通过滚动每个窗格中的垂直滚动条可以看到,两个窗格中的内容是相同的,这是同一个文档对应的同一类型的视图。

??????动态分割窗口最多可以有两行和两列。

??????静态分割窗口更常见。我们经常看到某个软件打开后,界面窗口默认分为几个窗格。这是一个静态分割窗口。

??????静态分割窗口是指在创建窗口时就已经生成了分割窗格,用户无法更改窗格的数量和顺序。静态分割窗口最多支持16行16列。通常静态分割窗口的每个窗格都包含不同类型的视图,当然也可以是相同类型的视图。

?

CSplitterWnd 类

?

??????MFC-CSplitterWnd 类中的分割窗口类提供了分割窗口的功能。 CSplitterWnd 类包含一个分割窗口,它是一个包含多个窗格的窗口。我们在分割窗口的时候,直接在这个分割器窗口中进行分割。

以下是最常用的三个成员函数:

?

虚拟?BOOL?创建(??

???CWnd*?pParentWnd, ??

???int?nMaxRows, ??

???int?nMaxCols, ??

???尺寸?最小尺寸,??

???CCreateContext*?pContext, ??

???DWORD?dwStyle?=?WS_CHILD?|?WS_VISIBLE?|?WS_HSCROLL?|?WS_VSCROLL?|?SPLS_DYNAMIC_SPLIT, ??

???UINT?nID?=?AFX_IDW_PANE_FIRST? ??

);??

?

?

? ? ?创建动态分割窗口。参数pParentWnd是分割窗口的父框架窗口;参数nMaxRows是分割器窗口中的最大行数,不能超过2;参数nMaxCols为分割窗口的最大列数,不能超过2;参数sizeMin是窗格可以显示的最小尺寸的数字,如果窗格尺寸小于sizeMin,则不会显示;参数pContext是指向CCreateContext结构体的指针,大多数情况下可以赋值给父框架窗口的pContext;参数dwStyle指定窗口样式;参数nID是分割窗口的ID,除非分割窗口嵌入到另一个分割窗口中,否则可以取值AFX_IDW_PANE_FIRST。

?

?

虚拟?BOOL?CreateStatic( ??

???CWnd*?pParentWnd, ??

???int?nRows, ??

???int?nCols, ??

???DWORD?dwStyle?=?WS_CHILD?|?WS_VISIBLE, ??

???UINT?nID?=?AFX_IDW_PANE_FIRST? ??

);??

?

? ?创建静态分割窗口。参数pParentWnd、dwStyle和nID同上;参数nRows为行数,不能超过16;参数nCols是列数,不能超过16。

?

?

虚拟?BOOL?CreateView( ??

???int?行,??

???int?col, ??

???CRuntimeClass*?pViewClass, ??

???大小?sizeInit,??

???CCreateContext*?pContext? ??

);??

?

? ? ?为静态分割窗口创建窗格视图。 row参数指定分割器窗口中放置新视图的行; col参数指定新视图放置的列; pViewClass参数指定新视图的CRuntimeClass对象; sizeInit参数指定新视图的初始大小; pContext参数是一个指向CCreateContext结构体的指针,通常可以赋给传递给父框架窗口的重载函数CFrameWnd::OnCreateClient的pContext参数值。

?

?

动态分割窗口

?

??????创建动态分割窗口的一般步骤是:

?

??????1.在父框架类中定义一个CSplitterWnd类型的成员对象。

?

??????2.重载父框架类的CFrameWnd::OnCreateClient成员函数。

?

??????3.在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的Create函数。

?

示例:我们要在主框架窗口的客户区创建一个两行两列的动态分割窗口。

? ? ?创建动态分割窗口的具体步骤如下:

?

??????1.在MainFrm.h文件中的CMainFrame类中添加一个成员对象:CSplitterWnd?m_wndSplitter;。

?

??????2.在ClassView类视图中找到CMainFrame类,右键单击,在右键菜单中选择Properties,就会显示属性页,​​然后点击属性页工具栏上的Tip 为Overrides按钮,下面列出了可以重载的函数。找到OnCreateClient生成重载函数。

?

??????3.在MainFrm.cpp文件中找到刚刚重新加载的OnCreateClient函数,修改如下:

?

BOOL?CMainFrame::OnCreateClient(LPCREATESTRUCT?lpcs,?CCreateContext*?pContext) ??

{ ??

?//?TODO:?在此处添加您的专业代码和/或调用基类??

?//?创建两行两列的动态分割窗口??

?return?m_wndSplitter.Create(this,2,?2,?CSize(100,?100),?pContext); ??

??

?//返回?CFrameWndEx::OnCreateClient(lpcs,?pContext); ??

}??

?

? ? ? 4、在Resource View资源视图中,打开Menu下的IDR_MAINFRAME菜单,在View下添加一个菜单项,将Caption设置为Splitter Window,并将ID设置为(必须设置为) ID_WINDOW_SPLIT 。这样,当在运行结果界面中单击该菜单项时,MFC就会执行一些操作来显示动态划分的窗口。

??????5.运行程序,点击菜单中的View->Splitter Window菜单项,即可看到创建动态分割窗口的效果。

?

?

静态分割窗口

?

??????创建静态分割窗口的一般步骤是:

?

??????1.在父框架类中定义一个CSplitterWnd类型的成员对象。

?

??????2.重载父框架类的CFrameWnd::OnCreateClient成员函数。

?

??????3.在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的CreateStatic成员函数,然后调用CSplitterWnd成员对象的CreateView成员函数为每个窗格创建一个视图。 ?

?

示例:在主框架窗口的客户区创建一个两行一列的静态分割窗口。

? ? ?以下是创建静态分割窗口的具体步骤:

?

??????1.在MainFrm.h文件中的CMainFrame类中添加一个成员对象:CSplitterWnd?m_wndSplitter;。

?

??????2.在ClassView类视图中找到CMainFrame类,右键单击,在右键菜单中选择Properties,就会显示属性页,​​然后点击属性页工具栏上的Tip 为Overrides按钮,下面列出了可以重载的函数。找到OnCreateClient生成重载函数。

?

??????3.在MainFrm.cpp文件中找到刚刚重载的OnCreateClient函数并修改。如果没有创建其他视图类,则可以使用CExampleView作为上下窗格的视图。为了识别 CExampleView 类,您需要将 #include?"ExampleView.h" 添加到 MainFrm.cpp 文件,并将 #include?"ExampleDoc.h" 添加到 ExampleView.h 文件。最终OnCreateClient函数修改如下:

?

BOOL?CMainFrame::OnCreateClient(LPCREATESTRUCT?lpcs,?CCreateContext*?pContext) ??

{ ??

???//?TODO:?在此处添加您的专业代码和/或调用基类??

???CRect?rc; ??

??

???//?获取框架窗口客户区的CRect对象??

???GetClientRect(&rc); ??

??

???//?创建静态分割窗口,两行一列??

???if?(!m_wndSplitter.CreateStatic(this,?2,?1)) ??

?????????返回?FALSE; ??

??

???//?在上部窗格中创建视图??

???if?(!m_wndSplitter.CreateView(0,?0,?RUNTIME_CLASS(CExampleView),?CSize(rc.Width(),?rc.Height()/2),?pContext)) ? ?

?????????返回?FALSE; ??

??

???//?在下面的窗格中创建视图??

???if?(!m_wndSplitter.CreateView(1,?0,?RUNTIME_CLASS(CExampleView),?CSize(rc.Width(),?rc.Height()/2),?pContext)) ? ?

?????????返回?FALSE; ??

??

???返回?TRUE; ??

??

??????//return?CFrameWndEx::OnCreateClient(lpcs,?pContext); ??

}??

?

? ? 4.运行程序即可看到效果。

?

?

如果要在其中一个窗格中嵌套分割窗口,则需要定义另一个CSplitterWnd对象,并使用父窗格所在的CSplitterWnd对象为父框架窗口创建分割窗口。

?

示例:创建具有三个视图的静态分割窗口:左上、左下和右。

? ? ??以下是创建静态分割窗口的具体步骤:

??????1.在MainFrm.h文件中的CMainFrame类中添加成员对象:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?受保护:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CSplitterWnd m_wndSplitter1;

? ? ? 2、在Class View类视图中找到CMainFrame类,右键单击它,在右键菜单中选择Properties,就会显示属性页,​​然后点击属性页工具栏上有提示的Overrides按钮,下面列出了可以重载的函数,找到OnCreateClient生成重载函数。

??????3.在MainFrm.cpp文件中找到刚刚重载的OnCreateClient函数并修改。这里可以先构建三个视图类:CMessageView、CInputView、CUserView。

最终OnCreateClient函数修改如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

// 创建分割窗口

if (!m_wndSplitter.CreateStatic(this, 1, 2))

返回FALSE;

if (!m_wndSplitter1.CreateStatic(

&m_wndSplitter, // 我们的父窗口是第一个分割器

2, 1, // 新的分割器为2行1列

WS_CHILD | WS_VISIBLE | WS_VISIBLE | WS_BORDER, // 样式,需要WS_BORDER

m_wndSplitter.IdFromRowCol(0, 0)

// 新拆分器位于第一个拆分器的第一行第二列

))

{

TRACE0("创建嵌套分割器失败\n");

返回FALSE;

}

if(!m_wndSplitter1.CreateView(0,0, RUNTIME_CLASS(CMessageView), CSize(100,100), pContext))

{

m_wndSplitter.DestroyWindow();

m_wndSplitter1.DestroyWindow();

返回FALSE;

}

if(!m_wndSplitter1.CreateView(1,0, RUNTIME_CLASS(CInputView), CSize(100,100), pContext))

{

m_wndSplitter.DestroyWindow();

m_wndSplitter1.DestroyWindow();

返回FALSE;

}

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

{

m_wndSplitter.DestroyWindow();

返回FALSE;

}

m_wndSplitter.SetColumnInfo(0, 450,100);

m_wndSplitter1.SetRowInfo(0, 250, 100);

返回TRUE;

}

?4.?运行程序,即可看到效果如下:

?

若想创建具有左边、右上和右下这三个视图的静态静态窗口,可以修改OnCreateClient函数如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

// TODO:在此处添加专用代码和/或调用基类

CRect rc;

//?获取框架窗口客户区的CRect对象

GetClientRect(&rc);

//创建分割窗口并将其分割成两列

if (!m_wndSplitter.CreateStatic(this, 1, 2))

返回FALSE;

//将窗口第二列分成两行

if (!m_wndSplitterRight.CreateStatic(&m_wndSplitter, 2, 1,WS_CHILD | WS_VISIBLE | WS_BORDER, m_wndSplitter.IdFromRowCol(0,1)))

返回FALSE;

//创建视图

if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CUserView), CSize(rc.Width()/4 , rc.Height()), pContext))

{

m_wndSplitter.DestroyWindow();

返回FALSE;

}

if(!m_wndSplitterRight.CreateView(0,0, RUNTIME_CLASS(CMessageView), CSize(rc.Width()*3/4, rc.Height()*4/5), pContext))

{

m_wndSplitter.DestroyWindow();

m_wndSplitterRight.DestroyWindow();

返回FALSE;

}

if(!m_wndSplitterRight.CreateView(1,0, RUNTIME_CLASS(CInputView), CSize(rc.Width()*3/4, rc.Height()/5), pContext))

{

m_wndSplitter.DestroyWindow();

m_wndSplitterRight.DestroyWindow();

返回FALSE;

}

返回TRUE;

}

?

最后一个左上右下三视图的例子费了很大的力气,一直报错。结果是?m_wndSplitterRight.CreateView(0,0,...) 这里的0,0不清楚。 。

整理在这里,希望能给遇到同样问题的朋友一些帮助~~~~~~

?

?

?

?

?

?

?

?

?

?

?

?

转载于:https://www.sychzs.cn/lxt287994374/p/3419380.html

相关文章

最新资讯