通过本案例学习,掌握如下: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);
}
- 类与类中数据交换,将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