MFC学习

在这里插入图片描述
通过本案例学习,掌握如下:1.如何创建docablepane类 2.如何将对话框嵌入viewer类和docablepan类 3.如何传递两个对话框的数据
1.创建一个基于MFC的单文档文件
2.添加docablepane类
在这里插入图片描述
3.在Cmainframe.h中添加头文件及成员变量

#include "mypane.h"

public:
	mypane pane;

在 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加如下代码

if(!pane.Create(_T(""), this, CRect(0, 0, 200, 200), TRUE, 1001, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
	{
		TRACE0("Failing to create RightPane\n");
		return -1;

	}
	pane.EnableDocking(CBRS_ALIGN_ANY);
	pane.SetControlBarStyle(~AFX_CBRS_CLOSE);//关闭上面的x
	DockPane(&pane);

在构造函数中添加

CMainFrame::CMainFrame()
{
	// TODO: 在此添加成员初始化代码
	theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);

	CMainFrame::EnableLoadDockState(FALSE); //消除停靠位置,存储记忆功能
}

运行效果如图:
在这里插入图片描述
4. 添加一个对话框类,使其嵌入到mypane中,对话框中的控件及变量如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
初始化对话框:

BOOL paneDAILOG::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化
	m_slider.SetRange(-180, 180);//设置范围
	m_slider.SetTicFreq(1); //设置刻度间隔
	m_slider.SetPos(0); //当前停留位置
	m_slider.SetLineSize(10); //一行的大小,对应键盘方向键
	UpdateData(TRUE);// 用于将屏幕上控件中的数据交换到变量中
	m_value = m_slider.GetPos(); //获得滑块的位置
	
	UpdateData(FALSE);  //将变量显示到屏幕上控件中


	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

添加滑块响应函数:

void paneDAILOG::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	m_value = m_slider.GetPos();
	
	UpdateData(FALSE);


	*pResult = 0;
}

将paneDIALOG嵌入到mypane
mypane.h添加头文件,添加成员变量

#include "paneDAILOG.h"
#include "resource.h"

public:
	paneDAILOG dlg;

在mypan.cpp中加入函数,点击mypan类,在属性—>消息中找WM_CREATE 和WM_SIZE添加

int mypane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
		return -1;


	// TODO:  在此添加您专用的创建代码
	CRect rectDummy;
	rectDummy.SetRectEmpty();

	if (!dlg.Create(IDD_PANEDAILOG, this))
	{
		TRACE0("未能创建输出选项卡窗口/n");
		return -1;
	}

	dlg.ShowWindow(SW_SHOW);

	return 0;
}


void mypane::OnSize(UINT nType, int cx, int cy)
{
	CDockablePane::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	dlg.SetWindowPos(this, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
	dlg.ShowWindow(SW_SHOW);
}

运行效果如下:
在这里插入图片描述
5. 同理,添加一个viewerDIALOG,添加edit控件,变量为value类型,名称为m_value2,将其嵌入到CmoldView类中

view头文件中添加
#include "viewerDIALOG.h"

public:
	viewerDIALOG viewer;

view.cpp中添加:
int CmodelView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	CRect rectDummy;
	rectDummy.SetRectEmpty();

	if (!viewer.Create(IDD_VIEWERDIALOG, this))
	{
		TRACE0("未能创建输出选项卡窗口/n");
		return -1;
	}

	viewer.ShowWindow(SW_SHOW);
	// TODO:  在此添加您专用的创建代码

	return 0;
}


void CmodelView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	viewer.SetWindowPos(this, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
	viewer.ShowWindow(SW_SHOW);
}


  1. 类与类中数据交换,将paneDIALOG中数据传到viewerDIALOG中
//在viewerDIALOG.cpp中添加
viewerDIALOG* trans;
//初始化对话框
BOOL viewerDIALOG::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化
	trans = this;

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}
//在panDIALOG.cpp上添加
extern viewerDIALOG* trans;

void paneDAILOG::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	m_value = m_slider.GetPos();
	trans->m_value2 = m_value;
	UpdateData(FALSE);
	trans->UpdateData(FALSE);

	*pResult = 0;
}

参考博客如下:
https://blog.csdn.net/rentao315/article/details/19352521
https://blog.csdn.net/hw140701/article/details/69382284

猜你喜欢

转载自blog.csdn.net/weixin_42355349/article/details/82778245