1. 程式人生 > >MFC單文件中影象的顯示與操作

MFC單文件中影象的顯示與操作

一、建立MFC單文件工程:DIPAX
二、在DIPAX工程新增CDib類的定義及其實現。
三、在DIPAX工程MFC單文件中建立兩個檢視類,左右分開
1、首先建立類:
class CDynSplitterWnd :public CSplitterWnd
{
public:
CDynSplitterWnd(void);
~CDynSplitterWnd(void);
};
在CMainFrame中包含上述類的標頭檔案,重寫CMainFrame類的方法virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
2、在重寫類之前,建立新的檢視類
class CDynSplitView : public CView //第一個檢視類:CdipaxView
以及在CMainFrame裡建立上述視窗分割類的物件CDynSplitterWnd m_wndSplitter;
3、現在可以重寫上述OnCreateClient()方法了:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此新增專用程式碼和/或呼叫基類
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
TRACE0(“Failed to Splitter window\n”);
return FALSE;
}
// add the first splitter pane - the default view in column 0
if (!m_wndSplitter.CreateView(0, 0,
pContext->m_pNewViewClass, CSize(275, 150), pContext))
{
TRACE0(“Failed to create first pane\n”);
return FALSE;
}
// add the second splitter pane - an input view in column 1
if (!m_wndSplitter.CreateView(0, 1,
RUNTIME_CLASS(CDynSplitView), CSize(0, 0), pContext))
{
TRACE0(“Failed to create second pane\n”);
return FALSE;
}
// activate the input view
SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
return TRUE;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
4、執行效果

這裡寫圖片描述

四、在檢視類CdipaxView中顯示點陣圖
1.在CdipaxDoc文件類中新增:
(1)新增標頭檔案
·#include “DIB.h”
(2)新增成員變數:
CDib Cdib;
CString filename;
int statedoc;
(3)新增OnFileOpen()事件函式: OnFileOpen()
void CdipaxDoc::OnFileOpen()
{
// TODO: 在此新增命令處理程式程式碼
CFileDialog dlg(TRUE,_T(“BMP”),_T(“.BMP”),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(“點陣圖檔案(

.BMP)|*.BMP|”));
if(IDOK==dlg.DoModal ())
filename.Format (“%s”,dlg.GetPathName() );
Cdib.LoadFile(filename);

statedoc=1;

}
(4)在建構函式中新增:
CdipaxDoc::CdipaxDoc()
{
// TODO: 在此新增一次性構造程式碼
statedoc=0;
}
2、在CdipaxView檢視類中新增:
(1)在CdipaxView.h中新增成員變數
public:
CString filename;
int state1;
(2)在建構函式中新增:
CdipaxView::CdipaxView()
{
// TODO: 在此處新增構造程式碼
state1=0;
}
(3)改寫選單項:
這裡寫圖片描述

(4)改寫工具欄:

(5)在CdipaxView中為選單ID_ORIGINIMAGE新增事件處理程式:
void CdipaxView::OnOriginimage()
{
// TODO: 在此新增命令處理程式程式碼
CdipaxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
filename=pDoc->filename;
state1=1;
Invalidate();
}

(6)重寫OnDraw函式:
void CdipaxView::OnDraw(CDC* pDC)
{
CdipaxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: 在此處為本機資料新增繪製程式碼
if(state1==1)
{
pDoc->Cdib.Draw(pDC,pDoc->Cdib.m_lpData,CPoint(0,0),CSize(pDoc->Cdib.GetWidth(),pDoc->Cdib.GetHeight()));
}
}
(7)執行效果:

這裡寫圖片描述

五、一個簡單的二值化操作
1、在CDynSplitView中顯示經過處理之後的影象
(1)在CDynSplitView.h中新增
public:
BYTE* image_out;//處理後圖像資料區指標
BYTE* image_in; //處理前影象資料區指標
long m_imagex;//影象的寬度
long m_imagey;//影象的高度
int state2; //CDynSplitView檢視類是否為當前檢視
CPalette hPalette;
public:
void clearmem(void);//複製影象資料
(2)建構函式
CDynSplitView::CDynSplitView()
{
image_out=NULL;
image_in=NULL;
state2=0;
m_imagex=0;
m_imagey=0;
}
(3) 成員函式的實現
void CDynSplitView::clearmem(void)
{
CdipaxDoc* pDoc =(CdipaxDoc*)GetDocument();
ASSERT_VALID(pDoc);
pDoc ->statedoc=0;
state2=1;
m_imagex=pDoc->Cdib.GetWidth();
m_imagey=pDoc->Cdib.GetHeight();
long int size=m_imagex*m_imagey;
if (pDoc->Cdib.GetBitCount()>8)
size=size*3;
image_out=new BYTE[size];
image_in=new BYTE[size];
memcpy(image_in,pDoc->Cdib.m_lpData,size);//複製原影象到處理區
}
(4)改寫OnDraw()函式:
void CDynSplitView::OnDraw(CDC* pDC)
{
CdipaxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(!pDoc ->statedoc&&state2==1)
{
pDoc->Cdib.Draw(pDC,image_out,CPoint(0,0),CSize(m_imagex,m_imagey));
}
}
2、灰度影象的二值化處理操作
(1)新增影象操作選單:ID_BINARIZATION,標題為二值化處理,並新增事件處理程式。
void CDynSplitView::OnBinarization()
{
// TODO: 在此新增命令處理程式程式碼
clearmem(); //複製影象資料
for (int i=0;i