標籤:style blog http color width 2014
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版本的 視窗布局要點