为MFC界面添加一个Log Window

前言

因为早期的图像处理程序基于VC6.0,MFC也是采用VC6.0开发的。在实际处理中,我不只须要界面的显示,有不少时候,我须要算法处理的过程当中的信息,好比每一个阶段的耗时,处理的图像大小,以及若是须要迭代,当前的迭代次数。算法

固然,有不少方法能够解决上述需求,譬如能够经过FILE建立一个文件,而后把相关信息写入。函数

但,那都不够直观布局

我但愿的是,它可以像VC或VS在编译的时候,在下方有个「debug window」,将运行过程当中的信息实时显示。测试

第一步 建立一个single document view

JUST勾一个选项便可,this

mfc-new

第二步 在Resource栏进行设置

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

mfc-formview

而且布局设置以下,上面的EDIT控件为Edit Box指针

mfc-layout

第三步 修改MainFrm类

在头文件MainFrm.h中,增长一个DialogBar成员变量日志

CStatusBar  m_wndStatusBar;
CToolBar    m_wndToolBar;
...
CDialogBar  m_wndDlgBar; // 控制下方的Dialog控件

对OnPaint函数进行重写(这里应该是一个虚函数)code

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
...
afx_msg void OnPaint(); // 重写OnPaint()函数,用以控制控件的显示

在MainFrm.cpp文件中orm

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\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

相关文章
相关标签/搜索