前言
由於早期的圖像處理程序基於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);
}
最終效果如下: