为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 版权声明:本文为博主原创文章,未经博主允许不得转载. 瑞芯微平台 ...
随机推荐
- (译)cocos2d-x跨android&ios平台开发入门教程
免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...
- fiddler 无法捕获apache httpclient报文的问题及解决
问题如题,解决办法为在构建httpclient对象的时候设置代理,因为fiddler内置了一个代理,只有流量(traffic)经过这个代理,才能够被捕捉到. HttpHost proxy = ); C ...
- Kali Linux系列教程之OpenVas安装
Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1. 服务器层组件 2.客户层组件 安装过程 Initial setup ...
- Getting the first day in a week with T-SQL
A colleague just asked me if I knew a way to get the first day in a week in SQL Server. While I'm su ...
- Devexpress GridView内嵌dx:ASPxGridLookup取得控件值乱跳解决方案
一 页面嵌入ASPxGridLookup控件 <dx:ASPxGridView ID="gridDetail" runat="server" ...
- 地址转换协议ARP
地址转换协议ARP 在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址.而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址.这就导致在以太 ...
- [JAVA] java仿windows 字体设置选项卡
想用java做一个像windows里一样的txt编辑软件,涉及到字体设置选项卡,在网上找了很久都没找到,就生气啦自己写一个,现在贴这里分享一下,下次再遇到这样的问题就不用自己亲自打代码啦! packa ...
- virtualbox 安装ubuntu
1. 下载已经安装好的ubuntu的virtualbox的vdi 下载地址: http://www.osboxes.org/ubuntu/ ubuntu 16.04 Xenial VirtualBox ...
- asp.net mvc 如何调用微信jssdk接口:分享到微信朋友(圈)| 分享到qq空间
如何在asp.net mvc 项目里, 调用微信jssdk接口,现实功能: 分享到微信朋友(圈)| 分享到qq空间 1 创建一个Action,准备一些数据,初始化数据(签名): /// <sum ...
- iOS App 研发的最后冲刺:内测与部署
当开发者历经磨难.披荆斩棘,完成了一个iOS项目后,最后的临门一脚就是应用的内测.部署.那么,在这最后的射门动作中,都有哪些地方需要开发者注意?有哪些方式能够更好地帮助我们进行iOS应用的发布部署? ...