﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-为了梦的地方-随笔分类-MFC</title><link>http://www.cppblog.com/Cunch/category/16450.html</link><description>不惜奋斗</description><language>zh-cn</language><lastBuildDate>Tue, 05 Apr 2011 03:05:45 GMT</lastBuildDate><pubDate>Tue, 05 Apr 2011 03:05:45 GMT</pubDate><ttl>60</ttl><item><title>MFC（1）之——分割条的制作</title><link>http://www.cppblog.com/Cunch/archive/2011/04/05/143434.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Tue, 05 Apr 2011 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/Cunch/archive/2011/04/05/143434.html</guid><wfw:comment>http://www.cppblog.com/Cunch/comments/143434.html</wfw:comment><comments>http://www.cppblog.com/Cunch/archive/2011/04/05/143434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cunch/comments/commentRss/143434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cunch/services/trackbacks/143434.html</trackback:ping><description><![CDATA[<p>最近需要做2D游戏编译器，就学习了下MFC，那老师的话来说他就是简单粗暴， </p>
<p>说道简单，我认为不过就是使用熟练的就简单了，但是里面的原理还真不简单，最近也在看《深入浅出MFC》，作者真的很厉害，幽默的言语间就把MFC大卸八块，想想大陆的书好的真不多。</p>
<p>实现分割条，主要使用的是CSplitterWnd，这个类，如果你想让分割条不动，那么你就得重写一个类，并且继承CSplitterWnd这个类，并且重写OnLButtonDown（）的这个方法，只要你不实现这个方法，那么分割条就不会动了。知道了这个原理，那么对其它控件就是一样的了。。。 是不是很简单</p>
<p><br>如果你想利用VS手动添加一个类，让它继承CSplitterWnd这个类，那么就得说对不起，MS好像没有把所有的类都放进去，我用的VS2008，不知道VS2010是什么情况，但是也不要着急嘛， 可以想想MFC的那张继承大表，现在想想确实很大啊，有耐心的数数吧，话说现在的人都很浮躁啊，找到CSplitterWnd了吗，找到他父亲，看他父亲在MFC的VS中类生成的器中有没，没有再它父亲的父亲 找到了没？？， 这个办法是通用的，还有就是一个简单的办法，就是我们用的基本的控件，大多数都是从CWnd继承的，那么我们就直接选择CWnd了。。。</p>
<p><br>下面看下生成的结果：</p>
<p>//Splitter.h</p>
<p>#pragma once</p>
<p><br>// CSplitter</p>
<p>class CSplitter : public <span style="COLOR: red">CWnd</span><br>{<br>&nbsp;DECLARE_DYNAMIC(CSplitter)</p>
<p>public:<br>&nbsp;CSplitter();<br>&nbsp;virtual ~CSplitter();</p>
<p>protected:<br>&nbsp;DECLARE_MESSAGE_MAP()<br>};</p>
<p><br>//Splitter.cpp<br>// Splitter.cpp : 实现文件<br>//</p>
<p>#include "stdafx.h"<br>#include "2DTerrainEditor0.1.h"<br>#include "Splitter.h"</p>
<p><br>// CSplitter</p>
<p>IMPLEMENT_DYNAMIC(CSplitter, <span style="COLOR: red">CWnd</span>)</p>
<p>CSplitter::CSplitter()<br>{</p>
<p>}</p>
<p>CSplitter::~CSplitter()<br>{<br>}</p>
<p><br>BEGIN_MESSAGE_MAP(CSplitter, <span style="COLOR: red">CWnd</span>)<br>END_MESSAGE_MAP()</p>
<p>// CSplitter 消息处理程序<br><br>注意到上面的红字了没， 我们需要的是CSplitterWnd 是吧，那么就好办了吧，<br>把Cwnd换成CSplitterWnd就可以了。这样我们的这个基础类就完成了。<br>你要想分割条不动，我上面说的有。<br><br><br>下面说说：完成了那么就得谢谢MainFrame了<br><br>实现这个我们首先需要给CMainFrame添加一个成员变量（CSplitter） m_splitter<br>同时要实现 virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);方法<br><br>下面就是方法的具体描述了：<br><br></p>
<div style="BORDER-BOTTOM: 1px solid; TEXT-ALIGN: left; BORDER-LEFT: 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; COLOR: #00ccff; FONT-SIZE: 12pt; WORD-BREAK: break-all; BORDER-TOP: 1px solid; BORDER-RIGHT: 1px solid; PADDING-TOP: 4px" align=left><span style="COLOR: #000000">BOOL&nbsp;CMainFrame::OnCreateClient(LPCREATESTRUCT&nbsp;lpcs,&nbsp;CCreateContext</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pContext)<br>{<br>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;在此添加专用代码和/或调用基类</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_splitter.CreateStatic(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">))<br>&nbsp;{<br>&nbsp;&nbsp;TRACE0(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed&nbsp;to&nbsp;create&nbsp;m_splitter\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br>&nbsp;}<br><br>&nbsp;CRect&nbsp;rect;<br>&nbsp;GetClientRect(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br><br>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Left&nbsp;View</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_splitter.CreateView(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;RUNTIME_CLASS(CLeftTreeView),<br>&nbsp;&nbsp;CSize((rect.right&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;rect.left)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">0.3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">),&nbsp;pContext))<br>&nbsp;{<br>&nbsp;&nbsp;TRACE0(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed&nbsp;to&nbsp;Create&nbsp;the&nbsp;Left&nbsp;View</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br>&nbsp;}<br><br>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Right&nbsp;View</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_splitter.CreateView(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;RUNTIME_CLASS(CMy2DTerrainEditor01View),<br>&nbsp;&nbsp;CSize((rect.right&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;rect.left)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">0.7</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">),&nbsp;pContext))<br>&nbsp;{<br>&nbsp;&nbsp;TRACE0(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed&nbsp;to&nbsp;Create&nbsp;the&nbsp;Left&nbsp;View</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br>&nbsp;}<br><br>&nbsp;SetActiveView((CView</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)m_splitter.GetPane(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));<br><br>&nbsp;m_splitter.ShowWindow(SW_SHOW);<br>&nbsp;m_splitter.UpdateWindow();<br><br>&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br>}<br><br><br>&nbsp;<br><br></span></div>
<p><br><br>需要注意的呢还得创建视图，在上面你可以发现这个问题，<br>我使用了一个自动生成的CMy2DTerrainEditor01View， 还有我利用VS自动创建的CLeftTreeView，<br>这个例子我想创建一个做视图为一个树形的视图，右边想画一个地图。<br><br>大概就这样了<br>&nbsp;</p>
<img src ="http://www.cppblog.com/Cunch/aggbug/143434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cunch/" target="_blank">Cunch</a> 2011-04-05 11:02 <a href="http://www.cppblog.com/Cunch/archive/2011/04/05/143434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>