CMainFrame 的子窗口问题,CChildView 不能换成其他的CWnd派生类?

时间:2021-07-19 20:00:57
向导生成的Single document(不要 Document/View architecture surport),CMainFrame 中的子窗口是 CWnd 派生类 CChildView,在 CMainFrame::OnCreate中创建:

我把 CMainFrame 的子窗口换成其他的 CWnd 派生类(比如CListCtrl),发现CMainFrame 改变大小时,CListCtrl 不能自动改变大小。但是原先的 CChildView 却可以随着 CFainFrame 的大小改变而自动调整大小。

请高人解惑。

9 个解决方案

#1


在OnSize里用MoveWindow函数来改变大小。

#2


syy64(太平洋) : 谢谢。

请问为何 CChildView 不需要在 OnSize中改变大小?

另外如果 CMainFrame 有工具条或其他 DialogBar 的话,是没办法在 OnSize 中计算子窗口大小的。

感觉上可以重写 void CFrameWnd::RecalcLayout(BOOL bNotify) 来调整大小 ,但实际上 CFrameWnd::RecalcLayout 里面的代码比较复杂,没办法重写。

问题的重点是:为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?

#3


我把 CMainFrame 的子窗口换成其他的 CWnd 派生类(比如CListCtrl)
==========
不需要替换,把CListCtrl定义为CChildView的成员变量,然后处理wm_size,这样会给省很多麻烦。你直接用你的CWnd对象把整个View填满就可以了

#4


laiyiling(【陌生人.MVP】) : 多谢!

这种办法把问题绕过去了,应该可行。等结贴时100分奉上。


不过我还是想知道答案,感兴趣的继续讨论:(此问题如果解决另加100分)
为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?



#5


将CListCtrl换成CListView试试。

#6


解决办法:创建子窗口时,把子窗口的ID设为 AFX_IDW_PANE_FIRST 。

#7


seasol(海子) :CListView 的构造函数是保护的,应该用动态创建。但是我这里需要的就是普通的CWnd派生类,可以直接创建的。 

#8


我想应该是View和CWnd类有区别的,你可以区看看代码。

#9


laiyiling(【陌生人.MVP】) :

本来也没想用 View 。我就是很委婉的提醒 seasol(海子) 注意看清题目。

#1


在OnSize里用MoveWindow函数来改变大小。

#2


syy64(太平洋) : 谢谢。

请问为何 CChildView 不需要在 OnSize中改变大小?

另外如果 CMainFrame 有工具条或其他 DialogBar 的话,是没办法在 OnSize 中计算子窗口大小的。

感觉上可以重写 void CFrameWnd::RecalcLayout(BOOL bNotify) 来调整大小 ,但实际上 CFrameWnd::RecalcLayout 里面的代码比较复杂,没办法重写。

问题的重点是:为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?

#3


我把 CMainFrame 的子窗口换成其他的 CWnd 派生类(比如CListCtrl)
==========
不需要替换,把CListCtrl定义为CChildView的成员变量,然后处理wm_size,这样会给省很多麻烦。你直接用你的CWnd对象把整个View填满就可以了

#4


laiyiling(【陌生人.MVP】) : 多谢!

这种办法把问题绕过去了,应该可行。等结贴时100分奉上。


不过我还是想知道答案,感兴趣的继续讨论:(此问题如果解决另加100分)
为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?



#5


将CListCtrl换成CListView试试。

#6


解决办法:创建子窗口时,把子窗口的ID设为 AFX_IDW_PANE_FIRST 。

#7


seasol(海子) :CListView 的构造函数是保护的,应该用动态创建。但是我这里需要的就是普通的CWnd派生类,可以直接创建的。 

#8


我想应该是View和CWnd类有区别的,你可以区看看代码。

#9


laiyiling(【陌生人.MVP】) :

本来也没想用 View 。我就是很委婉的提醒 seasol(海子) 注意看清题目。