按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
让我再多提醒你一些,第8章的「CDocTemplate 管理CDocument / CView / CFrameWnd 」
一节主要是说明当使用者打开一份文件,MFC 内部有关于Document / View / Frame 「三
位一体」的动态生成过程。其中View 的动态生成是在CFrameWnd::OnCreate 被唤起
后,经历一连串动作,最后才在CFrameWnd::CreateView 中完成的:
CFrameWnd::OnCreate
CFrameWnd::OnCreate
CFrameWnd::OnCreateHelper
CFrameWnd::OnCreateHelper
CFrameWnd::OnCreateClient
CFrameWnd::OnCreateClient
CFrameWnd::CreateView
CFrameWnd::CreateView
而我们现在,为了分裂窗口,正在改写其中第三个虚拟函数CFrameWnd::OnCreateClient
呢!
好了,回过头来,CreateView 的第四参数是窗口的初始大小,CSize(100; 0) 表示窗口宽
度为100 个图素。高度倒是不为0,对于横列为1 的分裂窗口而言,窗口高度永远为
窗口高度,Framework 并不理会你在CSize 中写了什么高度。至于第二个窗口的大小
CSize(0; 0) 道理雷同,Framework 并不加理会其值,因为对于纵行为2 的分裂窗口而
言,右边窗口的宽度永远是窗口总宽度减去左边窗口的宽度。
程序进行中如果需要窗口的大小,只要在OnDraw 函数(通常是这里需要)中这么写即
可:
RECT rc; this…》GetClientRect(&rc);
CreateView 的第五参数是CCreateContext 指针。我们只要把OnCreateClient 获得的第
二个参数依样画葫卢地传下去就是了。
710
…………………………………………………………Page 773……………………………………………………………
第 13 章 多重文件與多重顯示
窗口的静态三叉分裂
分裂的方向可以无限延伸。我们可以把一个静态分裂窗口的窗口再做静态分裂,下面的
程序代码展现了这种可能性:
// in header file
class CChildFrame : public CMDIChildWnd
{
。。。
protected:
CSplitterWnd m_wndSplitter1;
CSplitterWnd m_wndSplitter2;
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CChildFrame)
public:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs; CCreateContext* pContext);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
//}}AFX_VIRTUAL
。。。
};
// in implementation file
BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/;
CCreateContext* pContext)
{
// 产生静态分裂窗口,横列为 1,纵行为2。
m_wndSplitter1。CreateStatic(this; 1; 2);
// 产生分裂窗口的第一个窗口(标号 0;0)的view 窗口。
m_wndSplitter1。CreateView(0; 0; RUNTIME_CLASS(CTextView);
CSize(300; 0); pContext);
// 产生第二个分裂窗口,横列为2,纵行为1。位在第一个分裂窗口的(0;1)窗口
m_wndSplitter2。CreateStatic(&m_wndSplitter1; 2; 1;
WS_CHILD | WS_VISIBLE; m_wndSplitter1。IdFromRowCol(0; 1));
// 产生第二个分裂窗口的第一个窗口(标号0;0)的view 窗口。
m_wndSplitter2。CreateView(0; 0; RUNTIME_CLASS(CBarView);
CSize(0; 150); pContext);
// 产生第二个分裂窗口的第二个窗口(标号1;0)的view 窗口。
711
…………………………………………………………Page 774……………………………………………………………
第篇 深入 MFC 程式設計
m_wndSplitter2。CreateView(1; 0; RUNTIME_CLASS(CCurveView);
CSize(0; 0); pContext);
return TRUE;
}
这会产生如下的分裂窗口:
1 m_wndSplitter1。CreateStatic(this; 1; 2)
产生静态分裂窗口,横列为1 纵行为2 。
m_wndSplitter1。CreateView(0; 0; ;CSize(300;0)。。。)
2 产生第一个窗口(标号0;0)
m_wndSplitter2。CreateStatic(&m_wndSplitter1; 2; 1; 3
m_wndSplitter1。IdFromRowCol(0; 1)。。。)
产生静态分裂窗口,横列为2 纵行为1。位在第一个分裂窗口的(0;1)窗口
m_wndSplitter2。CreateView(0; 0; ;CSize(0;150)。。。)
4
产生第二个分裂窗口的第一个窗口(标号0;0)
m_wndSplitter2。CreateView(1; 0; ;CSize(0;0)。。。)
5
产生第二个分裂窗口的第二个窗口(标号1;0)
窗口 (0;1)
Splitter 窗口 (0;0) 窗口 (0;0)
窗口
150
初 始 高度
剩余高度