1.1 前言
这两天在看notepad++ 1.0版本的源代码。看了许久终于把程序的窗口之间的关系搞清楚了现在把其组织的要点写于此,希望对大家有所帮助。
1.2 窗口元素之间的关系
Notepad++主要有以下窗口元素(见下图)。
其中Notepad_plus 是程序的主要窗口,其他:工具栏、状态栏、主次编辑窗口、主次选项卡窗口以及对话框窗口均为主窗口的子窗口。
_mainDocTab 和 _subDocTab 为 类:DocTabView 其成员_pView 分别指向 _mainEditView和_subEditView即两个编辑窗口。这样方便了改变窗口大小是窗口的重新布局。见下节
1.3 窗口的布局
窗口的布局从Notepad_plus 的消息处理程序开始:
case WM_SIZE:// 窗口改变大小是重新布局 { RECT rc; getMainClientRect(rc);// exclude statusbar and toolbar area _pMainWindow->reSizeTo(rc); getStatusBarClientRect(rc); _statusBar.reSizeTo(rc); return TRUE; }
主窗口收到窗口大小被改变之后、对各个子窗口进行重新布局。
1. getMainClientRect(rc);// exclude statusbar and toolbar area
计算客户区(除去工具栏和状态栏的矩形窗口区域)。
2. _pMainWindow->reSizeTo(rc);
这里的_pMainWindow (在没有分裂编辑窗口时即只有一个编辑窗口时)是指向_mainDocTab的指针。将该函数调用展开如下:
virtual void DocTabView::reSizeTo(RECT & rc) { TabBar::reSizeTo(rc); rc.left += marge; rc.top += marge; rc.right -= 5; rc.bottom -= 10; _pView->reSizeTo(rc); };
这里的关键是函数TabBar::reSizeTo(rc);的调用。将其展开如下:
void TabBar::reSizeTo(RECT & rc2Ajust) { // Important to do that! // Otherwise, the window(s) it contains will take all the resouce of CPU // We don‘t need to resiz the contained windows if they are even invisible anyway! display(rc2Ajust.right > 10); Window::reSizeTo(rc2Ajust); TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust); }
这里 TabBar 将其窗口占满除工具栏和状态栏的区域。然后调用TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust);返回选项卡的客户去(出去标签的矩形区域)
这几层调用之后,我们再回到:
virtual void DocTabView::reSizeTo(RECT & rc) { TabBar::reSizeTo(rc); rc.left += marge; rc.top += marge; rc.right -= 5; rc.bottom -= 10; _pView->reSizeTo(rc); };
此时rc为选项卡的客户区,_pView为指向编辑窗口的指针,其调用reSizeTo函数将其窗口调整到合适的位置,
3. getStatusBarClientRect(rc);
_statusBar.reSizeTo(rc);
后两句顾名思义为调整状态栏位置
以上就是Notepad++ 1.0版本的 窗口布局要点
Notepad++源代码阅读——窗口元素组织与布局,布布扣,bubuko.com