zoukankan      html  css  js  c++  java
  • 为MFC界面添加一个Log Window

    前言

    由于早期的图像处理程序基于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_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
    ");
    	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 !!!
    ";
    	pLogWnd->ReplaceSel((LPCTSTR)sOutput, TRUE);
    
    }
    

    最终效果如下:

    result

  • 相关阅读:
    代码:城市名称的联想下拉框。可按拼音搜索、按汉字搜索,是一种很简单的实现方式
    代码:拖拽
    插件:zTree
    代码:遍历
    学习笔记:Stage.js(又叫Cut.js)——2D canvas 开发库,游戏方面的
    前端模块化、构建工具
    二级联动下拉菜单
    thinkphp的目录结构设计经验总结
    tp 路径表示
    liunx 根目录介绍
  • 原文地址:https://www.cnblogs.com/moondark/p/4147187.html
Copyright © 2011-2022 走看看