使用過Windows Vista 的用戶都會對Vista窗口的磨砂玻璃效果印象深刻,而如果你在Windows Vista 下使用過 Windows Media Player 11 更會發(fā)現(xiàn)微軟把這種效果擴展至WMP11的底部區(qū)域,使得WMP的底部按鈕區(qū)域成為一條“玻璃帶”,如圖:
事實上,Vista窗口的磨砂玻璃效果不僅限于窗體的邊框(非客戶區(qū)域),他可以任意的延伸,甚至鋪滿整個窗口,下面我們就來看看怎么用的VB6來實現(xiàn)這種擴展。
Vista實現(xiàn)磨砂玻璃效果主要依靠一組叫做 Desktop Window Manager (DWM) 的API來實現(xiàn),該組API均以dwm打頭,存在于dwmapi.dll中(該文件為Vista特有),顧名思義,這些API是專門用來實現(xiàn)Vista窗口的特效的。由于篇幅所限,這里僅介紹和本文關系最密切的兩個函數(shù):DwmIsCompositionEnabled 和 DwmExtendFrameIntoClientArea。
第一個函數(shù)DwmIsCompositionEnabled是用于判斷系統(tǒng)的磨砂玻璃合成效果是否已經開啟,因為該效果可以由用戶關閉,盡管你可以在用戶關閉合成效果的情況下在程序中單獨使用合成效果。
DwmIsCompositionEnabled的原型為:
HRESULT DwmIsCompositionEnabled( BOOL *pfEnabled )
其中pfEnabled為一個輸出參數(shù),告訴后面的程序合成效果是否被打開。
該函數(shù)的VB聲明為:
Public Declare Function DwmIsCompositionEnabled Lib "dwmapi.dll" (ByRef enabledptr As Long) As Long
這里要注意C++里的BOOL類型必須譯成vb中的Long而不是Boolean,否則你將得到錯誤的結果。
DwmExtendFrameIntoClientArea函數(shù)則用于將磨砂邊框擴展至窗體客戶區(qū),使得整個窗體看上就像一張卡片(sheet)。
該函數(shù)原型為:
HRESULT DwmExtendFrameIntoClientArea(HWND hWnd,const MARGINS *margins)
其中hWnd 為目標窗口句柄,margins為一個MARGINS結構體指針
MARGINS結構體定義為:
typedef struct _MARGINS
{
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS;
該函數(shù)的vb引用為:
Public Declare Function DwmExtendFrameIntoClientArea Lib "dwmapi.dll" (ByVal hwnd As Long, margin As MARGINS) As Long
MARGINS的vb形式定義:
Public Type MARGINS
m_Left As Long
m_Right As Long
m_Top As Long
m_Button As Long
End Type
其中MARGINS中的各個成員為需要擴展的邊框大小(單位:像素),如果要把磨砂玻璃效果鋪滿整個邊框(本文以此為例),全部成員可設置為-1
知道了這些,我們現(xiàn)在就可以動手了。
我們在窗體的Form_Load事件里寫上:
Dim mg As MARGINS, en As Long
mg.m_Left = -1
mg.m_Button = -1
mg.m_Right = -1
mg.m_Top = -1
DwmIsCompositionEnabled en
If en Then
DwmExtendFrameIntoClientArea Me.hwnd, mg
End If
事實上,Vista窗口的磨砂玻璃效果不僅限于窗體的邊框(非客戶區(qū)域),他可以任意的延伸,甚至鋪滿整個窗口,下面我們就來看看怎么用的VB6來實現(xiàn)這種擴展。
Vista實現(xiàn)磨砂玻璃效果主要依靠一組叫做 Desktop Window Manager (DWM) 的API來實現(xiàn),該組API均以dwm打頭,存在于dwmapi.dll中(該文件為Vista特有),顧名思義,這些API是專門用來實現(xiàn)Vista窗口的特效的。由于篇幅所限,這里僅介紹和本文關系最密切的兩個函數(shù):DwmIsCompositionEnabled 和 DwmExtendFrameIntoClientArea。
第一個函數(shù)DwmIsCompositionEnabled是用于判斷系統(tǒng)的磨砂玻璃合成效果是否已經開啟,因為該效果可以由用戶關閉,盡管你可以在用戶關閉合成效果的情況下在程序中單獨使用合成效果。
DwmIsCompositionEnabled的原型為:
HRESULT DwmIsCompositionEnabled( BOOL *pfEnabled )
其中pfEnabled為一個輸出參數(shù),告訴后面的程序合成效果是否被打開。
該函數(shù)的VB聲明為:
Public Declare Function DwmIsCompositionEnabled Lib "dwmapi.dll" (ByRef enabledptr As Long) As Long
這里要注意C++里的BOOL類型必須譯成vb中的Long而不是Boolean,否則你將得到錯誤的結果。
DwmExtendFrameIntoClientArea函數(shù)則用于將磨砂邊框擴展至窗體客戶區(qū),使得整個窗體看上就像一張卡片(sheet)。
該函數(shù)原型為:
HRESULT DwmExtendFrameIntoClientArea(HWND hWnd,const MARGINS *margins)
其中hWnd 為目標窗口句柄,margins為一個MARGINS結構體指針
MARGINS結構體定義為:
typedef struct _MARGINS
{
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS;
該函數(shù)的vb引用為:
Public Declare Function DwmExtendFrameIntoClientArea Lib "dwmapi.dll" (ByVal hwnd As Long, margin As MARGINS) As Long
MARGINS的vb形式定義:
Public Type MARGINS
m_Left As Long
m_Right As Long
m_Top As Long
m_Button As Long
End Type
其中MARGINS中的各個成員為需要擴展的邊框大小(單位:像素),如果要把磨砂玻璃效果鋪滿整個邊框(本文以此為例),全部成員可設置為-1
知道了這些,我們現(xiàn)在就可以動手了。
我們在窗體的Form_Load事件里寫上:
Dim mg As MARGINS, en As Long
mg.m_Left = -1
mg.m_Button = -1
mg.m_Right = -1
mg.m_Top = -1
DwmIsCompositionEnabled en
If en Then
DwmExtendFrameIntoClientArea Me.hwnd, mg
End If

