【数字图像处理】 二.MFC单文档分割窗口显示图片

举报
eastmount 发表于 2023/09/20 22:02:42 2023/09/20
【摘要】 本文是讲述《数字图像处理》系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程及常用图片软件讲解,希望对您有所帮助.

本文是讲述《数字图像处理》系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程及常用图片软件讲解.

一.CSplitterWnd类基础知识

CSplitterWnd类提供一个分离器窗口的功能,分隔器窗口是一个包含有多个窗格的窗口.窗格通常是应用程序特定的由CView派生的对象,但它也可以是具有适当子窗口ID的任何CWnd对象.

CSplitterWnd::Create
BOOL Create(
	CWnd* pParentWnd,
	int nMaxRows,
	int nMaxCols,
	SIZE sizeMin,
	CCreateContext* pContext,
	DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
	UINT nID = AFX_IDW_PANE_FIRST
);
Create:创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接.
参数:
pParentWnd表示切分窗口的父框架窗口;
nMaxRows,nMaxCols是创建切分窗口的最大列数和行数(动态创建的分割窗口的窗格数目不能超过2x2);
sizeMin指出显示一个窗格所需的最小尺寸;
pContext指向一个CCreateContext结构的指针(多数情况这个值可以是传递给父框架窗口的pContext);
dwStyle指定窗口的风格;
nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,则ID可以是AFX_IDW_PANE_FIRST).
CSplitterWnd::CreateStatic
BOOL CreateStatic( 
	CWnd* pParentWnd,
	int nRows,
	int nCols,
	DWORD dwStyle = WS_CHILD | WS_VISIBLE,
	UINT nID = AFX_IDW_PANE_FIRST
);
CreateStatic:创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接.
参数:
pParentWnd表示切分窗口的父框架窗口;
nRows行数.该值不能超过16;

nCols列数.这个值必须不超过16;
dwStyle指定窗口的风格;
nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,则ID可以是AFX_IDW_PANE_FIRST).
CSplitterWnd::CreateView
virtual BOOL CreateView( 
	int row, 
	int col, 
	CRuntimeClass* pViewClass, 
	SIZE sizeInit, 
	CCreateContext* pContext 
);
CreateView:在一个分隔器窗口中创建一个窗格.
参数:
row指定用来放置新视的分隔器窗口行;
col指定用来放置新视的分隔器窗口列(最多创建16*16窗口);
pViewClass指定新视的CRuntimeClass;
sizeInit指定新视的初始尺寸;
pContext 指向用来创建此视的创建环境的指针(该pContext被传递给创建此分隔器窗口的父框架的重载的OnCreateClient成员函数).


二.CSplitterWnd类创建静态分割窗口

(1).创建MFC单文档工程应用程序,工程名称"MFCPic".

(2).向CMainFrame类中添加一个公有成员变量,类型为CSplitterWnd,变量名为m_wndSplitter.
在"类视图"右键"CMainFrame",选择"添加"->"添加变量".

(3).利用"类向导"为CMainFrame类添加OnCreateClient事件.
"项目"->"类向导"如下图选择"CMainFrame"类,添加虚函数OnCreateClient.

添加代码如下,同时向CMainFrame.cpp中添加#include "MFCPicView.h",向MFCPicView.h中添加#include "MFCPicDoc.h",否则会出现"XXXDoc missing ';' before '*'"错误提示:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO: 在此添加专用代码和/或调用基类
	CRect rect;
	GetClientRect(&rect);  //获取客户区坐标(左上 右下)
	if(!m_wndSplitter.CreateStatic(this,1,2))  
		return FALSE;      //创建静态分割器窗口 1行*2列
	if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMFCPicView),CSize(450,250),pContext))
		return FALSE;      //创建位置(0,0)
	if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMFCPicView),CSize(rect.Width()/4,rect.Height()),pContext))
		return FALSE;      //创建位置(0,1)
	SetActiveView((CMFCPicView*)m_wndSplitter.GetPane(0,0));
	return TRUE;
	//return CFrameWndEx::OnCreateClient(lpcs, pContext);
}
(4).可以设置RUNTIME_CLASS为自定义的类.
如可以实现左边是带有按钮的窗口,右边是操作后显示的图片."项目"->"新建类"为工程添加一个新类,在Class type中选择MFC class,在对话框Name中输入"CRightView",并在Base class(基类)下拉列表中自定义设置为CEditView,同时修改第二个窗格的代码修改如下:
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CRightView),CSize(250,250),pContext))

同时,向CMainFrame源文件中添加#include "RightView.h".我把该上述代码类似的嵌入至"【数字图像处理】 一.MFC详解显示BMP格式图片"中运行结果如下图所示:

希望该文章能够对大家有所帮助,同时如果文章中有错误或不足之处,还请大家海涵.后面讲述的"左边显示树状图片路径,右边显示图片"和"显示图片路径中的文件"可能对大家帮助更大,此篇仅是开篇,希望您喜欢。

(By:Eastmount 2023-09-20 夜于贵阳)

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。