单文档程序建立后,自动生成了一个CXXXVIEW,小弟想新建一个行的VIEW,然后再把CXXXVIEW给分割了,请各路大神指点
结果切换视图是把CXXXVIEW的工具栏给遮挡了,鼠标放在工具栏位置才显示工具栏。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CB3DCPSDoc), //利用这个宏通过C++类的名字获得一个运行时类结构,Use this macro to get the run-time class structure from the name of a C++ class
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CB3DCPSView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);//将应用文档模板添加到应用程序的文档模板列表当中
// 分析标准 shell 命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;//CCommandLineInfo定义命令行
ParseCommandLine(cmdInfo);//解析命令行
// 调度在命令行中指定的命令。 如果
// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
if (!ProcessShellCommand(cmdInfo))//程序启动时创建新文档ss
return FALSE;
//................................................................//
//创建一个新的视图
CView* pActiveView = ((CFrameWndEx*)m_pMainWnd)->GetActiveView();
m_pCamView = pActiveView;
m_pLasView = new CLaserProjection();
//文档与视图关联
CDocument* pDoc = ((CFrameWndEx*)m_pMainWnd)->GetActiveDocument();
CCreateContext context;
context.m_pCurrentDoc = pDoc;
//创建视图
UINT m_IDFORLASERPROJECTION = AFX_IDW_PANE_FIRST + 1;
CRect rect;
((CMainFrame*)m_pMainWnd)->GetClientRect(&rect);
m_pLasView->Create(NULL, _T("B3DCPS"), WS_CHILD, rect, m_pMainWnd, m_IDFORLASERPROJECTION, &context);
//...............................................................//
// 唯一的一个窗口已初始化,因此显示它并对其进行更新
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
void CB3DCPSApp::OnCalView()
{
// TODO: 在此添加命令处理程序代码
UINT temp = ::GetWindowLong(m_pLasView->m_hWnd, GWL_ID);
::SetWindowLong(m_pLasView->m_hWnd, GWL_ID, ::GetWindowLong(m_pCamView->m_hWnd, GWL_ID));
::SetWindowLong(m_pCamView->m_hWnd, GWL_ID, temp);
m_pLasView->ShowWindow(SW_HIDE);
m_pCamView->ShowWindow(SW_SHOW);
((CFrameWndEx*)m_pMainWnd)->SetActiveView(m_pCamView);
((CFrameWndEx*)m_pMainWnd)->RecalcLayout();
m_pCamView->Invalidate();
}
void CB3DCPSApp::OnLaserView()
{
// TODO: 在此添加命令处理程序代码
UINT temp = ::GetWindowLong(m_pLasView->m_hWnd, GWL_ID); //获得指定窗口的有关信息,获得指定窗口的ID
::SetWindowLong(m_pLasView->m_hWnd, GWL_ID, ::GetWindowLong(m_pCamView->m_hWnd, GWL_ID)); //设置指定窗口的有关信息
::SetWindowLong(m_pCamView->m_hWnd, GWL_ID, temp);
m_pCamView->ShowWindow(SW_HIDE);
m_pLasView->ShowWindow(SW_SHOW);
((CFrameWndEx*)m_pMainWnd)->SetActiveView(m_pLasView);
((CFrameWndEx*)m_pMainWnd)->RecalcLayout();
m_pLasView->Invalidate();
}
------解决思路----------------------
你这个切换框架就是不对的,这样搞直接就打乱了框架性的东西!尤其是单文档
记住,不要去修改框架上的东西,而是在其基础之上再去创建多个窗口,通过相互之间的隐藏显示达到切换的目的
具体做法就是你从CWnd派生两个窗口出来(Win32裸写也行),在View视图窗口创建出来(这个是框架性的东西,不要去修改)之后,再在View窗口之上Create出那两个窗口,作为View窗口的子窗口,然后再根据逻辑去隐藏显示这两个窗口
如果就拿你这个逻辑来修改的话,原因是
CRect rect;
((CMainFrame*)m_pMainWnd)->GetClientRect(&rect);
m_pLasView->Create(NULL, _T("B3DCPS"), WS_CHILD, rect, m_pMainWnd, m_IDFORLASERPROJECTION, &context);
这几句出了问题,view所在的区域,并不仅仅是MainWnd的客户区