MFC 拆分窗口的显示问题 ?

时间:2021-12-14 21:31:55
环境是VS2012 标准MFC项目。我在MainFrm头文件里声明了
CSplitterWnd m_wndSplitter;
virtual BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs,CCreateContext* pContext);
然后在MainFrm文件里重载了CMainFrame::OnCreateClient

BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs,CCreateContext* pContext)

{

m_wndSplitter.CreateStatic(this,1,2);
CRect rect;

GetClientRect(&rect);

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CSpliterTestView),CSize(rect.Width()-rect.Width()/2,rect.Height()),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CNewView),CSize(rect.Width()/2,rect.Height()),pContext);

return TURE;

}

CSpliterTestView和CNewView是另外两个用于显示图片的类,基类都是CView。
然后编辑了这两个类中响应的OnDraw函数,给两个按钮添加了事件响应,一个基于CSpliterTestView,一个基于CNewView,执行程序后我发现,想要让拆分后的一个子窗口显示对应的图像,需要先在那个子窗口上点一下鼠标左键,再按相应的按钮图片才能显示出来,请问是何原因?

7 个解决方案

#1


本帖最后由 VisualEleven 于 2013-09-29 10:12:48 编辑
因为你的应用程序框架默认情况下调用的是创建程序时所生成的那个view窗口。
在你的APP类中,把XXXAPP::InitInstance()函数中的
{
........................................
........................................
   pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestViewDoc),
RUNTIME_CLASS(CMainFrame),    
RUNTIME_CLASS(XXXView));//把“XXXView”改为你想要的CSpliterTestView或者CNewView试试。
.........................................
.........................................
  
}

#2


执行程序后我发现,想要让拆分后的一个子窗口显示对应的图像,需要先在那个子窗口上点一下鼠标左键,再按相应的按钮图片才能显示出来,请问是何原因?
-------------------------------------------------
如果不先在CNewView对应的窗口中点一下,图片就显示不出来???

#3


引用 2 楼 VisualEleven 的回复:
执行程序后我发现,想要让拆分后的一个子窗口显示对应的图像,需要先在那个子窗口上点一下鼠标左键,再按相应的按钮图片才能显示出来,请问是何原因?
-------------------------------------------------
如果不先在CNewView对应的窗口中点一下,图片就显示不出来???

是的,点一下那个窗口以后再点相应的按钮才能显示图片

#4


是的,点一下那个窗口以后再点相应的按钮才能显示图片

#5


把响应函数放在CMainFrame中,然后由CMainFrame调用相应的CView函数

#6


引用 1 楼 rxguoblp 的回复:
因为你的应用程序框架默认情况下调用的是创建程序时所生成的那个view窗口。
在你的APP类中,把XXXAPP::InitInstance()函数中的
{
........................................
........................................
   pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestViewDoc),
RUNTIME_CLASS(CMainFrame),    
RUNTIME_CLASS(XXXView));//把“XXXView”改为你想要的CSpliterTestView或者CNewView试试。
.........................................
.........................................
  
}

我改完以后是这样:
	
                pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSpliterTestDoc),
RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
RUNTIME_CLASS(CNewView)
);

但还是不行。依然要点一下窗口再点相应按钮才能显示图片

#7


引用 5 楼 flydreamGG 的回复:
把响应函数放在CMainFrame中,然后由CMainFrame调用相应的CView函数

多谢提示 找到办法了

#1


本帖最后由 VisualEleven 于 2013-09-29 10:12:48 编辑
因为你的应用程序框架默认情况下调用的是创建程序时所生成的那个view窗口。
在你的APP类中,把XXXAPP::InitInstance()函数中的
{
........................................
........................................
   pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestViewDoc),
RUNTIME_CLASS(CMainFrame),    
RUNTIME_CLASS(XXXView));//把“XXXView”改为你想要的CSpliterTestView或者CNewView试试。
.........................................
.........................................
  
}

#2


执行程序后我发现,想要让拆分后的一个子窗口显示对应的图像,需要先在那个子窗口上点一下鼠标左键,再按相应的按钮图片才能显示出来,请问是何原因?
-------------------------------------------------
如果不先在CNewView对应的窗口中点一下,图片就显示不出来???

#3


引用 2 楼 VisualEleven 的回复:
执行程序后我发现,想要让拆分后的一个子窗口显示对应的图像,需要先在那个子窗口上点一下鼠标左键,再按相应的按钮图片才能显示出来,请问是何原因?
-------------------------------------------------
如果不先在CNewView对应的窗口中点一下,图片就显示不出来???

是的,点一下那个窗口以后再点相应的按钮才能显示图片

#4


是的,点一下那个窗口以后再点相应的按钮才能显示图片

#5


把响应函数放在CMainFrame中,然后由CMainFrame调用相应的CView函数

#6


引用 1 楼 rxguoblp 的回复:
因为你的应用程序框架默认情况下调用的是创建程序时所生成的那个view窗口。
在你的APP类中,把XXXAPP::InitInstance()函数中的
{
........................................
........................................
   pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestViewDoc),
RUNTIME_CLASS(CMainFrame),    
RUNTIME_CLASS(XXXView));//把“XXXView”改为你想要的CSpliterTestView或者CNewView试试。
.........................................
.........................................
  
}

我改完以后是这样:
	
                pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSpliterTestDoc),
RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
RUNTIME_CLASS(CNewView)
);

但还是不行。依然要点一下窗口再点相应按钮才能显示图片

#7


引用 5 楼 flydreamGG 的回复:
把响应函数放在CMainFrame中,然后由CMainFrame调用相应的CView函数

多谢提示 找到办法了