电竞比分网-中国电竞赛事及体育赛事平台

分享

Visual FoxPro 下的 Vista Aero Glass — Windows L...

 bwwdlm 2010-12-15
9月11日

Visual FoxPro 下的 Vista Aero Glass

翻譯:xinjie

Aero Glass 效果

    當(dāng)透明表單剛剛出現(xiàn)時(shí),就已經(jīng)有了一些關(guān)于它的一些技術(shù),它是來自 Windows Vista 的具有強(qiáng)烈震撼的 Aero Glass 效果。我的看法是,Aero Glass 效果是一個(gè)決定性的要素,它標(biāo)志著一個(gè)應(yīng)用程序可以運(yùn)行于 Windows Vista 。所以,一些開發(fā)者針對(duì)他們的應(yīng)用程序找到一些方式使它看上去非常像 Aero Glass 效果,這并不是特別能認(rèn)人感到驚喜。Bernard Bout 在他的博客中提供了一些非常好的示例。它需要開發(fā)時(shí)有好的視力,可以從 Cesar Chalom 和 GDI+ 可以得到一些幫助,它是 Windows Vista 的 Aero Glass 入門指南,Bernard 已經(jīng)給我留下了印象(隨后我也說出了我的看法)。請(qǐng)參看下面的他的博客連接來查看我討論過什么。

Visual FoxPro 怎樣運(yùn)行于 Vista

    創(chuàng)建一個(gè)具有 Aero Glass 效果的 Visual FoxPro 應(yīng)用程序非常容易。頂層表單(ShowWindow = 2)可以自動(dòng)適應(yīng)(標(biāo)題欄、控件和邊框)Aero Glass 。這是一件好事,Visual FoxPro 不需要改變就可以在微軟提供的操作系統(tǒng)中得到最新最好的視覺效果(還記得在 VFP 中增加的主題支持嗎?)。替代方案并不是真實(shí)的,這種方案才是真實(shí)的(參看下面的截圖,一個(gè) ShowWindow = 0 或 1 的 VFP 表單)。

在開始之前需要了解的

    我知道你在讀這些內(nèi)容時(shí)在想什么:“Craig, 你在這里講的 Windows Vista 中實(shí)現(xiàn) Aero Glass 效果和其他已經(jīng)展示的方法相比,沒什么新的東西!”。 然而,你大概還沒有看到過在客戶區(qū)域(表面的區(qū)域)顯示出 Aero Glass 效果的 VFP 表單(我不相信你曾經(jīng)看到過),這就是我要討論的東西。下面的截圖是一個(gè)例子,也就是我要討論的東西。

它是如何做到的?

    為了實(shí)現(xiàn)它,我使用了來自 Windows Vista 中 Desktop Window Manager API (dwmapi.dll) 的函數(shù)  DwmExtendFrameIntoClientArea 。在 MSDN 中該函數(shù)是這樣聲明的:

HRESULT DwmExtendFrameIntoClientArea(
HWND hWnd,
const MARGINS *pMarInset
);

并且,MARGINS 結(jié)構(gòu)(參看上面代碼的 pMarInset 參數(shù))是這樣定義的:

typedef struct _MARGINS{
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS

    我將它轉(zhuǎn)換成下面的聲明格式,并且將代碼增加到運(yùn)行于 Windows Vista 的 Visual FoxPro 9.0 的頂層表單的 Init() 事件中:

DECLARE LONG DwmExtendFrameIntoClientArea IN dwmapi.dll Long hwnd, string @ pMarInset

LOCAL lnHwnd, lcMargin, lnGlassLeft, lnGlassRight, lnGlassTop, lnGlassBottom

m.lnHwnd = this.HWnd
m.lnGlassLeft = 50
m.lnGlassRight = 50
m.lnGlassTop = 50
m.lnGlassBottom = 50
m.lcMargin = BINTOC(m.lnGlassLeft, '4RS') ;
            + BINTOC(m.lnGlassRight, '4RS') ;
            + BINTOC(m.lnGlassTop, '4RS') ;
            + BINTOC(m.lnGlassBottom, '4RS')

DwmExtendFrameIntoClientArea(m.lnHwnd, @m.lcMargin)

    這段代碼在我的頂層表單中并沒有顯示出任何效果,我知道我遇到了一個(gè)難題。答案來自 article out on Code Project 。它指出,DwmExtendFrameIntoClientArea 函數(shù)的工作需要將作為神奇的 Aero Glass 效果的像素設(shè)置它們自己的 Alpha channel ,且設(shè)置為 0 。并且,文章指出,最容易的方式就是將這些像素設(shè)置為黑色。

    所以,相比于綁定 windows 消息,我選擇使用 GDI+ 來實(shí)現(xiàn)它(我確信可以),在表單中使用一些黑色的 VFP shapes 。我在表單中放置了 4 個(gè) shape ,并且設(shè)置了它們的寬高(依賴于它們所在的位置),以匹配我已經(jīng)賦值的 m.lnGlassLeft、m.lnGlassRight、m.lnGlassTop 和 m.lnGlassBottom (參看上面的代碼,我偽造了一個(gè) MARGINS 結(jié)構(gòu))。設(shè)計(jì)結(jié)束的表單,在設(shè)計(jì)器中就是下面截圖這個(gè)樣子。并且,當(dāng)我運(yùn)行它時(shí),我得到了一個(gè)在客戶區(qū)域具有 Aero Glass 效果的 VFP 表單!

這樣做的好處是什么?

    使用這個(gè)方法已經(jīng)設(shè)計(jì)出了很多偉大的 UI 示例。如果你在 Code Project article 查找的話,可以找到很多。簡(jiǎn)而言之,針對(duì) Visual FoxPro 應(yīng)用程序,用它來創(chuàng)建 UI 的結(jié)構(gòu)是一個(gè)好方法。

    一個(gè)很好的應(yīng)用就是創(chuàng)建一個(gè)頂層表單,它具有狀態(tài)欄,其中包含一個(gè)進(jìn)度條和其他一些控件。下面的圖片是一個(gè)簡(jiǎn)單的示例,展示了它的效果。我使用了和上面同樣的代碼,僅僅更改參數(shù)  m.lnGlassBottom 為 50 (其他都設(shè)置為  0) ,且底部的 shape 的背景色設(shè)置為黑色。

還需要做更多的工作

    這個(gè)概念的證明并沒有完成,我們需要放置在客戶區(qū)域的任何 VFP 類/控件 都可以使用 Aero Glass 效果,但是存在一些問題。這是因?yàn)椋憧梢赃@樣假設(shè),任何的東西都是黑色的(像前景色和背景色),都可以轉(zhuǎn)換成半透明。圍繞這個(gè)有幾種方法來使用 ActiveX 控件/Windows 類 ,就像我在表單上使用  Microsoft ProgressBar Control(5.0 sp2)。另一些方法就是使用圖形元素和使用 GDI+ 的文本。在這方面,來自 Visual FoxPro 9.0 中的 _gdiplus.vcx 和 VFPX 中 GDIPlusX project 可以很好的處理它。無論如何,我們知道在 Visual FoxPro 9 中很容易的實(shí)現(xiàn) Aero Glass 效果是很好的消息。我對(duì)找到如此簡(jiǎn)單的實(shí)現(xiàn)方法既感到高興,又有些驚訝。

    一直到下次... Visual FoxPro 前進(jìn)!

 

 

 

 

 

 

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多