⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用mfc创建通用窗体分割框架-开发者网络-vc-天极yesky.htm

📁 窗体分割文档
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0037)http://www.yesky.com/87/1824087.shtml -->
<HTML lang=zh-CN xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky</TITLE>
<META content=用MFC创建通用窗体分割框架, name=description>
<META content=用MFC创建通用窗体分割框架, name=keywords>
<META content="天极Yesky | 全球中文IT第一门户" name=author>
<META content="天极Yesky | 全球中文IT第一门户" name=Copyright>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=zh-CN><LINK media=all 
href="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/y_mobile_content.css" type=text/css 
rel=stylesheet>
<SCRIPT src="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/showlay.js"></SCRIPT>

<META content="MSHTML 6.00.2900.3157" name=GENERATOR></HEAD>
<BODY><!--页面头部--><!--头部-->
<DIV id=topmenu><A href="http://www.yesky.com/">Yesky首页</A>| <A 
href="http://product.yesky.com/">产品报价</A>| <A 
href="http://cseek.yesky.com/">行情</A>| <A href="http://mobile.yesky.com/">手机</A> 
| <A href="http://digital.yesky.com/">数码</A> | <A 
href="http://notebook.yesky.com/">笔记本</A> | <A 
href="http://pc.yesky.com/">台式机</A> | <A href="http://diy.yesky.com/">DIY硬件</A> 
| <A href="http://oa.yesky.com/">外设</A> | <A href="http://net.yesky.com/">网络</A> 
| <A href="http://dh.yesky.com/">数字家庭</A> | <A 
href="http://lab.yesky.com/">评测</A> | <A href="http://soft.yesky.com/">软件</A> | 
<A href="http://e.yesky.com/">e时代</A> | <A href="http://game.yesky.com/">游戏</A> 
| <A href="http://pic.yesky.com/">图片</A> | <A 
href="http://desktop.yesky.com/">壁纸</A> | <A href="http://q.yesky.com/">群乐</A> | 
<A href="http://my.yesky.com/">社区</A> | <A href="http://blog.yesky.com/">博客</A> 
| <A href="http://www.mydown.com/">下载</A></DIV>
<DIV id=topbox>
<DIV class=tleft><A href="http://www.yesky.com/"><IMG alt=天极Yesky_全球中文IT第一门户 
src="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/logo.gif" border=0></A></DIV>
<DIV class=tad><SPAN id=ad1></SPAN></DIV>
<DIV id=search>
<DIV>
<FORM name=searchform action=http://search.chinabyte.com/search method=get 
target=_blank><INPUT id=searchzz onmouseover=this.focus() onfocus=this.select() 
name=q><INPUT type=hidden value=GB2312 name=encoding><INPUT type=hidden 
value=connect name=dir><INPUT type=hidden value=20002 name=cid><INPUT id=search_btn type=submit value=天极搜索> </FORM></DIV>
<DIV class=tdq>
<DIV class=rightarea><A href="http://bj.yesky.com/">北京</A> <A 
href="http://hd.yesky.com/">上海</A> <A href="http://gd.yesky.com/">广东</A> <A 
href="http://xa.yesky.com/">西安</A><BR><A href="http://cq.yesky.com/">重庆</A> <A 
href="http://cd.yesky.com/">成都</A> <A href="http://sy.yesky.com/">沈阳</A> <A 
href="http://js.yesky.com/">江苏</A> </DIV>
<DIV class=rightarea_right><A 
href="http://my.yesky.com/">用户<BR>登录</A></DIV></DIV></DIV>
<DIV class=tright>
<DIV class=box1>
<SCRIPT src="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/content_text_ad.js" 
type=text/javascript></SCRIPT>
</DIV></DIV></DIV>
<SCRIPT src="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/flash.js" 
type=text/javascript></SCRIPT>
<!--导航条-->
<DIV id=location>
<DIV class=loleft>您现在的位置: <A href="http://www.yesky.com/">天极Yesky</A> &gt; <A 
href="http://soft.yesky.com/">软件频道</A> &gt; <A 
href="http://dev.yesky.com/">开发者网络</A> &gt; 用MFC创建通用窗体分割框架</DIV>
<DIV class=adright><SPAN id=ad2></SPAN></DIV></DIV><!--内容块开始-->
<DIV id=conbox><!--左边开始-->
<DIV id=conleft>
<DIV id=contopla1>
<DIV id=__001>
<DIV class=qkong></DIV>
<DIV class=qw1>全文</DIV>
<DIV class=zkong>
<DIV class=kl></DIV>
<DIV class=bj><A href="http://www.yesky.com/87/1824087.shtml#pls" 
target=_self>评论</A></DIV>
<DIV class=kr></DIV>
<SCRIPT type=text/javascript>
var titiepic ="#";
if (titiepic!="#")
{
document.write("<div class=\"kl\"></div><div class=\"bj\"><a href=\"#\" target=\"_blank\">图片</a></div><div class=\"kr\"></div>");
}
</SCRIPT>
</DIV></DIV></DIV>
<DIV class=topadbg><SPAN id=ad10></SPAN></DIV><A name=top></A>
<DIV id=contitle>
<H1>用MFC创建通用窗体分割框架</H1></DIV>
<DIV id=conauthor><SPAN>2004-06-24 17:30 </SPAN><SPAN>作者: 冯杰 </SPAN><SPAN>出处: 
天极软件频道 </SPAN><SPAN>责任编辑:<A title=向本编辑提问 
href="http://comments.yesky.com/t/·&frac12;&Ouml;&Ucirc;/6,324/1824087.shtml" target=_blank>方舟</A> 
</SPAN></DIV>
<DIV class=topadbg><SPAN id=ad9></SPAN></DIV>
<DIV id=conneirong><SPAN id=ad3></SPAN>
<DIV class=guanggao><SPAN 
id=contentAdv></SPAN></DIV>  目前基于分割视图的应用开发十分流行,分割视图技术是在同一个框架窗口下同时显示多个视图的一项技术。运用分割视图,可以在较短时间内给用户更多的信息量,从而使得用户界面更加的友好,增强了软件的可操作性。本文提出一个分割视图的通用创建框架。<BR><BR><IFRAME 
align=right marginWidth=0 marginHeight=0 
src="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/dell-240200.htm" frameBorder=0 
width=360 scrolling=no 
height=300></IFRAME>  1.分割视图创建框架<BR><BR>  分割视图的创建大体上分为两个步骤:其一是创建分割窗体;然后就是处理鼠标和键盘等消息。<BR><BR>   
创建分割窗体<BR><BR>  MFC提供分割窗体类CsplitterWnd,它提供了很多对于分割窗体操作的成员函数,每一个分割窗体都是一个CsplitterWnd的对象。本文提出的框架由于需要对定制的分割窗体进行扩充处理,所以首先从CsplitterWnd继承一个子类CFixSplitterWnd,然后每个分割窗体是一个CfixSplitterWnd的对象,这样以后只需要对CfixSplitterWnd进行改写后就可以增强分割窗体的功能。(后面将提出这种改写)<BR>创建分割窗体最重要的函数是主框架类的OnCreateClient函数,它将在主框架创建的时候调用,本文将创建一个如下显示的分割窗体: 
<BR><BR><IMG onerror="this.src='http://www.yesky.com/image20010518/143977.gif';" 
hspace=3 src="用MFC创建通用窗体分割框架-开发者网络-VC-天极Yesky.files/143977.gif" align=center 
vspace=1 border=1><BR><BR>  则可以如下实现:<BR><BR>
<TABLE borderColor=#ffcc66 cellSpacing=0 width="90%" align=center 
bgColor=#eefffe border=1>
  <TBODY>
  <TR>
    <TD>//成员变量声明<BR>CFixSplitterWnd m_wndSplitterH; 
      //用于横向切割<BR>CFixSplitterWnd m_wndSplitterV; //用于纵向切割<BR>BOOL 
      m_bCreateSplitter;<BR><BR>//分割窗体的实现<BR>BOOL 
      CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
      <BR>{<BR> //对整个主框架进行混合分割视图<BR> BOOL 
      bResult=m_wndSplitterV.CreateStatic(this,1,2);<BR> ASSERT(bResult);<BR> m_wndSplitterH.CreateStatic(&amp;m_wndSplitterV,4,1,WS_CHILD 
      | 
      WS_VISIBLE,m_wndSplitterV.IdFromRowCol(0,1));<BR> //创建各自子窗片的对应的视图<BR> m_wndSplitterV.CreateView(0,0,RUNTIME_CLASS(CSceneView),CSize(600,600),pContext);<BR> m_wndSplitterH.CreateView(0,0,RUNTIME_CLASS(CPitchView),CSize(100,100),pContext);<BR> m_wndSplitterH.CreateView(1,0,RUNTIME_CLASS(CYawView),CSize(100,100),pContext);<BR> m_wndSplitterH.CreateView(2,0,RUNTIME_CLASS(CRollView),CSize(100,100),pContext);<BR> m_wndSplitterH.CreateView(3,0,RUNTIME_CLASS(CControlView),CSize(100,100),pContext);<BR> //设置窗格的初始化的大小<BR> m_wndSplitterV.SetRowInfo(0,IDEAL_RAWHEIGHT,0);<BR> m_bCreateSplitter=TRUE;<BR> //激活sceneview使得其可以接受命令消息<BR> m_wndSplitterV.SetActivePane(0,0,NULL);<BR> return 
      bResult; <BR>}<BR>//主框架窗体大小发生变化,调节相应的窗体大小<BR>void CMainFrame::OnSize(UINT 
      nType, int cx, int cy) <BR>{<BR> CMDIFrameWnd::OnSize(nType, cx, cy); 
      <BR> CRect rect;<BR> GetClientRect(rect);<BR> if 
      (m_bCreateSplitter)<BR> {<BR>  m_wndSplitterV.SetColumnInfo(0,rect.Width() 
      *3/4,10);<BR>  m_wndSplitterV.SetColumnInfo(1,rect.Width() 
      *1/4,10);<BR>  m_wndSplitterH.SetRowInfo(0,rect.Height() 
      /6,10);<BR>  m_wndSplitterH.SetRowInfo(1,rect.Height() 
      /6,10);<BR>  m_wndSplitterH.SetRowInfo(2,rect.Height() 
      /6,10);<BR>  m_wndSplitterH.SetRowInfo(3,rect.Height()/2,10);<BR> }<BR> m_wndSplitterV.RecalcLayout();<BR> m_wndSplitterH.RecalcLayout(); 
      <BR>}</TD></TR></TBODY></TABLE><BR>  注意:m_wndSplitterH.CreateView 
中的第二个参数,这个参数将分割窗体和相应的视图类相对应。<BR><BR>  通过上述的程序代码即可创建图1所示的分割窗体,那么由于这里每个分割窗体都是一个CfixSplitterWnd对象,所以可以通过改写CfixSplitterWnd类的虚函数或消息处理函数来完成自己特定的应用实现。(注意,如果需要对定制有特定属性的分割窗体,一定要派生自己的分割窗体类而不能是MFC的CsplitterWnd类)这里我们需要分割窗体不能随鼠标拖动而改变其大小,即所有窗格的大小都是一定的,不能在运行时刻改变。所以必须在CfixSplitterWnd类的实现中加入如下代码:<BR><BR>
<TABLE borderColor=#ffcc66 cellSpacing=0 width="90%" align=center 
bgColor=#eefffe border=1>
  <TBODY>
  <TR>
    <TD>void CFixSplitterWnd::OnMouseMove(UINT nFlags, CPoint point) 
      <BR>{<BR> CWnd::OnMouseMove(nFlags, point); //防止鼠标出现拖动状<BR> // 
      CSplitterWnd::OnMouseMove(nFlags, point); 
  //鼠标会在窗体边界出现拖动状<BR>}</TD></TR></TBODY></TABLE><BR>  至此,分割窗体已经创建完毕,下面需要在分割窗体里处理消息。<BR><BR>   
分割窗体处理消息<BR><BR>  在分割窗体里处理消息和一般的文档视图模型处理消息大致一样,但它也有其特殊之处。具体来说,由于各个分割窗体已经与具体的视图类相联系了,所以在需要处理各个分割窗体中的消息时,可以直接到相应的视图类中进行处理;另外,多视图之间的切换会导致目标焦点之间的变更,这样会影响菜单中与视图有关的命令的执行。比如在图1中所示的分割窗体中,有一个“开始”命令必须是焦点在CsceneView视图上时才能执行,否则就应该让该命令不能执行(即该菜单呈现灰色),则实现时可以首先对鼠标进行点击测试,判断是否在CsceneView视图范围内,如果是的话就允许执行,否则就不允许执行。<BR><BR>  2.结论<BR><BR>  通过本文提出的分割视图创建框架,可以满足对视图进行复杂控制的需求,希望本文可以给大家一个启发,从而能够创建更为完美的分割视图应用程序。<BR><BR>
<SCRIPT>zmbbs=1;</SCRIPT>
</DIV><!--广告代码开始-->
<SCRIPT>
var ad_cid;
if (window.location.search.substring(1) != "")
{
ad_cid = window.location.search.substring(1);
} else {
ad_cid = 412;
}
</SCRIPT>
<!--小通栏:c-scolumn顶部500*90--><SPAN id=span_ad1>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-scolumn.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad1").innerHTML=document.getElementById("span_ad1").innerHTML;
document.getElementById("span_ad1").innerHTML="";
</SCRIPT>
<!--c-pip文章正文中间240*200--><SPAN id=span_ad3>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-pip.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT>
if(document.getElementById("contentAdv")) {
document.getElementById("contentAdv").innerHTML=document.getElementById("span_ad3").innerHTML;
document.getElementById("span_ad3").innerHTML="";
} else {
document.getElementById("ad3").innerHTML=document.getElementById("span_ad3").innerHTML;
document.getElementById("span_ad3").innerHTML="";
}</SCRIPT>
<!--c-text-1“您现在的位置”右侧文字--><SPAN id=span_ad2>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-text-1.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad2").innerHTML=document.getElementById("span_ad2").innerHTML;
document.getElementById("span_ad2").innerHTML="";
</SCRIPT>
<!--c-column-2“标题”上面的广告--><SPAN id=span_ad10>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-column-2.js\"><\/script>");</SCRIPT>
</SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad10").innerHTML=document.getElementById("span_ad10").innerHTML;
document.getElementById("span_ad10").innerHTML="";
</SCRIPT>
<!--c-column-1“摘要”下面的广告--><SPAN id=span_ad9>
<DIV id=ad9ad>
<SCRIPT language=JavaScript>
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-column-1.js\"><\/script>");</SCRIPT>
</DIV></SPAN>
<SCRIPT language=JavaScript>
document.getElementById("ad9").innerHTML=document.getElementById("span_ad9").innerHTML;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -