现在,越来越多的软件提供了透明磨砂玻璃效果。典型的例子是软媒的魔方和软媒的闪游

笔者这系统可算是后现代主意义——Vista桌面壁纸中的Windows 7~~

步入正题。

给大家晾一下dwmapi.h的内容

 

dwmapi.h
/*=========================================================================*\

Copyright (c) Microsoft Corporation. All rights reserved.

File: dwmapi.h

Module Name: dwmapi

Description: DWM API declarations

\*=========================================================================
*/
#ifndef _DWMAPI_H_
#define _DWMAPI_H_


#ifndef DWMAPI
#if !defined(_DWMAPI_)
#define DWMAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define DWMAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#else
#define DWMAPI STDAPI
#define DWMAPI_(type) STDAPI_(type)
#endif /* _DWMAPI_ */
#endif /* DWMAPI */

#ifdef __cplusplus
extern "C"
{
#endif


#ifndef MILCORE_KERNEL_COMPONENT
#include
<wtypes.h>
#include
<uxtheme.h>
#endif

#include
<pshpack1.h>

// Blur behind data structures
#define DWM_BB_ENABLE 0x00000001 // fEnable has been specified
#define DWM_BB_BLURREGION 0x00000002 // hRgnBlur has been specified
#define DWM_BB_TRANSITIONONMAXIMIZED 0x00000004 // fTransitionOnMaximized has been specified

typedef
struct _DWM_BLURBEHIND
{
DWORD dwFlags;
BOOL fEnable;
HRGN hRgnBlur;
BOOL fTransitionOnMaximized;
} DWM_BLURBEHIND,
*PDWM_BLURBEHIND;

// Window attributes
enum DWMWINDOWATTRIBUTE
{
DWMWA_NCRENDERING_ENABLED
= 1, // [get] Is non-client rendering enabled/disabled
DWMWA_NCRENDERING_POLICY, // [set] Non-client rendering policy
DWMWA_TRANSITIONS_FORCEDISABLED, // [set] Potentially enable/forcibly disable transitions
DWMWA_ALLOW_NCPAINT, // [set] Allow contents rendered in the non-client area to be visible on the DWM-drawn frame.
DWMWA_CAPTION_BUTTON_BOUNDS, // [get] Bounds of the caption button area in window-relative space.
DWMWA_NONCLIENT_RTL_LAYOUT, // [set] Is non-client content RTL mirrored
DWMWA_FORCE_ICONIC_REPRESENTATION, // [set] Force this window to display iconic thumbnails.
DWMWA_FLIP3D_POLICY, // [set] Designates how Flip3D will treat the window.
DWMWA_EXTENDED_FRAME_BOUNDS, // [get] Gets the extended frame bounds rectangle in screen space
DWMWA_HAS_ICONIC_BITMAP, // [set] Indicates an available bitmap when there is no better thumbnail representation.
DWMWA_DISALLOW_PEEK, // [set] Don't invoke Peek on the window.
DWMWA_EXCLUDED_FROM_PEEK, // [set] LivePreview exclusion information
DWMWA_LAST
};

// Non-client rendering policy attribute values
enum DWMNCRENDERINGPOLICY
{
DWMNCRP_USEWINDOWSTYLE,
// Enable/disable non-client rendering based on window style
DWMNCRP_DISABLED, // Disabled non-client rendering; window style is ignored
DWMNCRP_ENABLED, // Enabled non-client rendering; window style is ignored
DWMNCRP_LAST
};

// Values designating how Flip3D treats a given window.
enum DWMFLIP3DWINDOWPOLICY
{
DWMFLIP3D_DEFAULT,
// Hide or include the window in Flip3D based on window style and visibility.
DWMFLIP3D_EXCLUDEBELOW, // Display the window under Flip3D and disabled.
DWMFLIP3D_EXCLUDEABOVE, // Display the window above Flip3D and enabled.
DWMFLIP3D_LAST
};


// Thumbnails
typedef HANDLE HTHUMBNAIL;
typedef HTHUMBNAIL
* PHTHUMBNAIL;

#define DWM_TNP_RECTDESTINATION 0x00000001
#define DWM_TNP_RECTSOURCE 0x00000002
#define DWM_TNP_OPACITY 0x00000004
#define DWM_TNP_VISIBLE 0x00000008
#define DWM_TNP_SOURCECLIENTAREAONLY 0x00000010

typedef
struct _DWM_THUMBNAIL_PROPERTIES
{
DWORD dwFlags;
RECT rcDestination;
RECT rcSource;
BYTE opacity;
BOOL fVisible;
BOOL fSourceClientAreaOnly;
} DWM_THUMBNAIL_PROPERTIES,
*PDWM_THUMBNAIL_PROPERTIES;

// Video enabling apis

typedef ULONGLONG DWM_FRAME_COUNT;
typedef ULONGLONG QPC_TIME;

typedef
struct _UNSIGNED_RATIO
{
UINT32 uiNumerator;
UINT32 uiDenominator;
} UNSIGNED_RATIO;

typedef
struct _DWM_TIMING_INFO
{
UINT32 cbSize;

// Data on DWM composition overall

// Monitor refresh rate
UNSIGNED_RATIO rateRefresh;

// Actual period
QPC_TIME qpcRefreshPeriod;

// composition rate
UNSIGNED_RATIO rateCompose;

// QPC time at a VSync interupt
QPC_TIME qpcVBlank;

// DWM refresh count of the last vsync
// DWM refresh count is a 64bit number where zero is
// the first refresh the DWM woke up to process
DWM_FRAME_COUNT cRefresh;

// DX refresh count at the last Vsync Interupt
// DX refresh count is a 32bit number with zero
// being the first refresh after the card was initialized
// DX increments a counter when ever a VSync ISR is processed
// It is possible for DX to miss VSyncs
//
// There is not a fixed mapping between DX and DWM refresh counts
// because the DX will rollover and may miss VSync interupts
UINT cDXRefresh;

// QPC time at a compose time.
QPC_TIME qpcCompose;

// Frame number that was composed at qpcCompose
DWM_FRAME_COUNT cFrame;

// The present number DX uses to identify renderer frames
UINT cDXPresent;

// Refresh count of the frame that was composed at qpcCompose
DWM_FRAME_COUNT cRefreshFrame;


// DWM frame number that was last submitted
DWM_FRAME_COUNT cFrameSubmitted;

// DX Present number that was last submitted
UINT cDXPresentSubmitted;

// DWM frame number that was last confirmed presented
DWM_FRAME_COUNT cFrameConfirmed;

// DX Present number that was last confirmed presented
UINT cDXPresentConfirmed;

// The target refresh count of the last
// frame confirmed completed by the GPU
DWM_FRAME_COUNT cRefreshConfirmed;

// DX refresh count when the frame was confirmed presented
UINT cDXRefreshConfirmed;

// Number of frames the DWM presented late
// AKA Glitches
DWM_FRAME_COUNT cFramesLate;

// the number of composition frames that
// have been issued but not confirmed completed
UINT cFramesOutstanding;


// Following fields are only relavent when an HWND is specified
// Display frame


// Last frame displayed
DWM_FRAME_COUNT cFrameDisplayed;

// QPC time of the composition pass when the frame was displayed
QPC_TIME qpcFrameDisplayed;

// Count of the VSync when the frame should have become visible
DWM_FRAME_COUNT cRefreshFrameDisplayed;

// Complete frames: DX has notified the DWM that the frame is done rendering

// ID of the the last frame marked complete (starts at 0)
DWM_FRAME_COUNT cFrameComplete;

// QPC time when the last frame was marked complete
QPC_TIME qpcFrameComplete;

// Pending frames:
// The application has been submitted to DX but not completed by the GPU

// ID of the the last frame marked pending (starts at 0)
DWM_FRAME_COUNT cFramePending;

// QPC time when the last frame was marked pending
QPC_TIME qpcFramePending;

// number of unique frames displayed
DWM_FRAME_COUNT cFramesDisplayed;

// number of new completed frames that have been received
DWM_FRAME_COUNT cFramesComplete;

// number of new frames submitted to DX but not yet complete
DWM_FRAME_COUNT cFramesPending;

// number of frames available but not displayed, used or dropped
DWM_FRAME_COUNT cFramesAvailable;

// number of rendered frames that were never
// displayed because composition occured too late
DWM_FRAME_COUNT cFramesDropped;

// number of times an old frame was composed
// when a new frame should have been used
// but was not available
DWM_FRAME_COUNT cFramesMissed;

// the refresh at which the next frame is
// scheduled to be displayed
DWM_FRAME_COUNT cRefreshNextDisplayed;

// the refresh at which the next DX present is
// scheduled to be displayed
DWM_FRAME_COUNT cRefreshNextPresented;

// The total number of refreshes worth of content
// for this HWND that have been displayed by the DWM
// since DwmSetPresentParameters was called
DWM_FRAME_COUNT cRefreshesDisplayed;

// The total number of refreshes worth of content
// that have been presented by the application
// since DwmSetPresentParameters was called
DWM_FRAME_COUNT cRefreshesPresented;


// The actual refresh # when content for this
// window started to be displayed
// it may be different than that requested
// DwmSetPresentParameters
DWM_FRAME_COUNT cRefreshStarted;

// Total number of pixels DX redirected
// to the DWM.
// If Queueing is used the full buffer
// is transfered on each present.
// If not queuing it is possible only
// a dirty region is updated
ULONGLONG cPixelsReceived;

// Total number of pixels drawn.
// Does not take into account if
// if the window is only partial drawn
// do to clipping or dirty rect management
ULONGLONG cPixelsDrawn;

// The number of buffers in the flipchain
// that are empty. An application can
// present that number of times and guarantee
// it won't be blocked waiting for a buffer to
// become empty to present to
DWM_FRAME_COUNT cBuffersEmpty;

} DWM_TIMING_INFO;

typedef
enum
{
// Use the first source frame that
// includes the first refresh of the output frame
DWM_SOURCE_FRAME_SAMPLING_POINT,

// use the source frame that includes the most
// refreshes of out the output frame
// in case of multiple source frames with the
// same coverage the last will be used
DWM_SOURCE_FRAME_SAMPLING_COVERAGE,

// Sentinel value
DWM_SOURCE_FRAME_SAMPLING_LAST
} DWM_SOURCE_FRAME_SAMPLING;

static const UINT c_DwmMaxQueuedBuffers = 8;
static const UINT c_DwmMaxMonitors = 16;
static const UINT c_DwmMaxAdapters = 16;

#pragma warning(push)
#pragma warning(disable:4201)
typedef
struct _DWM_PRESENT_PARAMETERS
{
UINT32 cbSize;
BOOL fQueue;
DWM_FRAME_COUNT cRefreshStart;
UINT cBuffer;
BOOL fUseSourceRate;
UNSIGNED_RATIO rateSource;
UINT cRefreshesPerFrame;
DWM_SOURCE_FRAME_SAMPLING eSampling;
} DWM_PRESENT_PARAMETERS;
#pragma warning(pop)



#define DWM_FRAME_DURATION_DEFAULT -1

DWMAPI_(BOOL)
DwmDefWindowProc(
__in HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam,
__out LRESULT
*plResult
);

DWMAPI
DwmEnableBlurBehindWindow(
HWND hWnd,
__in
const DWM_BLURBEHIND* pBlurBehind
);

#define DWM_EC_DISABLECOMPOSITION 0
#define DWM_EC_ENABLECOMPOSITION 1


DWMAPI
DwmEnableComposition(
UINT uCompositionAction
);

DWMAPI
DwmEnableMMCSS(
BOOL fEnableMMCSS
);

DWMAPI
DwmExtendFrameIntoClientArea(
HWND hWnd,
__in
const MARGINS* pMarInset
);

DWMAPI
DwmGetColorizationColor(
__out DWORD
* pcrColorization,
__out BOOL
* pfOpaqueBlend
);

DWMAPI
DwmGetCompositionTimingInfo(
HWND hwnd,
__out DWM_TIMING_INFO
* pTimingInfo
);


DWMAPI
DwmGetWindowAttribute(
HWND hwnd,
DWORD dwAttribute,
__out_bcount(cbAttribute) PVOID pvAttribute,
DWORD cbAttribute
);

DWMAPI
DwmIsCompositionEnabled(
__out BOOL
* pfEnabled
);

DWMAPI
DwmModifyPreviousDxFrameDuration(
HWND hwnd,
INT cRefreshes,
BOOL fRelative
);

DWMAPI
DwmQueryThumbnailSourceSize(
HTHUMBNAIL hThumbnail,
__out PSIZE pSize
);

DWMAPI
DwmRegisterThumbnail(
HWND hwndDestination,
HWND hwndSource,
__out PHTHUMBNAIL phThumbnailId
);

DWMAPI
DwmSetDxFrameDuration(
HWND hwnd,
INT cRefreshes
);

DWMAPI
DwmSetPresentParameters(
HWND hwnd,
__inout DWM_PRESENT_PARAMETERS
* pPresentParams
);

DWMAPI
DwmSetWindowAttribute(
HWND hwnd,
DWORD dwAttribute,
__in_bcount(cbAttribute) LPCVOID pvAttribute,
DWORD cbAttribute
);

DWMAPI
DwmUnregisterThumbnail(
HTHUMBNAIL hThumbnailId
);

DWMAPI
DwmUpdateThumbnailProperties(
HTHUMBNAIL hThumbnailId,
__in
const DWM_THUMBNAIL_PROPERTIES* ptnProperties
);

#if(_WIN32_WINNT >= 0x0601)
#define DWM_SIT_DISPLAYFRAME 0x00000001 // Display a window frame around the provided bitmap

DWMAPI DwmSetIconicThumbnail(
HWND hwnd,
HBITMAP hbmp,
DWORD dwSITFlags
);

DWMAPI DwmSetIconicLivePreviewBitmap(
HWND hwnd,
HBITMAP hbmp,
__in_opt POINT
*pptClient,
DWORD dwSITFlags
);

DWMAPI DwmInvalidateIconicBitmaps(
HWND hwnd
);

#endif /* _WIN32_WINNT >= 0x0601 */

DWMAPI
DwmAttachMilContent(
__in HWND hwnd
);

DWMAPI
DwmDetachMilContent(
__in HWND hwnd
);

DWMAPI
DwmFlush();

#ifndef MILCORE_KERNEL_COMPONENT
#ifndef _MIL_MATRIX3X2D_DEFINED

typedef
struct _MilMatrix3x2D
{
DOUBLE S_11;
DOUBLE S_12;
DOUBLE S_21;
DOUBLE S_22;
DOUBLE DX;
DOUBLE DY;
} MilMatrix3x2D;

#define _MIL_MATRIX3X2D_DEFINED

#endif // _MIL_MATRIX3X2D_DEFINED

#ifndef MILCORE_MIL_MATRIX3X2D_COMPAT_TYPEDEF
// Compatibility for Vista dwm api.
typedef MilMatrix3x2D MIL_MATRIX3X2D;
#define MILCORE_MIL_MATRIX3X2D_COMPAT_TYPEDEF
#endif MILCORE_MIL_MATRIX3X2D_COMPAT_TYPEDEF


DWMAPI
DwmGetGraphicsStreamTransformHint(
UINT uIndex,
__out MilMatrix3x2D
*pTransform
);

DWMAPI
DwmGetGraphicsStreamClient(
UINT uIndex,
__out UUID
*pClientUuid
);
#endif // MILCORE_KERNEL_COMPONENT

DWMAPI
DwmGetTransportAttributes(
__out_ecount(
1) BOOL *pfIsRemoting,
__out_ecount(
1) BOOL *pfIsConnected,
__out_ecount(
1) DWORD *pDwGeneration
);



#include
<poppack.h>

#ifdef __cplusplus
}
#endif


#endif // _DWMAPI_H_


比起C++,我更喜欢用vb做。

 

代码
Imports System.Runtime.InteropServices

Public Class DwmApis

<DllImport("dwmapi.dll", PreserveSig:=False)> _
Shared Function DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarInset As Margins) As Integer
End Function

Public Structure BlurBehind
Dim Flags As Integer
Dim Enable As Integer
Dim RGNBlur As Integer
Dim Transition As Integer
End Structure

Public Declare Function DwmEnableBlurBehindWindow Lib "dwmapi" (ByVal Hwnd As Integer, ByRef Blur As BlurBehind) As Integer

Public Structure Margins
Public Sub New(ByVal FullGlass As Boolean)
If FullGlass Then
Left = -1
Right = -1
Top
= -1
Bottom
= -1
End If
End Sub
Public Sub New(ByVal AllNumber As Integer)
Left = AllNumber
Right = AllNumber
Top
= AllNumber
Bottom
= AllNumber
End Sub
Public Left As Integer
Public Right As Integer
Public Top As Integer
Public Bottom As Integer
End Structure

Private Declare Function DwmIsCompositionEnabled Lib "dwmapi" (ByRef Enabled As Boolean) As Integer

End Class

 

解释一下这几个函数和结构。

DwmExtendFrameIntoClientArea:把标题栏的透明效果拓展到客户区。

DwmIsCompositionEnabled:检测透明效果是否开启。

DwmEnableBlurBehindWindow:把客户区开启透明。

Margins:透明的区域。Left 为左部透明大小,Right 为右部透明大小,Top 为上部透明大小,Bottom 为下部透明。

BlurBehind:客户区透明的设置。Flags 是标志(可以传入 3 ),RGNBlur 是客户区的透明的形状(可以传入 0 ),Enable 是开启的布尔值(可以传入 1 )。

使用将在下一篇里介绍。