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

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值