在圖像編程的過程中,對一幅圖像處理,有時候希望彈出新的窗口顯示處理後的圖像,因爲這樣可以進行多種處理效果的比較。要在多文檔程序中實現多視圖,需要這樣做:
1、新建一個視圖類CShowView1,該視圖類的基類可以是CView或CSrollView.
2、在菜單中添加菜單項,在框架類CMainFrame中添加菜單響應函數。
3、在響應函數中添加以下代碼可以創建新的窗口並顯示處理後的圖像:
CMDIChildWnd* pActiveChild = MDIGetActive();//獲得子窗口
CImageProcessDoc* pDoc = (CImageProcessDoc*)pActiveChild->GetActiveDocument();//獲得當前文檔
CShowView1* pView = (CShowView1*)pActiveChild->GetActiveView();//獲得當前視圖,有時候沒有用
//添加進行圖像處理的代碼,以下以中值濾波代碼爲例
if (pDoc->m_hDIB == NULL)
{
AfxMessageBox("請先打開一幅圖像!", MB_OK);
return;
}
CSmoothMedian dlgSmoothMedian;
if (dlgSmoothMedian.DoModal() == IDOK)
{
int nSmoothSize = 0;
if (dlgSmoothMedian.m_nSmoothSize == 0)
{
nSmoothSize = 7;
}
else
nSmoothSize = 5;
pDoc->SmoothMedian(pDoc->m_lpDIBBits, pDoc->m_lWidth, pDoc->m_lHeight, pDoc->m_dwWidthBytes, nSmoothSize);//中值濾波平滑
}
//獲得新的文檔模板的指針,重點修改之處
CDocTemplate* pTemplate = ((CImageProcessApp*)AfxGetApp())->m_pTemplateShowView1;
ASSERT_VALID(pTemplate);
//創建新的框架窗口
CFrameWnd* pNewFrame = pTemplate->CreateNewFrame(pDoc, pActiveChild);
pTemplate->InitialUpdateFrame(pNewFrame, pDoc);//更新視圖
另外,用這個方法在圖像刷新時有點問題,假設窗口一中顯示原圖像,窗口二爲新建的窗口顯示處理後的圖像,窗口一種被窗口二覆蓋的部分會被刷新成爲窗口二中內容,還不知道該問題如何解決,求指導。