论CSplitterWnd分割窗口之间的通信
vc 进程间通讯
好了我们下面来写两个进程来实现它们的通信, 事先说明我写的只是关键代码并不能直接运行
发送方:
void Send(char* pSnd)
{
if (OpenClipboard())
{
HANDLE hClip;
if (!CreatePipe(&m_hRead, &m_hWrite, &sa, 0)
{
return;
}
STARTUPINFO sui;
PROCESS_INFOMATION pi; // 保存了所创建子进程的信息
BOOL CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize)
这个API函数是有用来创建匿名管道的,它返回管道的读写句柄(hReadPipe,hWritePipe), 记住lpPipeAttributes不能为NULL,因为这意味着函数的返回句柄不能被子进程所继承,你要知道匿名管道可是实现父子进程通信的阿,只有当一个子进程从其父进程中继承了匿名管道句柄后,这两个进程才可以通信,lpPipeAttributes不为NULL还远不够,LPSECURITY_ATTRIBUTES这个结构体的内容去查MSDN吧,我只告诉你其中的BOOL bInheritHandle这个成员变量要赋值为TRUE, 这样才真正实现了子进程可以从父进程中继承匿名管道.
2. 匿名管道(Pipe)
现在大多数都是基于管道通信的,因为每两个进程都可以共享一个管道来进行单独的对话,就象打电话单独占用一条线路一样,而不必担心像剪贴板一样会有串音, 匿名管道是一种只能在本地机器上实现两个进程间通信的管道,它只能用来实现一个父进程和一个子进程之间实现数据传输.其实它是非常有用的,我做过一个实际的项目就是利用匿名管道,项目就是让我写一个Ping程序来监测网络的通信状况,并且要把统计结果和执行过程显示在我们的软件里, windows有一个自带的ping程序,而且有执行过程和统计,所以我没必要再发明一个(重复发明就等于犯罪----程序员要牢记阿), 只是windows的那个Ping程序的执行结果都显示在了CMD的界面上了,我需要把它提取出来显示在我们的软件界面上,于是我就利用了匿名管道实现了这个程序, 当我们的软件要启动Ping任务时,我就先CreatePipe创建匿名管道,再CreateProcess启动了windows下面的Ping程序(它作为我们软件的子进程),当然要把管道的读写句柄一起传给子进程,这样我就可以轻松的把Ping的执行结果了写入到我的Buffer里了,是不是很easy。
滑动窗口协议书原理
滑动窗口协议书原理滑动窗口协议(Sliding Window Protocol)是一种用于数据传输的协议,其原理是通过设置一个固定大小的窗口来管理发送方和接收方之间的数据传输。
该协议主要用于解决数据传输中的流量控制和可靠性问题。
在本文中,我将详细介绍滑动窗口协议的原理。
滑动窗口协议的核心概念是窗口,它定义了发送方和接收方之间的传输范围。
窗口的大小取决于网络的带宽和延迟。
发送方在窗口范围内发送数据包,而接收方则在相应的窗口范围内确认和接收数据包。
通过动态调整窗口的大小,滑动窗口协议可以实现数据传输的流量控制,以防止网络拥塞和数据丢失。
滑动窗口协议的工作原理如下:1. 发送方将数据拆分成多个数据包,并按照顺序发送给接收方。
发送方设置一个窗口大小,即一次可以发送的数据包的数量。
2. 发送方发送窗口内的数据包,并启动一个定时器来检测数据包是否发送成功。
如果定时器超时,发送方将对应数据包重新发送。
3. 接收方按照顺序接收数据包,并发送确认消息给发送方。
确认消息包含已成功接收的数据包的序号。
4. 发送方接收到确认消息后,将窗口向前滑动,即将已经确认的数据包从窗口中删除,并发送新的数据包。
5. 如果发送方在定时器超时之前收到了确认消息,则停止定时器,并将窗口向前滑动。
6. 如果接收方在接收窗口范围内收到了重复的数据包,则忽略该数据包,并重新发送上一次确认消息。
滑动窗口协议的优点是可以提高数据传输的效率和可靠性:1. 流量控制:通过动态调整窗口的大小,滑动窗口协议可以适应网络的带宽和延迟,避免数据包的拥塞和丢失,从而提高数据传输的效率。
2. 自动重传:发送方通过定时器来检测数据包的丢失,并及时重发未确认的数据包,确保数据的可靠传输。
3. 确认机制:接收方发送确认消息给发送方,告知已成功接收的数据包的序号,以保证数据传输的正确性。
然而,滑动窗口协议也存在一些缺点:1. 延迟增加:由于发送方需要等待接收方发送确认消息,所以在发送端和接收端之间会增加一定的延迟,对于实时应用可能造成影响。
CSplitterWnd 分割窗口
CSplitterWnd 成员介绍及切分条的定制想具有自己风格的分割窗口,可以新建一个类,该类继承CSplitterWnd,然后设计自己的切分条风格(如锁定切分条、定制切分条的分割颜色等)。
1 分割窗体风格(Splitter Styles)CSplitterWnd类支持2种不同风格的分割窗口1.1 静态分割(static splitter)1.2 动态分割(dynamic splitter)CSplitterWnd 成员基类的成员CObject MembersCCmdTarget MembersCWnd MembersCreate 创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接。
CreateStatic 创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接。
CreateView 调用它创建一个窗格到一个切分窗口。
CSplitterWnd 调用构造一个CSplitterWnd对象。
GetColumnCount 返回当前窗格列的计数值。
GetColumnInfo 返回指定列的信息。
GetPane 返回位于指定行和列处的窗格。
GetRowCount 返回当前窗格的行列举。
GetRowInfo 返回指定行的信息。
GetScrollStyle 返回被共享的滚动条的风格。
IdFromRowCol 返回位于指定行和列处的窗格的子窗口ID 。
IsTracking 定位,如果切分条目前是正在移动的话。
IsChildPane 调用确定这个窗口是否是目前切分窗口的一个子窗格。
RecalcLayout 在校准行和列尺寸之后重新显示切分窗口。
SetColumnInfo 调用设置指定列的信息。
SetRowInfo 调用设置指定行的信息。
SetScrollStyle 为切分窗口(分隔器窗口)的共享滚动条指定新的滚动条风格。
ActivateNext 执行Next Pane或Previous Pane命令。
黑马程序员C语言教程:MFC界面分屏操作
MFC 界面分屏操作
近期陆续有学员问到在MFC编程中怎样做到界面分屏,看到很多学员在这里很有疑惑,我在这里将MFC分屏操作流程向大家分享一下,希望能帮助到大家~
在开发MFC应用程序的时候,我们经常看到其他C/S 软件的界面格局是这样的
那么,他们怎么做到的呢?我们可以使用界面窗体融合
首先,我们先创建一个单文档视图的MFC项目,点击完成
在MFC 框架中,为我们提供了一个csplitterwnd 类——拆分窗口类,提供分离窗口的功能。
那么,在框架类CMainFrame中,我们要添加一个csplitterwnd 类型的成员变量,以供我们使用。
下面,我们要重写框架类CMainFrame 中的OnCreateClient 事件
在事件中,我们要进行界面切分操作,并添加如下代码,那么,问题来了,我们该怎样切分窗口?切分后的窗口该由哪个类来控制它
值得注意的是:我们在创建完视图之后,要将它原先return 的界面视图注销掉,返回我们切分后的视图界面,我们也看到在RUNTIME_CLASS 宏函数中我们的值是空的,这里就是要我们添加我们自己的MFC类
我们就需要我们自定义的窗口视图了,我们可以先创建两个类,值得注意的是:我们创建的MFC 类它的基类必须是视图类
我们创建好之后,返回到我们的框架类CMainFrame中,并找到我们刚刚重写的OnCreateClient函数,将我们新建的视图类添加至RUNTIME_CLASS 宏函数的参数内
发现还是报错,为什么呢?加上头文件即可。
那么,分屏的效果就出来了。
MFC的窗口分割实例以及CSplitterWnd类
3 分割窗口ቤተ መጻሕፍቲ ባይዱ
如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基 于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文 本框及发送、清除按钮,发送按钮用来向右上视图传送消息。
图 1 设计样式 打开 Microsoft VC++ 6.0,通过 MFC AppWizard(exe)新建名为 SplitWnd 的单文档(SDI) 工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,故不阐述,有兴趣读者可与作者联系),由于需要三个视图窗口对应三个
视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序 添加两个 MFC 类(菜单“Insert | New Class>”),因为在右上视图用于显示文本,故其基类选 CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为 CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对 应,故应先在资源中新建对话框,对话框中的控件如图 1)。
void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,文本框对应的变量为 m_sText //通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); CWnd * pWnd = pMainFrm->m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView ->GetMsg( m_sText + "\r\n" );//CLeftTopView 成员函数,接收数据 } 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg += sMsg; // m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。
数字图像处理MFC窗口切割
【数字图像处理】二.MFC单文档分割窗口显示图片标签:数字图像处理单文档窗口分割CSplitterWnd常见图片显示应用error MSB60062014-02-12 02:02 3519人阅读评论(0) 收藏举报分类:数字图像处理(6)MFC图像知识(11)本文是讲述《数字图像处理》系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程及常用图片软件讲解.一. CSplitterWnd静态分割窗口1.CSplitterWnd类基础知识(该部分引用:百度百科和麦田里的稻草人博客)CSplitterWnd类提供一个分离器窗口的功能,分隔器窗口是一个包含有多个窗格的窗口.窗格通常是应用程序特定的由CView派生的对象,但它也可以是具有适当子窗口ID的任何CWnd对象.CSplitterWnd::CreateBOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,UINT nID = AFX_IDW_PANE_FIRST);Create:创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接.参数:pParentWnd表示切分窗口的父框架窗口;nMaxRows,nMaxCols是创建切分窗口的最大列数和行数(动态创建的分割窗口的窗格数目不能超过2x2); sizeMin指出显示一个窗格所需的最小尺寸;pContext指向一个CCreateContext结构的指针(多数情况这个值可以是传递给父框架窗口的pContext); dwStyle指定窗口的风格;nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,则ID可以是AFX_IDW_PANE_FIRST).CSplitterWnd::CreateStaticBOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle = WS_CHILD | WS_VISIBLE,UINT nID = AFX_IDW_PANE_FIRST);CreateStatic:创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接.参数:pParentWnd表示切分窗口的父框架窗口;nRows行数.该值不能超过16;nCols列数.这个值必须不超过16;dwStyle指定窗口的风格;nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,则ID可以是AFX_IDW_PANE_FIRST).CSplitterWnd::CreateViewvirtual BOOL CreateView(int row,int col,CRuntimeClass* pViewClass,SIZE sizeInit,CCreateContext* pContext);CreateView:在一个分隔器窗口中创建一个窗格.参数:row指定用来放置新视的分隔器窗口行;col指定用来放置新视的分隔器窗口列(最多创建16*16窗口);pViewClass指定新视的CRuntimeClass;sizeInit指定新视的初始尺寸;pContext 指向用来创建此视的创建环境的指针(该pContext被传递给创建此分隔器窗口的父框架的重载的OnCreateClient成员函数).2.CSplitterWnd类创建静态分割窗口(1).创建MFC单文档工程应用程序,工程名称"MFCPic".(2).向CMainFrame类中添加一个公有成员变量,类型为CSplitterWnd,变量名为m_wndSplitter.在"类视图"右键"CMainFrame",选择"添加"->"添加变量".(3).利用"类向导"为CMainFrame类添加OnCreateClient事件."项目"->"类向导"如下图选择"CMainFrame"类,添加虚函数OnCreateClient.添加代码如下,同时向CMainFrame.cpp中添加#include "MFCPicView.h",向MFCPicView.h中添加#include "MFCPicDoc.h",否则会出现"XXXDoc missing ';' before '*'"错误提示:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){// TODO: 在此添加专用代码和/或调用基类CRect rect;GetClientRect(&rect); //获取客户区坐标(左上右下)if(!m_wndSplitter.CreateStatic(this,1,2))return FALSE; //创建静态分割器窗口 1行*2列if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMFCPicView),CSize(450,250),pContex t))return FALSE; //创建位置(0,0)if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMFCPicView),CSize(rect.Width()/4,r ect.Height()),pContext))return FALSE; //创建位置(0,1)SetActiveView((CMFCPicView*)m_wndSplitter.GetPane(0,0));return TRUE;//return CFrameWndEx::OnCreateClient(lpcs, pContext);}(4).可以设置RUNTIME_CLASS为自定义的类.如可以实现左边是带有按钮的窗口,右边是操作后显示的图片."项目"->"新建类"为工程添加一个新类,在Class type中选择MFC class,在对话框Name中输入"CRightView",并在Base class(基类)下拉列表中自定义设置为CEditView,同时修改第二个窗格的代码修改如下:m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CRightView),CSize(250,250),pContext))同时,向CMainFrame源文件中添加#include "RightView.h".我把该上述代码类似的嵌入至"【数字图像处理】一.MFC详解显示BMP格式图片"中运行结果如下图所示:补充两篇文章供大家及自己学习和作为在线笔记:a.单文档分割成多个窗口并设置分割线的文章/ziren235/article/details/1381652b.MFC静态分割窗口带资源的文章/guoguojune/article/details/8586750二. 闲话PS:由于在完成该程序时VS2012在编译时总是提示错误:"error MSB6006:'cl.exe' exited with code 2",code 1是汉字问题,但code 2可能是路径环境被破坏.查找到相应位置Microsoft.CppCommon.targets的代码是"<CL Condition="'%(ClCompile.PrecompiledHeader)'..."同时还提示"error LINK1158:无法运行'rc.exe'|'link.exe'|'ml.exe'".在网上查找baidu.google.msdn等都没有很好的解决方案,而且运行"vs2012\VC\bin"下的cl.exe会提示缺少dll,下载也没有用;重新修复或安装VS2012都不能修复该错误,真心无语.但是C#工程可以运行,就是MFC不能运行.它耗费了我大量时间,最后我决定放弃,准备装VC 6.0来完成MFC项目,但在安装它时又由于兼容问题,程序总是未响应,也不能安装.但是再次运行VS2012时上面的error MSB6006等问题被解决了,VS2012的MFC 又能运行了.我怀疑可能由于在安装VC 6.0时修复了其中文件环境路径问题,百思不得其解???希望该文章能够对大家有所帮助,同时如果文章中有错误或不足之处,还请大家海涵.后面讲述的"左边显示树状图片路径,右边显示图片"和"显示图片路径中的文件"可能对大家帮助更大,此篇仅是开篇.(By:Eastmount 2014-2-12 夜2点原创:/eastmount)。
mfc静态分割窗口的方法
mfc静态分割窗口的方法本文主要是对MFC中CSplitterWnd的用法做个简要介绍。
我找了很久相关资料都没有找到适合新手的相关文章。
希望本文能够帮助有着类似痛苦经历的兄弟。
背景分割窗体就是把一个窗体分割成多个面板,如图1那样,或者像是迅雷那样。
面板就是放各种控件或视图的容器。
分割窗体有两种形式,静态和动态。
今天讲的只涉及到静态的,因为动态的要复杂些。
两种形式的区别在于动态的可以收拢和展开,静态的则不能。
代码指南0、建立项目打开VS2008,新建项目,选择MFC,MFC应用程序。
图2如上图所示,设置好之后单击“完成”。
1、定义变量如图4,在MainFrm.h中添加变量CSplitterWnd splitter 和BOOL isInit。
布尔变量isInit用来管理分割窗体的状态,用来判断是否已经分割过了。
splitter是用来把窗体分割成图1那样子。
另外,在MainFrm 的构造函数中,把isInit设置为FALSE。
如图3.图3图4技巧:用惯了VC#的智能感知,很不习惯VC里面没有智能感知。
不过据我所知早在VC6里面就有个快捷键Alt+→ 来实现类似智能感知的功能,如图3中,输入is 后,同时按下Alt + →这两个键就出现了供选择变量、方法、宏等的列表,继续输入in 后,isInit就出来了。
2、分割窗体分割窗体的动作应该在主窗体创建客户区的时候执行。
在MainFrm中对OnCreateClient消息进行重写就可以达到我们的目的。
在VC2008中,单击“视图”,“类视图”,选中CMainFrm,右键,选择“属性”,如图5.图5在“属性”窗口右上选择“重写”,如图6. 就是“闪电”右边的右边那个。
图6向下拉动滚动条,找到OnCreateClient,选择<添加> OnCreateClient。
如图7.图7在新创建的函数中写代码,如图8。
图8CreateStatic函数中,参数依次是父窗口、分成几行、分成几列。
MFC静态切分窗口
3. 在 CMainFrபைடு நூலகம்me 中添加消息响应函数 这部分必须用户自己手动添加消息映射和消息响应函数。 消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND(ID_FIRST_VIEW, OnSwitchToFirst) ON_COMMAND(ID_SECOND_VIEW, OnSwitchToSecond) END_MESSAGE_MAP()
void CCmdView::OnBnClickedFirst() { // TODO: 在此添加控件通知处理程序代码 AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_FIRST_VIEW); } void CCmdView::OnBnClickedSecond() { // TODO: 在此添加控件通知处理程序代码 AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_SECOND_VIEW); }
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(TreeView1),CSize(cr.Width()/4, cr.Height()), pContext); //将第行列再分开行列 if(m_wndSplitter1.CreateStatic(&m_wndSplitter,3,1,WS_CHILD|WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 1))==NULL) return FALSE; //将ListView1类连接到第二个分栏对象的行列 m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(ListView1),CSize(3*cr.Width()/4,cr .Height()/3),pContext); //将TreeView2类连接到第二个分栏对象的行列 m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(TreeView2),CSize(3*cr.Width()/4,cr .Height()/3),pContext); //将ListView2类连接到第二个分栏对象的行列 m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(ListView2),CSize(3*cr.Width()/4,cr .Height()/3),pContext); return TRUE; // return CFrameWnd::OnCreateClient(lpcs, pContext); }
VC实现窗口的分割
VC实现窗口的分割
李月
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2004(000)004
【摘要】在VC6.0中通过使用CSplitterWnd类,CSplitterWnd看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充.当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸.虽然VC6.0支持从AppWizard 中创建分割窗口,但是自动加入的分割条总是不能让我们满意,因此通过手工增加代码来完善这个类,从而实现窗口的任意分割.
【总页数】5页(P58-62)
【作者】李月
【作者单位】无
【正文语种】中文
【中图分类】TP31
【相关文献】
1.在分割窗口中创建TabView的实现方法 [J], 魏云华
2.利用OWL实现多文档界面(MDI)及窗口分割,窗口滚动 [J], 于游波
3.VC5的窗口静态分割 [J], 李刚
4.用VC编写定时报警程序——兼谈VC下顶级窗口实现 [J], 郭晶;周激流;曾志
5.基于VC的单文档窗口分割 [J], 曹霆
因版权原因,仅展示原文概要,查看原文内容请购买。
CSplitterWnd
csplitterwnd:在对话框(CDialog)中使用分割窗(CSplitterWnd)疯狂代码 / ĵ:http://DotNet/Article25520.html可以使用以下 3个步骤在对话框中创建分割窗:1. In the _disibledevent=> -1;// Initialize a context for the view. CMyTreeView is my view and// is d as : CMyTreeView : public CTreeView.CCreateContext ccc;ccc.m_pNewViewClass = RUNTIME_CLASS(CMyTreeView);ccc.m_pCurrentDoc = NULL;ccc.m_pNewDocTemplate = NULL;ccc.m_pLastView = NULL;ccc.m_pCurrentFrame = NULL;// Because the CFrameWnd needs a window , we will create// a _disibledevent=>CS_HREDRAW,::LoadCursor(NULL, IDC_ARROW),(HBRUSH) ::GetStockObject(WHITE_BRUSH),::LoadIcon(NULL, IDI_APPLICATION));// Create the frame window with "this" as the parentm_pMyFrame = CFrameWnd;m_pMyFrame->Create(strMyClass,"", WS_CHILD,CRect(0,0,1,1), this);m_pMyFrame->ShowWindow(SW_SHOW);m_pMyFrame->MoveWindow(0,0,300,300);// and finally, create the splitter with the frame as// the parentm_wndSplitter.CreateStatic(pMyFrame,1, 2);m_wndSplitter.CreateView(0,0, RUNTIME_CLASS(CMyTreeView),CSize(100,100), &ccc);m_wndSplitter.CreateView(0,1, RUNTIME_CLASS(CMyTreeView), CSize(100,100), &ccc);}BOOL CMyDialog::OnInitDialog{CDialog::OnInitDialog;CRect rect;// Get the rectangle of the custom window. The custom window // is just a a big button that is not visible and is disabled.// It's a trick to not use coordinates directly.GetDlgItem(IDC_CUTSOM_WINDOW)->GetWindowRect(&rect);// Move the splitterScreenToClient(&rect);m_pFrameWnd->MoveWindow(&rect);m_pFrameWnd->ShowWindow(SW_SHOW);m_wndSplitter.MoveWindow(0,0, rect.Width, rect.Height);m_wndSplitter.ShowWindow(SW_SHOW);TRUE; // TRUE unless you the focus to a// control// EXCEPTION: OCX Property Pages should// FALSE} 2009-2-12 4:21:13疯狂代码 /。
c语言mfc的两个界面间的通信
c语言mfc的两个界面间的通信在 C 语言 MFC 中实现两个界面间的通信,通常可以使用消息映射机制或窗口句柄来进行通信。
下面是一个简单的示例,演示了如何在 MFC 中实现两个界面间的通信:```cpp// 主窗口消息#define WM_MAIN_MSG WM_USER+0x01001// 子窗口消息#define WM_SUB_MSG WM_USER+0x02001// 主窗口消息处理函数afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam) {CString* strMsg = (CString*)wParam;SetDlgItemText(IDC_EDIT1, *strMsg);return 0;}// 子窗口向父窗口发送消息的处理函数afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam){CString* strMsg = (CString*)wParam;SetDlgItemText(IDC_EDIT1, *strMsg);return 0;}// 打开子窗口void CMultiWindowsDlg::OnBnClickedButton1(){if (dlg == NULL){dlg = new CMySubDialog();dlg->Create(IDD_DIALOG1, this);if (dlg == NULL)return (void)MessageBox(_T("子窗口的句柄为空!"));dlg->ShowWindow(SW_SHOWNORMAL);}}// 向子窗口发送消息void CMultiWindowsDlg::OnBnClickedButton2(){CString strEdit;GetDlgItemText(IDC_EDIT1, strEdit);if (dlg == NULL)return (void)MessageBox(_T("子窗口的句柄为空!"));dlg->SendMessage(WM_SUB_MSG, (WPARAM)&strEdit);}// 向父窗口发送消息void CMySubDialog::OnBnClickedButton1(){CString strEdit;GetDlgItemText(IDC_EDIT1, strEdit);HWND hWnd = this->GetParent()->GetSafeHwnd();if (hWnd == NULL)return (void)MessageBox(_T("获得父窗口句柄失败!"));::SendNotifyMessage(hWnd, WM_MAIN_MSG, (WPARAM)&strEdit, NULL);}```上述代码中,通过在主窗口中声明一个消息`WM_MAIN_MSG`,并在子窗口中声明一个消息`WM_SUB_MSG`,实现了两个窗口之间的通信。
程序编辑器中的多窗口和分屏功能介绍
程序编辑器中的多窗口和分屏功能介绍现如今,计算机技术的快速发展使得程序编辑器的功能日益强大。
在编写代码或进行文本编辑时,我们常常需要同时查看或编辑多个文件,并分割屏幕以便更高效地完成工作。
因此,多窗口和分屏功能成为了现代程序编辑器的重要特性之一。
本文将介绍程序编辑器中的多窗口和分屏功能,并探讨其在开发过程中的应用。
一、多窗口功能多窗口功能指的是在程序编辑器中同时打开多个文件,并以独立的窗口形式展示。
多窗口功能使程序员能够方便地在不同文件之间切换,实现灵活高效的编码体验。
程序编辑器中的多窗口功能提供了诸多便捷操作,例如拖拽文件、快捷键切换、标签页功能等。
通过拖拽文件,我们可以直接将文件拖入程序编辑器,并自动打开为新窗口。
这样可以快速地从文件资源管理器中选取需要编辑的文件,并在独立的窗口中进行操作。
而使用快捷键切换则可以方便地在已打开的文件之间进行切换,提高了切换效率。
此外,许多程序编辑器还提供了标签页功能,可以将多个文件以标签页的形式呈现,通过点击标签页进行切换。
这使得多窗口的管理更加便利。
多窗口功能在开发过程中的应用非常广泛。
比如,当我们在开发一个网站时,通常会同时编辑多个文件,如HTML文件、CSS文件、JavaScript文件等。
借助多窗口功能,我们可以同时打开这些文件,并在它们之间自由切换,提高开发效率。
此外,多窗口功能还适用于查看或比较两个文件的内容,以及在不同文件之间复制和粘贴代码段等操作。
二、分屏功能分屏功能是程序编辑器中常见的另一种实用工具,它允许我们将编辑器窗口分割成多个区域,每个区域显示不同的文件或不同部分的同一文件。
分屏功能的出现,使得程序员可以同时查看或编辑多个文件,从而提高工作效率。
在许多程序编辑器中,分屏功能通常通过快捷键或菜单项来实现。
我们可以选择水平分割还是垂直分割屏幕,根据需要选择适当的布局。
使用分屏功能后,我们可以在一个窗口中编辑代码,并在其他窗口中查看相关文档,或者在不同窗口之间拷贝代码片段,以及进行代码对比等操作。
mfc 中父与子界面postmessage用法
mfc 中父与子界面postmessage用法在MFC中,父窗口和子窗口之间的通信可以通过发送和接收消息来实现。
以下是一个简单的示例,展示了如何在父窗口和子窗口之间使用PostMessage函数进行通信:1. 首先,在子窗口类中重写`OnCreate`函数,并在其中调用`CWnd::Create`函数创建子窗口。
同时,为子窗口设置一个唯一的消息ID,例如`WM_CHILD_MESSAGE`。
```cppclass CChildWindow : public CWnd{public:CChildWindow(){m_hWnd = Create(NULL, TEXT("Child Window"), WS_OVERLAPPEDWINDOW, CRect(0, 0, 200, 200));if (m_hWnd == NULL)return;// 设置子窗口的消息处理函数SetWindowLong(m_hWnd, GWL_WNDPROC, (LONG)&CChildWindow::ChildProc);}protected:afx_msg void OnCreate(LPCREATESTRUCT lpCreateStruct) override{if (CWnd::OnCreate(lpCreateStruct) == -1)return;}afx_msg LRESULT ChildProc(UINT message, WPARAM wParam, LPARAM lParam) override{switch (message){case WM_CHILD_MESSAGE:// 处理子窗口发送的消息break;default:return CWnd::DefWindowProc(message, wParam, lParam);}return 0;}};```2. 然后,在父窗口类中重写`OnCreate`函数,并在其中创建一个子窗口实例。
CSplitterWnd轻松实现单文档拆分视图
CSplitterWnd轻松实现单文档拆分视图CSplitterWnd 轻松实现单文档拆分视图2009-04-16 下午 6:41该部分主要介绍一些基本概念和创建拆分视图的一般过程。
MFC支持两种类型的拆分窗口:静态的和动态的。
这里只探讨静态拆分,不过首先还是要熟悉一下这些概念。
静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。
但是用户可以缩放各行各列。
一个静态拆分窗口最多可以包含16行16列。
要找一个使用了静态拆分窗口的应用程序,只要看一下windows管理器即可。
动态拆分窗口最多可以有两行两列,但它们可以相互拆分和合并。
Vc就使用了动态拆分窗口使得可以同时编辑源程序文件的两个以上不同的部分。
选择静态或动态拆分的一个准则是是否希望用户能够交互地修改拆分窗口的行列配置。
另一个决定因素是计划在拆分窗口中使用的视图种类。
在静态拆分窗口中很容易使用两个以上不同种类的视图,因为您可以在每个窗格中指定所用的视图类型。
但是在动态拆分窗口中,MFC管理着视图,除非从CsplitterWnd派生一个新类并修改拆分窗口的默认操作性能,否则拆分窗口中的所有视图使用的都是相同的视图类。
静态拆分窗口是用CsplitterWnd::CreateStatic而不是CsplitterWnd::Create创建,并且由于MFC不会自动创建静态拆分窗口中显示的视图,所以您要亲自在CreateStatic返回之后创建视图。
CsplitterWnd为此提供了名为CreateView的函数。
给框架窗口添加静态拆分视图的过程如下:给框架窗口类添加一个CsplitterWnd数据成员。
覆盖框架窗口的OnCreateClient函数,并调用CsplitterWnd::CreateStatic来创建静态拆分视图。
使用CsplitterWnd:: CreateView在每个静态拆分窗口的窗格中创建视图。
使用静态拆分窗口的一个优点是由于您自己给窗格添加视图,所以可以控制放入视图的种类。
CSplitterWnd
一个“面板(pane)”,往往是应用程序自定义的从CView类派生出来的对象,但它也可以是一个有适当子窗口ID号的CWnd对象。
一个CSplitterWnd经常被嵌入到CFrameWnd或者CMDIChildWnd(多文档子窗口)的类型的父窗口中。
创建一个CSplitterWnd,执行以下几步:1.在父窗口的类中添加一个CSplitterWnd的成员变量。
2.重写父窗口的CFrameWnd::OnCreateClient方法。
3.在重写的OnCreateClient中,调用CSplitterWnd变量的Create或者CreateStatic方法。
4.调用CreateView方法来创建每个面板。
其中需要用到被创建类的CRuntimeClass对象,这个就要求这个对象具有DECLEAR_DYNCREATE和IMPLEMENT_DYNCREATE宏,才能使该类有动态创建的属性。
5.最重要的,将OnCreateClient中的最后一句return CFrameWnd::OnCreateClient(lpcs,pContext);注释掉,否则无法显示生成的分割窗口。
6.最好将所有CreateView的结果相与,作为CFrameWnd的结果返回。
对于可以判断结果的方法,最好都对其做判断,这样可以保证程序的正确性,也可以保证错误的及时发现。
调用CSplitterWnd的Create方法,来创建一个动态分割的窗口。
所谓动态分割的窗口,即创建大量独立的面板(pane),或者视图(同属一个文档)。
MFC框架会自动为分割窗口创建一个初始面板。
然后根据用户对CSplitterWnd变量或控件的操作,程序框架会创建,重置大小,以及清除面板。
最大数量为2*2。
调用Create方法是,你需要给出一定的参数。
包括最小的行高和列宽(决定了面板的大小)。
Create之后,你可以通过调用SetColumnInfo和SetRowInfo方法来调整最小行高和列宽。
【免费下载】C# 窗体间调用通信方法总结C#
按钮按下,需要修改 Form1 中 ListBox 中相应列的值,因此可以考虑同时将 Form1 中的 ListBox 控件当 参数也传入 Form2,所有修改工作都在 Form2 中完成,根据这个思路,Form2 代码如下: public { private string text; private ListBox lb; private int index;
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
论CSplitterWnd分割窗口之间的通信张永良,黄欢,田会丽,邓迎宾昆明理工大学信息工程与自动化学院,昆明(650051)E-mail:zyl_km@摘要:本文讨论了CSplitterWnd 分割窗口之间的通信,以及在多线程系统中的通信,解决了在各种应用环境中的分割窗口之间的通信问题。
关键词:CSplitterWnd,VC++,分割窗口,通信中图分类号:TP311.520 引言目前,基于窗口分割的应用开发十分流行,如我们在广泛使用的讯雷或者网际快车等工具,他们都拥有复杂的窗口界面,在这些界面中窗口被分割为若干的区域,每一区域都为用户显示不同的内容,这样的开发技术是很值得大家借鉴的。
它对我们开发友好的人性化的用户界面是必须而且很重要的,它甚至影响到我们整个软件开发项目成功与否。
窗口分割技术是在同一个框架窗口下同时显示多个窗口的一项技术。
运用分割窗口,可以在较短时间内展示给用户更多的信息量,方便了用户的操作性,从而使得用户界面[1]更加的友好,增强了软件的可使用性和可操作性。
MFC[2]提供的CSplitterWnd[2]类,它的功能可将窗口分割成多个可滚动的帧,帧之间的边界称为分割条,可用分割条来调整每个帧的相对大小。
对Window来说,CSplitterWnd对象是一个真正的窗口,它完全占据了框架窗口的客户区域,而视窗口则占据了切分窗口的窗片区域。
切分窗口并不参与命令传递机制,(窗片中)活动的视窗从逻辑上来看直接被连到了它的框架窗口中。
经CSplitterWnd分割的每个窗口都被相同的或者不同的视图所填充,且在实际应用中我们不仅要分割出所需要的窗口,而且往往还需要能在各种复杂环境下实现各窗口之间的自由通信,然而这种窗口之间的自由通信往往不能迎刃而解,是我们的程序开发陷入困境,因此,本文针对这种情况,讨论了使用CSplitterWnd类来分割的窗口与窗口之间怎样实现其畅通无阻的自由通信方法。
1 关于CSplitterWnd类在Microsoft VC++6.0中的CSplitterWnd类是一种特殊的框架窗口,它分割的每个窗口都被相同的或者不同的视图所填充。
当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。
CSplitterWnd的构造函数主要包括下面三个:BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORDdwStyle,UINT nID);功能描述:该函数用来创建动态切分窗口。
参数含义:pParentWnd 切分窗口的父框架窗口; nMaxRows,nMaxCols是创建的最大的列数和行数; sizeMin是窗格的现实大小; pContext 大多数情况下传给父窗口。
nID是字窗口的ID号。
BOOL CreateStatic(CWnd* pParentWnd,intnRows,int nCols,DWORD dwStyle,UINTnID)功能描述:用来创建切分窗口。
参数含义同上。
BOOL CreateView (int row,intcol,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);功能描述:为静态切分的窗口的网格填充视图。
在将视图于切分窗口联系在一起的时候必须先将切分窗口创建好。
参数含义同上。
2 创建分割窗口2.1 创建动态分割窗口切分窗口的创建方法可以分为动态和静态两种创建方法。
动态分割窗口使用Create方法来创建。
下面的代码将创建2x2的窗格。
CSplitterWnd m_wndSplitter;m_wndSplitter.Create(this,2,2,CSize(100,100),NULL) ;但是动态创建的分割窗口的窗格数目不能超过2x2,而且对于所有的窗格,都必须共享同一个视图,所受的限制也比较多,因此本文不将动态创建作为讨论重点,主要精力放在静态分割窗口的创建上。
2.2 创建静态分割窗口与动态创建窗口方法相比,静态创建方法可以最多创建16x16的窗格。
不同的窗格可以使用CreateView填充不同的视图。
下面的代码将创建静态分割窗口://创建一个静态分割窗口,分为2行1列if(m_wndSplitter.CreateStatic(this,2,1)==NULL)return -1;//将第1行0列再分开1行2列if(m_wndSplitter1.CreateStatic(&m_wndSplitter,1,2,WS_CHIL D|WS_VISIBLE,m_wndSplitter.IdFromRowCol(1, 0))==NULL) return -1;//将第0行1列再分开2行1列if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHIL D|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0, 1))==NULL) return -1;//将CTopView连接到0行0列m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTopView) ,CSize(0,115),NULL);//将CUserListView连接到0行0列m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CUserList View),CSize(200,0),NULL);//将CDisplayMsgView连接到0行0列m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CDisplay MsgView),CSize(0,420),NULL);//将CControlView连接到1行0列m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CControlV iew),CSize(0,0),NULL);创建分割窗口效果如下图1所示:图1 用CSplitterWnd创建分割窗口3分割窗口的通信3.1 有文档相连的视图之间的通信由于跟文档类[3]相连的视图类[3]不能完全的与(除文档类之外的)其余的视图类通信。
因此只能让它们都与相应得文档类通信。
在文档的OnOpenDocument()函数中设置相应的指针以获得各个视图。
代码如下:CTopView* pTopView;CUserListView* pUserListView;CDisplayMsgView* pDisplayMsgView;CControlView* pControlView;CView* pView;POSITION pos;while(pos!=NULL){pView=GetNextView(pos);if(pView->IsKindOf(RUNTIME_CLASS(pTopView))!= NULL) pTopView=(CTopView*)pView;elseif(pView->IsKindOf(RUNTIME_CLASS(CUserListView))!=N ULL) pUserListView=(CUserListView*)pView;elseif(pView->IsKindOf(RUNTIME_CLASS(CDisplayMsgView))! =NULL)pDisplayMsgView=(CDisplayMsgView*)pView;elseif(pView->IsKindOf(RUNTIME_CLASS(CControlView))!=NU LL)pControlView=(CControlView*)pView;}这样在文档类中就获得了跟它相连的所有的视图的指针,通过所获得的视图指针就能方便地使各分割窗口所填充的视图之间自由通信了。
3.2 无文档视图与文档关联视图之间的通信如图1中所示,现在假设CTopView不与文档相关联的,CUserListView与文档相关联,那么此时又怎样来实现CTopView与CUserListView之间的通信呢?我们知道由于CUserListView只能安全的与关联的文档CUserListDoc通信,因此,CTopView如果需要跟CUserListView之间通信,也必须借助于文档类。
为此需要在CTopView中获得文档CUserListDoc的指针,在此可以通过主窗口类MainFrame来获得程序的任意窗口类的指针。
代码实现如下://在CTopView获得主窗口指针CMainFrame*MainFrame=(CMainFrame*)this->GetParent()->GetParent(); CUserListDoc*pDoc=(CUserListDoc*)MainFrame->GetActiveDocument();if(pDoc!=NULL) pDoc->Test();CUserListDoc中的相应的处理函数Test()代码如下:CUserListView* pUserListView;POSITION pos;CView* pView;while(pos!=NULL) {pView=GetNextView(pos);if(pView->IsKindOf(RUNTIME_CLASS(CUserListView ))!=NULL)pUserListView=(CUserListView*)pView;}pUserListView->Test();3.3 无文档关联视图之间的通信如图1中所示,现在假设CTopView和CUserListView都不与文档相关联的,那么此时又怎样来实现CTopView与CUserListView之间的通信呢?此时我们可以通过主窗口类MainFrame来获得程序的任意窗口类的指针,这样就很方便的实现它们之间的自由通信。
下面的代码给出在CTopView中访问CUserListView中的方法Test()。
代码如下:CMainFrame*MainFrame=(CMainFrame*)this->GetParent()->GetParent(); CUserListView*pUserListView=(CUserListView*)MainFrame->m_wndSplitter1 .GetPane(0,0);pUserListView->Test();3.4 基于多线程的通信根据上面的分析结果,只要能够获得应用程序主窗口类MainFrame,那么就可以通过主窗口类MainFrame来获得应用程序中任意窗口类的指针,以实现其窗口之间的自由通信。