我把 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 派生类就不正常,到底差在哪里呢?
请问为何 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填满就可以了
==========
不需要替换,把CListCtrl定义为CChildView的成员变量,然后处理wm_size,这样会给省很多麻烦。你直接用你的CWnd对象把整个View填满就可以了
#4
laiyiling(【陌生人.MVP】) : 多谢!
这种办法把问题绕过去了,应该可行。等结贴时100分奉上。
不过我还是想知道答案,感兴趣的继续讨论:(此问题如果解决另加100分)
为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?
这种办法把问题绕过去了,应该可行。等结贴时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(海子) 注意看清题目。
本来也没想用 View 。我就是很委婉的提醒 seasol(海子) 注意看清题目。
#1
在OnSize里用MoveWindow函数来改变大小。
#2
syy64(太平洋) : 谢谢。
请问为何 CChildView 不需要在 OnSize中改变大小?
另外如果 CMainFrame 有工具条或其他 DialogBar 的话,是没办法在 OnSize 中计算子窗口大小的。
感觉上可以重写 void CFrameWnd::RecalcLayout(BOOL bNotify) 来调整大小 ,但实际上 CFrameWnd::RecalcLayout 里面的代码比较复杂,没办法重写。
问题的重点是:为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?
请问为何 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填满就可以了
==========
不需要替换,把CListCtrl定义为CChildView的成员变量,然后处理wm_size,这样会给省很多麻烦。你直接用你的CWnd对象把整个View填满就可以了
#4
laiyiling(【陌生人.MVP】) : 多谢!
这种办法把问题绕过去了,应该可行。等结贴时100分奉上。
不过我还是想知道答案,感兴趣的继续讨论:(此问题如果解决另加100分)
为什么 CChildView 作为 CMainFrame 子窗口时一切正常,而换成其他的 CWnd 派生类就不正常,到底差在哪里呢?
这种办法把问题绕过去了,应该可行。等结贴时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(海子) 注意看清题目。
本来也没想用 View 。我就是很委婉的提醒 seasol(海子) 注意看清题目。