MFC之窗口切分
一、准备工作(这里主要是新增一个dialog,两个类)
- 新建一个dialog(如下):
- 单击新建号的dialog进入,然后右击选择添加类选项,分别建立两个类FormViewOne和FormViewTwo,选择基类的时候一定要选择CFormView(这个只在2017之前的VS版本里有),VS2017如果要用的话,我目前只能说仿照着模板写,下面是模板,改一下类的名字就好。
class FormViewOne : public CFormView
{
DECLARE_DYNCREATE(FormViewOne)
protected:
FormViewOne();
virtual ~FormViewOne();
public:
enum { IDD = IDD_FORMVIEW };
virtual void OnFinalRelease();
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};
- 当然呢,第二个类就不用贴上来了,因为与上面相比就只有类名字不同而已
二、调用
- 新建的dialog必然是为了其他界面调用的,那这里我们就要找到调用的界面,然后在相应的类中实现相关的函数,我这里是在另外一个dialog中调用,所以就在该dialog添加的类中进行操作。
- 首先在调用的dialog添加的类的.h文件的类中进行如下操作:
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
CFrameWnd* m_pMyFrame;
CSplitterWnd m_cSplitter;
- 在调用的dialog添加的类的.cpp文件中实现相关接口,主要接口就一个
OnCreate()
int CXlCANcontrolDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
CString strMyClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH),
::LoadIcon(NULL, IDI_APPLICATION));
m_pMyFrame = new CFrameWnd;
m_pMyFrame->Create(strMyClass, _T(""), WS_CHILD, CRect(0, 0, 300, 300), this);
m_pMyFrame->ShowWindow(SW_SHOW);
m_cSplitter.CreateStatic(m_pMyFrame, 1, 2);
m_cSplitter.CreateView(0, 0, RUNTIME_CLASS(FormViewOne), CSize(100, 100), NULL);
m_cSplitter.CreateView(0, 1, RUNTIME_CLASS(FormViewTwo), CSize(100, 100), NULL);
return 0;
}
- 在调用的dialog添加的类的.cpp文件中初始化函数
OnInitDialog()
中获取窗口大小
GetWindowRect(&rect);
ScreenToClient(&rect);
rect.top += 90;
m_pMyFrame->MoveWindow(&rect);
m_pMyFrame->ShowWindow(SW_SHOW);
- 在调用的dialog添加的类的.cpp文件中添加映射消息
ON_WM_CREATE()
- 当然最后一步,不要忘记在调用的dialog添加的类的.cpp文件中添加头文件
#include "FormViewOne.h"
#include "FormViewTwo.h"
三、我的运行界面