为MFC界面添加一个Log Window
前言
由于早期的图像处理程序基于VC6.0,MFC也是采用VC6.0开发的。在实际处理中,我不仅需要界面的显示,有很多时候,我需要算法处理的过程中的信息,比如每个阶段的耗时,处理的图像大小,以及如果需要迭代,当前的迭代次数。
当然,有很多方法可以解决上述需求,譬如可以通过FILE创建一个文件,然后把相关信息写入。
但,那都不够直观
我希望的是,它能够像VC或VS在编译的时候,在下方有个「debug window」,将运行过程中的信息实时显示。
第一步 创建一个single document view
JUST勾一个选项即可,

第二步 在Resource栏进行设置
注意,这里的Dialog应该选择formview

并且布局设置如下,上面的EDIT控件为Edit Box

第三步 修改MainFrm类
在头文件MainFrm.h中,增加一个DialogBar成员变量
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
...
CDialogBar m_wndDlgBar; // 控制下方的Dialog控件
对OnPaint函数进行重写(这里应该是一个虚函数)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
...
afx_msg void OnPaint(); // 重写OnPaint()函数,用以控制控件的显示
在MainFrm.cpp文件中
- 在此处增加
ON_WM_PAINT()
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_PAINT() // 让自己写的OnPaint函数起作用
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
2)在OnCreate中添加DialogBar的创建函数
// 设置DialogBar的创建
if (!m_wndDlgBar.Create(this, IDD_DLGLOG,
WS_CHILD | CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_GRIPPER, IDD_DLGLOG))
{
TRACE0("Failed to create DlgBar\n");
return -1;
}
m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY);
3)通过OnPaint函数控制大小
// 控制DialogBar 与 EditLog 的大小
void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// 控制日志窗口的CDialogBar大小和编辑框CEdit大小
CRect barrect;
m_wndDlgBar.GetClientRect(&barrect);
CRect barborders;
barborders = m_wndDlgBar.GetBorders();
m_wndDlgBar.GetDlgItem(IDC_EDITLOG)->MoveWindow(barborders.left,
barborders.top,
barrect.Width()-barborders.left-barborders.right,
barrect.Height()-barborders.top-barborders.bottom);
}
在此有个小插曲,如果想让MFC左上角的无标题等标题状态替换成自己想要的,则,在OnCreate函数中添加
SetWindowText( "Demo"); // 设置标题为`Demo`
并在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中添加这么一行:
cs.style &= ~FWS_ADDTOTITLE; // 让以上设置的标题得以显示
第四步 其它文件可以通过LogWindow输出信息
首先在该文件中增加一个外部变量,譬如我们要在LogWndDoc.cpp上要使用,则在文件前面加入:
extern CLogWndApp theApp;// 申明外部变量
为了测试效果,通过classwizard在LogWndDoc.cpp上增加一个void CLogWndDoc::OnFileOpen()函数,如下,即可将信息从Log Window上输出信息,代码:
void CLogWndDoc::OnFileOpen()
{
// TODO: Add your command handler code here
//设置CEdit指针,指向Log窗口的输入 (注意添加相应的头文件)
CEdit* pLogWnd = (CEdit*)( (CMainFrame*)theApp.GetMainWnd() )->GetDescendantWindow(IDC_EDITLOG);
DWORD dwSel = pLogWnd->GetSel();
pLogWnd->SetSel(0, -1, FALSE);
pLogWnd->Clear();
CString sOutput="Hello, my Log Window !!!\r\n";
pLogWnd->ReplaceSel((LPCTSTR)sOutput, TRUE);
}
最终效果如下:

为MFC界面添加一个Log Window的更多相关文章
- iOS 11开发教程(十三)iOS11应用编辑界面添加视图
iOS 11开发教程(十三)iOS11应用编辑界面添加视图 在iOS中添加视图的方式有两种:一种是使用编辑界面添加视图:另一种是使用代码添加视图.以下是这两个方式的详细介绍. 1.编辑界面添加视图 使 ...
- MFC+WinPcap编写一个嗅探器之二(界面)
选择新建->项目->MFC应用程序->基于对话框完成,这里文件名为sniffer 打开资源视图中的Dialog列表,打开项目总默认创建的话框,将对话框中的所有控件删除,之后按照最终效 ...
- VC/MFC如何添加启动界面
2015-05 转自 香远益清原文VC/MFC如何添加启动界面 1.基于框架类的应用程序添加启动画面的步骤(利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h ...
- swing实现QQ登录界面1.0( 实现了同一张图片只加载一次)、(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件)
swing实现QQ登录界面1.0( 实现了同一张图片只加载一次).(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件) 代码思路分析: 1.(同一张图片仅仅需要加载一次就够了,下 ...
- MFC如何添加系统消息处理函数?
http://zhidao.baidu.com/question/318026804.html 在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成 ...
- DHTMLX 前端框架 建立你的一个应用程序教程(三)--添加一个菜单
菜单的介绍 这篇我们介绍将菜单组建添加到上节中的布局中: 我们不对菜单做任何处理 只是在这里填充作为界面的一部分. 这里我们介绍的是dhtmlxMenu 组件. 这个组件的数据我们可以从XML或者J ...
- MFC+WinPcap编写一个嗅探器之六(分析模块)
这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的 ...
- MFC+WinPcap编写一个嗅探器之一(准备)
知识准备: MFC:http://www.jizhuomi.com/software/257.html WinPcap:http://www.ferrisxu.com/WinPcap/html/ind ...
- RK平台Android4.4 添加一个新的遥控器支持以及添加特殊按键【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/52904063 版权声明:本文为博主原创文章,未经博主允许不得转载. 瑞芯微平台 ...
随机推荐
- 如何使不同主机上的docker容器互相通信
docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...
- 【Leetcode】【Hard】Valid Number
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- 【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
ImageLoader类中包含了所有操作.他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法.在使用ImageLoader来显示图片之前,你需要初始化它的配置-Image ...
- [JS3] 立即执行JS
<html> <head> <title>立即执行</title> <SCRIPT TYPE="text/JavaScript" ...
- ajaxFileUpload上传文件后提示下载的问题
在某些版本浏览器下ajaxFileUpload上传文件会提示下载, 1:为什么? 可以观察到,即便返回 JsonResult 在返回的头中也没有任何消息体,直接理解为文本了. 2:解决方案 前端: f ...
- 深入浅出OOP(六): 理解C#的Enums
MSDN定义:枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法. 例如,假设您必须定义一个变量,该变量的值表示一周中的一天. 该变量只能存储七个有意义的值. 若要定义这 ...
- hibernate对象三种状态
在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...
- (笔记)VC6插件安装(VC6LineNumberAddin)
VC6插件安装步骤如下: 1.下载VC6LineNumberAddin插件及注册文件.(以下是参考链接:) http://files.cnblogs.com/files/tdyizhen1314/VC ...
- javaweb学习总结(十)——HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...