为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 版权声明:本文为博主原创文章,未经博主允许不得转载. 瑞芯微平台 ...
随机推荐
- codeforces 425E
题意:对于[l1, r1], [l2, r2]...[lm, rm]线段组成的一个集合S,我们定义f(S)为最大的不相交(没有任何公共点)线段数,现在给定n及k,n表示线段范围,即任何[li, ri] ...
- CPU相关知识---物理CPU数、物理核数、逻辑核数、逻辑CPU数 ?
一.物理CPU数.物理核数.逻辑核数.逻辑CPU数 相互关系??? 物理CPU数 ---> 每个物理CPU对应物理核数 ---> (每个物理核数对应逻辑核数)物理CPU对应逻辑核数 --- ...
- C++混合编程之idlcpp教程Lua篇(5)
上一篇在这 C++混合编程之idlcpp教程Lua篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial3中,同样加入了三个文件:LuaTutori ...
- 不制作证书是否能加密SQLSERVER与客户端之间传输的数据?
不制作证书是否能加密SQLSERVER与客户端之间传输的数据? 在做实验之前请先下载network monitor抓包工具 微软官网下载:http://www.microsoft.com/en-us/ ...
- C#与数据库访问技术总结(十七)
使用DataSet对象访问数据库 当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为ad ...
- 【UML】UML序列图总结
序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图. 纵向是时间轴,时间沿竖线向下延伸. 横向轴代表了在协作中各独立对象的类元角色. 类元角色用生命线表示. 当对象存在时,角色用 ...
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...
- atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
atitit...触发器机制 ltrigger mechanism sumup .的总结O8f 1. 触发器的类型 1 2. 实现原理 1 3. After触发器 Vs Instead Of触发器 ...
- paip.突破 网站 手机 验证码 的 破解 总结
paip.突破 网站 手机 验证码 的 破解 总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- 为何在font-family属性中设置多个值
通常前端开发中会对body标签中设置font-family属性多个值,例如: body{padding:0;margin:0;font-size:12px;text-align:left;font-f ...