VC 實現單文件程式的全屏顯示及恢復

2021-04-14 22:57:34 字數 4014 閱讀 6541

vc++實現單文件程式的全屏顯示及恢復

一、 引言

在編輯類軟體或程式**編輯程式中經常要遇到一些長度特別大的文字或**,尤其是對於程式原始碼的編輯,如果編輯介面太小,則需要頻繁拉動滾動條,對於程式設計師而言是很不情願的,因為這樣會打斷程式的設計思路、影響程式設計的效果。因此不少軟體都具備了全屏放大的功能,將編輯介面放大到全螢幕,盡最大限度地減少對滾動條的依賴程度。相信不少程式設計師一定非常喜歡在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_b*******wasvisible=(m_wnd*******.iswindowvisible()!=0);

m_wnd*******.showwindow(sw_hide);

m_bstatusbarwasvisible=(m_wndstatusbar.iswindowvisible()!=0);

m_wndstatusbar.showwindow(sw_hide);

…… //由於在全屏狀態下沒有系統選單和工具條,所以需要顯示乙個浮動的工具條按鈕用於//從全屏狀態下返回到正常狀態。

//首先建立乙個工具條物件,並把乙個工具條資源裝載進來,同時對工具條的風格進行//設定:

m_pwndfullscreenbar=new c*******;

m_pwndfullscreenbar->create(this);

m_pwndfullscreenbar->load*******(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(**_cxscreen);

int screeny=getsystemmetrics(**_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_b*******wasvisible)

m_wnd*******.showwindow(sw_show);

if(m_bstatusbarwasvisible)

m_wndstatusbar.showwindow(sw_show);

movewindow(&m_mainrect);

recalclayout();

…… 

小結:

本文主要是針對單文件框架的程式進行設計的,由於不涉及到子窗體,因此比較簡單。對於多文件的全屏放大,實現方法在總體思路上是與之相一致的。只是在處理全屏顯示與恢復時需要將程式子框架也響應的進行放大與縮小,標題欄也要通過改變視窗風格的方式來隱藏與恢復顯示。本程式對於其他基於非編輯檢視的程式也是適用的。本文所述程式在windows 2000 professional下由microsoft visual c++ 6.0編譯通過。從今天開始,我只討厭你乙個人,欺負你,虐待你,你開心我就弄的你不開心,你不開心我就超級開心,別人欺負你我就在第一時間出來踩你,對你說的每一句話都是假話,答應你的每一件事都懶得去做,永遠覺得每乙個人都比你漂亮,連做夢都要鄙視你  

VC 實現單文件程式的全屏顯示及恢復

摘要 本文對在vc下單文件程式的全屏顯示及其恢復的實現過程作了介紹。關鍵字 窗體 全屏顯示 visual c 一 引言 在編輯類軟體或程式 編輯程式中經常要遇到一些長度特別大的文字或 尤其是對於程式原始碼的編輯,如果編輯介面太小,則需要頻繁拉動滾動條,對於程式設計師而言是很不情願的,因為這樣會打斷程...

VC 實現程式全屏顯示

全屏顯示在許多應用程式中都得到了應用。實現此功能的原理很簡單 cwnd類中movewindow 函式可以按照指定引數來顯示視窗。在執行視窗最大化以前利用getwindowplacement 函式先把視窗的當前位置儲存在乙個變數中,執行視窗最大化後可以通過setwindowplacement 函式呼叫...

VC 實現程式全屏顯示

全屏顯示在許多應用程式中都得到了應用。實現此功能的原理很簡單 cwnd類中movewindow 函式可以按照指定引數來顯示視窗。在執行視窗最大化以前利用getwindowplacement 函式先把視窗的當前位置儲存在乙個變數中,執行視窗最大化後可以通過setwindowplacement 函式呼叫...