MFC框架程式中全屏顯示特性的實現

2021-06-16 01:44:24 字數 1955 閱讀 5921

大家知道,在mfc框架中並沒有提供現成的類或者函式來實現全屏顯示特性,至少我到目前為止是沒有發現。但是要實現這個特性也並不難。其基本思路是調整主視窗的大小和位置,使檢視的顯示充滿螢幕。它需要以螢幕左上角為原點,處理x,y方向上的負座標。本文擬用「

使用gdi+進行影象處理

」一文中的例子**作為基礎,實現檢視的全屏顯示。我在原來**中增加了乙個可重用的c++類cfullscreenhandler,顧名思義,這個類的作用就是專門用來實現全屏顯示特性的,它封裝了所有的實現細節,只要你把它加到自己的工程**中,不用怎麼修改就能是程式具備全屏顯示功能。這個類中有兩個重要的方法呼叫:第一、maximize進入全屏顯示模式,注意了,這裡的全屏顯示模式並不是平常我們說的視窗最大化按鈕哦。第二、restore方法用來恢復原來的視窗框架。cfullscreenhandler還提供了乙個infullscreenmode方法,用它來檢查程式是否處於全屏顯示狀態,這些方法都通過乙個cfullscreenhandler全程物件例項來呼叫。下面是程式的主視窗處理命令,全屏顯示特性由「檢視」選單中的「全屏顯示(&u)」觸發執行,關鍵**如下:

void cmainframe::onviewfullscreen() 

一旦進入全屏顯示方式,那麼標題欄、選單欄和工具欄都會消失。千萬別忘了告訴使用者如何恢復原樣,在ondraw函式中加上幾句即可:
void cpictureview::ondraw(cdc* pdc)

}

如圖一所示:

圖一 給使用者的恢復提示

之所以一定要給使用者這種提示,是因為windows程式的乙個重要的gui特點就是介面操作的自解釋。否則,當使用者進入全屏顯示模式後(有意或無意),如果找不到恢復的方法便會令使用者感到不知所措。 

下面我們就來看看cfullscreenhandler::maximize和restore的工作原理:其實這些**沒有什麼高深的東西,只是一些象素計算而已。maximize首先在m_rcrestore資料成員中儲存當前框架的位置,然後計算期望的螢幕尺寸。如圖二所示:

圖二 計算期望的螢幕尺寸

獲得螢幕尺寸的方法是呼叫getsystemmetrics函式。 restore函式比maximize更簡單,它用m_rcrestore成員變數中儲存的值將框架恢復到原來的樣子,然後呼叫m_rcrestore.setrectempty來表示框架不再處於全屏顯示狀態。就這麼簡單。

程式中有乙個地方要說明一下,那就是ongetminmaxinfo函式的作用。你可以試一下,如果把這個函式去掉,則當你按下工具欄中的全屏顯示按鈕時,框架檢視確實變大了,但沒有想象的那樣實現全屏顯示,底邊留下乙個狀態列——乙個有些發育不良的全屏顯示視窗。為什麼會這樣呢?經過除錯後,發現問題出在wm_getminmaxinfo訊息的處理上。在windows中,無論什麼時候以何種方式改變視窗的尺寸或大小,是拖拽視窗邊緣也好,或是在**中呼叫改變視窗尺寸的函式也好,總之不管你用什麼方法,windows都會首先傳送wm_getminmaxinfo訊息。這個訊息的意思是說:「嘿,如果你要強迫我的尺寸變大或變小,就附上詳細的minmaxinfo結構資訊,否則我用預設值處理。」大多數應用程式都不用顯式處理這個wm_getminmaxinfo訊息(也就是說讓defwindowproc視窗過程進行預設處理),而windows在進行預設處理時是不會讓乙個視窗檢視比螢幕還大的,所以我們會碰上前面講的那個問題。解決的方法是:不要讓windows對wm_getminmaxinfo訊息進行預設處理,而是由我們自己處理,方法如下:

void cmainframe::ongetminmaxinfo(minmaxinfo* lpmmi)

這裡cfullscreenhandler.getmaxsize 返回的最大尺寸要比整個螢幕稍微大一點。
csize cfullscreenhandler::getmaxsize()

getmaxsize 返回的值分別是2×10=20和2×50=100象素,比螢幕自身的水平值和垂直值稍大。至於要大多少,我認為只要乙個比螢幕大的模糊值即可。如果你硬要知道螢幕的精確尺寸,自己可以計算一下。

在MFC程式中新增全屏顯示功能

這是工作室為實現全屏顯示所髮集的乙個演示程式。你可以通過選擇全屏顯示選單選項時看到相應的效果。這段 包括兩個內容 全屏顯示,浮動工具條 用於恢復操作 下圖便是全屏狀態和用於切換的浮動工具條 具體實現步驟 以下的 被新增到cmainframe類中。這裡是使用到的四個訊息以及他們的簡要說明 1 onvi...

在MFC程式中新增全屏顯示功能

這是工作室為實現全屏顯示所髮集的乙個演示程式。你可以通過選擇全屏顯示選單選項時看到相應的效果。這段 包括兩個內容 全屏顯示,浮動工具條 用於恢復操作 以下的 被新增到cmainframe類中。這裡是使用到的四個訊息以及他們的簡要說明 1 onviewfullscreen 全屏顯示選單項的控制代碼。2...

MFC框架程式中OnIdle的介紹

先看下msdn對onidle 介紹 mfc預設處理 如果忘掉了的話,你會發現一些mfc的ui會出現問題,比如選單上的選擇狀態無法更新等問題。再下面加上你自已的處理函式即可 yourmethod return true 需要更多次的執行。對於mfc程式來講,很多是採用mfc的文件檢視類的框架。比如如果...