因爲早期的圖像處理程序基於VC6.0,MFC也是採用VC6.0開發的。在實際處理中,我不只須要界面的顯示,有不少時候,我須要算法處理的過程當中的信息,好比每一個階段的耗時,處理的圖像大小,以及若是須要迭代,當前的迭代次數。算法
固然,有不少方法能夠解決上述需求,譬如能夠經過FILE建立一個文件,而後把相關信息寫入。函數
但,那都不夠直觀佈局
我但願的是,它可以像VC或VS在編譯的時候,在下方有個「debug window」,將運行過程當中的信息實時顯示。測試
JUST勾一個選項便可,this
注意,這裏的Dialog應該選擇formviewdebug
而且佈局設置以下,上面的EDIT控件爲Edit Box指針
在頭文件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;// 申明外部變量
爲了測試效果,經過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); }
最終效果以下: