一、 引言
在編輯類軟體或程式碼編輯程式中經常要遇到一些長度特別大的文本或代碼,尤其是對於程式源碼的編輯,如果編輯介面太小,則需要頻繁拉動捲軸,對於程式員而言是很不情願的,因為這樣會打斷程式的設計思路、影響編程的效果。因此不少軟體都具備了全屏放大的功能,將編輯介面放大到全螢幕,盡最大限度地減少對捲軸的依賴程度。相信不少程式員一定非常喜歡在VC的全屏編輯狀態下編程,本文就以Visual C++ 6.0為開發環境將普通的單文檔編輯檢視程式擴充為全屏編輯功能。
二、 程式的設計思路
普通常規程式之所以在最大化的情況下沒能實現全屏,是由於狀態條、工具條、系統功能表、標題列等幾個視窗分別佔據了一部分螢幕空間,所以實現視圖的全螢幕顯示首先要把以上幾個表單隱藏起來,然後才可以考慮將視圖最大化的問題。
隱藏狀態列、工具條,可以將其當作一個浮動的表單,只需通過各自的控制代碼將ShowWindow()函數的參數設成SW_HIDE即可將這幾個表單隱藏,同視圖非常類似,在需要顯示的時候可以用SW_SHOW標誌將其顯示出來。在此需要說明的是在進行全屏操作之前需要將當前的視圖設定儲存好,這在從全屏恢複為原始狀態時需要用到。該操作也比較簡單,只需簡單調用API函數GetWindowRect()即可。至於標題列的隱藏就不是簡單的隱藏視窗了,這涉及到表單風格的修改,要把WS_CAPTION風格從現有的表單風格中剝離出來。這可以先用GetWindowLong()擷取到當前的表單風格,然後通過邏輯運算將WS_CAPTION風格從中剝離開來,最後再用SetWindowLong()函數將修改後的表單風格設定為當前的表單風格。至於系統功能表的隱藏也可以很方便的加以實現:先儲存當前菜單,然後將菜單設定為"空"就實現了菜單的隱藏。各個表單都隱藏好後剩下的工作就是將編輯檢視放大到滿屏,可以用this來擷取當前的視圖指標,並把ShowWindow ()函數的參數設為SW_SHOWMAXIMIZED就最終完成了整個全屏放大的全過程。
至於從全屏恢複到初始狀態則完全是上述過程的逆操作:通過邏輯運算把WS_CAPTION風格加入到表單風格中,恢複標題列的顯示;通過將狀態條和工具條的ShowWindow()函數的標誌參數設成WM_SHOW將其分別予以恢複;系統功能表也可以通過從儲存好的原始菜單中讀取並重新設定來恢複其原始面貌。現在僅把隱藏的各個表單顯示了出來,表單還是處於滿屏狀態,所以還要通過MoveWindow()函數把表單的位置恢複到全屏前的狀態,這也是我們為何在全屏時要儲存表單的一些原始參數的原因。
三、 程式的具體實現
前面部分在大體思路上對程式的設計實現進行了粗略的分析,但在實際編程中有不少的細節還未考慮進去,下面就根據前面的程式設計思路對其進行編碼,並結合其部分關鍵代碼進行講解說明,以便於更好的理解本程式的實現方法:
全螢幕顯示部分:
//通過設定SW_HIDE參數隱藏當前的工具條、工作列 m_bToolBarWasVisible=(m_wndToolBar.IsWindowVisible()!=0); m_wndToolBar.ShowWindow(SW_HIDE); m_bStatusBarWasVisible=(m_wndStatusBar.IsWindowVisible()!=0); m_wndStatusBar.ShowWindow(SW_HIDE); …… //由於在全屏狀態下沒有系統功能表和工具條,所以需要顯示一個浮動的工具條按鈕用於//從全屏狀態下返回到正常狀態。 //首先建立一個工具條對象,並把一個工具條資源裝載進來,同時對工具條的風格進行//設定: m_pwndFullScreenBar=new CToolBar; m_pwndFullScreenBar->Create(this); m_pwndFullScreenBar->LoadToolBar(IDR_FULLSCREEN); m_pwndFullScreenBar->SetBarStyle(m_pwndFullScreenBar->GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); //浮動按鈕的效果 m_pwndFullScreenBar->ModifyStyle(0, TBSTYLE_FLAT); m_pwndFullScreenBar->EnableDocking(0); //設定返回到正常狀態下的按鈕的位置 CPoint pt(300,200); FloatControlBar(m_pwndFullScreenBar,pt); //在放大到滿屏前預先儲存當前的視窗位置 GetWindowRect(&m_mainRect); //通過改變視窗風格來隱藏標題列 LONG style=::GetWindowLong(m_hWnd,GWL_STYLE); style&=~WS_CAPTION; ::SetWindowLong(m_hWnd,GWL_STYLE,style); int screenx=GetSystemMetrics(SM_CXSCREEN); int screeny=GetSystemMetrics(SM_CYSCREEN); //重新改變大小: SetWindowPos(NULL,0,0,screenx,screeny,SWP_NOZORDER); style=::GetWindowLong(m_hWnd,GWL_STYLE); m_bChildMax=(style & WS_MAXIMIZE)?true:false; //儲存原有的系統功能表,並將當前菜單設定為空白 CMenu* pOldMenu=GetMenu(); m_OrgMenu.Attach(pOldMenu->Detach()); SetMenu((CMenu*)NULL); //在其他表單隱藏好後,將編輯檢視放大到滿屏 this->ShowWindow (SW_SHOWMAXIMIZED); …… |
至於從全屏恢複到初始狀態的這部分代碼則相對比較簡單,只需依次將隱藏的各個表單和菜單恢複出來並將視圖移動到原來大小即可,該段代碼許多地方同放大到全屏時的代碼相似,只是參數有所差異而已。下面就是恢複部分的主要代碼:
…… //將儲存的系統功能表恢複出來 SetMenu(&m_OrgMenu); m_OrgMenu.Detach(); //釋放掉在全屏時建立的工具條指標對象,由於是用new建立的,在系統堆中為指標分//配地址空間,在程式退出時不能自動釋放,所以必須要用delete顯式地進行釋放 delete m_pwndFullScreenBar; //把前面剝離出去的WS_CAPTION風格在加入到表單風格中。 LONG style=::GetWindowLong(m_hWnd,GWL_STYLE); style|=WS_CAPTION; ::SetWindowLong(m_hWnd,GWL_STYLE,style); //顯示工具條、工作列 if(m_bToolBarWasVisible) m_wndToolBar.ShowWindow(SW_SHOW); if(m_bStatusBarWasVisible) m_wndStatusBar.ShowWindow(SW_SHOW); MoveWindow(&m_mainRect); RecalcLayout(); …… |
小結:
本文主要是針對單文檔架構的程式進行設計的,由於不涉及到子表單,因此比較簡單。對於多文檔的全屏放大,實現方法在總體思路上是與之相一致的。只是在處理全螢幕顯示與恢複時需要將程式子架構也響應的進行放大與縮小,標題列也要通過改變視窗風格的方式來隱藏與恢複顯示。本程式對於其他基於非編輯檢視的程式也是適用的。本文所述程式在Windows 2000 Professional下由Microsoft Visual C++ 6.0編譯通過。