博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为MFC界面添加一个Log Window
阅读量:5922 次
发布时间:2019-06-19

本文共 2435 字,大约阅读时间需要 8 分钟。

前言

由于早期的图像处理程序基于VC6.0,MFC也是采用VC6.0开发的。在实际处理中,我不仅需要界面的显示,有很多时候,我需要算法处理的过程中的信息,比如每个阶段的耗时,处理的图像大小,以及如果需要迭代,当前的迭代次数。

当然,有很多方法可以解决上述需求,譬如可以通过FILE创建一个文件,然后把相关信息写入。

但,那都不够直观

我希望的是,它能够像VC或VS在编译的时候,在下方有个「debug window」,将运行过程中的信息实时显示。

第一步 创建一个single document view

JUST勾一个选项即可,

mfc-new

第二步 在Resource栏进行设置

注意,这里的Dialog应该选择formview

mfc-formview

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

mfc-layout

第三步 修改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文件中

1) 在此处增加ON_WM_PAINT()

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)    //{
{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_PAINT() // 让自己写的OnPaint函数起作用 //}}AFX_MSG_MAPEND_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;// 申明外部变量

为了测试效果,通过classwizardLogWndDoc.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);}

最终效果如下:

result

转载地址:http://xzivx.baihongyu.com/

你可能感兴趣的文章
Telnet、SSH(SSH1和SSH2)之间的区别
查看>>
我的友情链接
查看>>
管道符和作业控制 shell变量
查看>>
SSH VNC
查看>>
ObservableCollection和List
查看>>
循环以及条件测试
查看>>
汉字文章转换拼音的好工具 pinyinConvert.v20120709
查看>>
java与xml
查看>>
诺基亚CEO史蒂芬·埃洛普摔iPhone
查看>>
使用OpenCV通过摄像头捕获实时视频并探测人脸
查看>>
我的友情链接
查看>>
1024 搞事倒计时!距程序员节还有 2 天!
查看>>
我的友情链接
查看>>
Apache Pig和Solr问题笔记(一)
查看>>
链接服务器创建
查看>>
linux目录和用户的权限
查看>>
软考中高项学员:2016年3月7日作业
查看>>
冒泡排序 直接排序 学习笔记
查看>>
Linux服务器---apache配置文件
查看>>
批量增加域用户并设置为漫游用户
查看>>