惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
F
Fortinet All Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
V
Visual Studio Blog
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
P
Proofpoint News Feed
博客园_首页
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 张尹

Windows管道技术简述 内核printf源代码分析 获得控制台程序的输出 如何在控制台程序中读取WORD文档的内容? - 张尹 - 博客园 简单封装的一个彩色进度条 C语言编程技巧汇萃(包含大量实用函数) 一个编程函数集(包含大量C实用函数) MD5算法说明及源码 C51 怎样将1个子程序段定位在1个固定的地址位置? 动态真彩工具栏 一个实用的 CToolBar 扩展类 CToolBarEx 一步步制作真彩工具条 [转载精品]C++程序员经常问的11个问题 关于CRichEditCtrl中文字颜色的控制 如何制作Windows自定义边框的对话框 让ListBox控件支持拖动 VC通用控件编程之CSlider控件 CListCtrl使用详解 一个不错的算法
MFC下窗口分割和文字输出的实现
张尹 · 2007-01-17 · via 博客园 - 张尹

在*VIEW类的函数ondraw()中可以由pDC->textout(x,y,string)来实现文字输出。

但阿陆说在窗口分割之后并不能实现输出,而且两个窗口中都没有输出。我并不清楚他是怎样做窗口分割的。后来我实现了一下,思路是直接建立一个单文档工程。在本来已有一个CMfcTView类下再添一个视图类:CChildView。

一、实现窗口分割的条件:在目标frame中添加分割对象,即在其头文件的class CMainFrame : public CFrameWnd下添加定义

public:
 CSplitterWnd m_SplitterWnd1;
 CSplitterWnd m_SplitterWnd2;

二、在目标frame中添加如下程序,即在创建窗口客户区时进行分割:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
 
// TODO: Add your specialized code here and/or call the base class
 
// 创建拆分器窗口 
 if (!m_SplitterWnd1.CreateStatic(this21)) //2行1列
  return FALSE;
 
//if (!m_SplitterWnd2.CreateStatic(&m_SplitterWnd1, 2, 1, WS_CHILD|WS_VISIBLE|WS_BORDER, m_SplitterWnd1.IdFromRowCol(0,1))) 
 
// return FALSE;
 CRect rc;
 GetClientRect(rc);
 CSize sz
=rc.Size();
 
//创建message list view window CUErrcNasListView
 if (!m_SplitterWnd1.CreateView(00, RUNTIME_CLASS(CMfcTView), CSize(sz.cx*3/5, sz.cy), pContext)) 
 

  m_SplitterWnd1.DestroyWindow();
  
return FALSE; 
 }

 
//创建message decode window
 if (!m_SplitterWnd1.CreateView(10, RUNTIME_CLASS(CChildView), CSize(sz.cx*2/5, sz.cy), pContext)) 
 

  m_SplitterWnd1.DestroyWindow();
  
return FALSE; 
 }

 
return TRUE;
 
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}


三、由于在这个函数中用到了两个视图类的类名,故而要将两个视图类的头文件补加进来。却在frme的实现文件中加上代码:

#include "MfcTView.h"
#include 
"ChildView.h"

四、在这个调试过程中我发现,在刚创建好工程后,#include "MfcTDoc.h"这语句是放在了CMfcTView.cpp中,而不是放在CMfcTView.h中。刚创建的工程当然可以运行,其实本身就存在一个令我搞不明白的东西:那就是在头文件里存在一个定义(public: CMfcTDoc* GetDocument();),这显然不合C++的逻辑。但它能运行。在我进行了窗口分割之后却不能运行了,我搞不明白。我只好按C++的逻辑办事,把这个include语句放到头文件中。结果证明可行。

五、测试输出文字,分别在两个视图类的ondraw函数中加textout()函数。测试结果是成功的,没有理由不输出,这两个本身是不同的窗口,有各自独立的doc和各自的客户区。

void CMfcTView::OnDraw(CDC* pDC)
{
 CMfcTDoc
* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 pDC
->TextOut(5,5,"HELLO");
 
// TODO: add draw code for native data here
}


void CChildView::OnDraw(CDC* pDC)
{
 CDocument
* pDoc = GetDocument();
 pDC
->TextOut(5,5,"HELLO");
 
// TODO: add draw code here
}

结论:可以在窗口分割下进行类似的文字输出,并且用的是简单的textout函数。