昨天创建了一个基本的窗口,实现了呼出对话框汇报翻译情况。但翻译结果不能放在呼出的对话框中,需要建立一个和编辑区平行的区域。这里就要用到CSplitterWnd类。
CSplitterWnd可以实现对客户区的分割(单文档下),实现流程如下(参考:http://blog.csdn.net/shuilan0066/article/details/5742458):
1. 在框架类中声明一个CSplitterWnd对象
2. 重写OnCreateClient函数,在其中添加:
GetClientRect(&rc);
// 创建静态分割窗口,两行一列
if (!m_wndSplitter.CreateStatic(this, 2, 1))
return FALSE;
// 创建上面窗格中的视图
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CNCCompilerView), CSize(rc.Width(), rc.Height() / 2), pContext))
return FALSE;
// 创建下面窗格中的视图
if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(OutputEditView), CSize(rc.Width(), rc.Height() / 2), pContext))
return FALSE;
其中CreateStatic用于创建静态分割窗口,后面两个参数是分割的行列数,使用CreateView可创建对应分割窗口的视图。
这里使用继承CEditView类的OutputEditView类作为分割出来的视图类型,因为主要用于显示输出的结果。因为这里用到了该类,所以需要添加该类所在的头文件。
如何使用分割出的窗口
分割的窗口有两个,其中一个视图是之前用到的CNCCompilerView,它和一个NCCOmpilerDoc类在初始化的时候绑定并添加。也就是说可以通过文档类来获得该视图的信息。但是另一个视图并没有文档,因此必须用别的方法来调用。
这里提一种在框架类中调用的方法,用以输出文字,将下面的内容添加到消息处理函数中(暂时没有实现输出翻译结果的功能):
auto view = (OutputEditView*)m_wndSplitter.GetPane(1, 0);
view->SetWindowTextW(L"编译结果:\r\n第一条指令:进给速度100\r\n第二条:……");
运行结果:
相比昨天解决了UNICODE编码转换的问题,但在窗口之间的关系上迷惑了很久。
参考文章:
MFC读写文件:http://www.jizhuomi.com/software/497.html
UNICODE和ANSI转换:http://www.cnblogs.com/zhwl/archive/2012/11/09/2762983.html
判断TXT文件格式:http://blog.csdn.net/wangshiqilin_fjy/article/details/51259167
窗口拆分:http://blog.csdn.net/q1302182594/article/details/45132437
窗口拆分及其数据交换:http://blog.csdn.net/nupt123456789/article/details/7455471
总结:学习MFC这两三天,遇到的困难重重,各种诡谲的BUG让人分分钟螺旋升天(比如今天遇到的读写文件,读入UNICODE格式的文件,使用的buf是char格式的,就会导致只读一个字符,需改成宽字符wchar_t类型才行)。事实证明,对知识成体系的学习是十分必要的,单纯要用什么才去学什么是相当低效的。MFC背后的结构看似错综复杂,其实有规律可循,需要对其原理深入了解,才能更顺手地开发。