Source code

Revision control

Copy as Markdown

Other Tools

// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
//! theming API
use ctypes::{c_float, c_int, c_void};
use shared::minwindef::{BOOL, BYTE, DWORD, HINSTANCE, HRGN, LPARAM, UINT, ULONG, WORD};
use shared::windef::{COLORREF, HBITMAP, HBRUSH, HDC, HWND, LPCRECT, LPRECT, POINT, RECT, SIZE};
use um::commctrl::HIMAGELIST;
use um::wingdi::{BLENDFUNCTION, LOGFONTW, RGBQUAD, TEXTMETRICW};
use um::winnt::{HANDLE, HRESULT, LONG, LPCWSTR, LPWSTR, PVOID, VOID};
pub type HTHEME = HANDLE;
//pub const MAX_THEMECOLOR: u32 = 64;
//pub const MAX_THEMESIZE: u32 = 64;
extern "system" {
pub fn BeginPanningFeedback(
hwnd: HWND,
) -> BOOL;
pub fn UpdatePanningFeedback(
hwnd: HWND,
lTotalOverpanOffsetX: LONG,
lTotalOverpanOffsetY: LONG,
fInInertia: BOOL,
) -> BOOL;
pub fn EndPanningFeedback(
hwnd: HWND,
fAnimateBack: BOOL,
) -> BOOL;
}
ENUM!{enum TA_PROPERTY {
TAP_FLAGS = 0,
TAP_TRANSFORMCOUNT = 1,
TAP_STAGGERDELAY = 2,
TAP_STAGGERDELAYCAP = 3,
TAP_STAGGERDELAYFACTOR = 4,
TAP_ZORDER = 5,
}}
ENUM!{enum TA_PROPERTY_FLAG {
TAPF_NONE = 0x0,
TAPF_HASSTAGGER = 0x1,
TAPF_ISRTLAWARE = 0x2,
TAPF_ALLOWCOLLECTION = 0x4,
TAPF_HASBACKGROUND = 0x8,
TAPF_HASPERSPECTIVE = 0x10,
}}
extern "system" {
pub fn GetThemeAnimationProperty(
hTheme: HTHEME,
iStoryboardId: c_int,
iTargetId: c_int,
eProperty: TA_PROPERTY,
pvProperty: *mut VOID,
cbSize: DWORD,
pcbSizeOut: *mut DWORD,
) -> HRESULT;
}
ENUM!{enum TA_TRANSFORM_TYPE {
TATT_TRANSLATE_2D = 0,
TATT_SCALE_2D = 1,
TATT_OPACITY = 2,
TATT_CLIP = 3,
}}
ENUM!{enum TA_TRANSFORM_FLAG {
TATF_NONE = 0x0,
TATF_TARGETVALUES_USER = 0x1,
TATF_HASINITIALVALUES = 0x2,
TATF_HASORIGINVALUES = 0x4,
}}
STRUCT!{struct TA_TRANSFORM {
eTransformType: TA_TRANSFORM_TYPE,
dwTimingFunctionId: DWORD,
dwStartTime: DWORD,
dwDurationTime: DWORD,
eFlags: TA_TRANSFORM_FLAG,
}}
pub type PTA_TRANSFORM = *mut TA_TRANSFORM;
STRUCT!{struct TA_TRANSFORM_2D {
header: TA_TRANSFORM,
rX: c_float,
rY: c_float,
rInitialX: c_float,
rInitialY: c_float,
rOriginX: c_float,
rOriginY: c_float,
}}
pub type PTA_TRANSFORM_2D = *mut TA_TRANSFORM_2D;
STRUCT!{struct TA_TRANSFORM_OPACITY {
header: TA_TRANSFORM,
rOpacity: c_float,
rInitialOpacity: c_float,
}}
pub type PTA_TRANSFORM_OPACITY = *mut TA_TRANSFORM_OPACITY;
STRUCT!{struct TA_TRANSFORM_CLIP {
header: TA_TRANSFORM,
rLeft: c_float,
rTop: c_float,
rRight: c_float,
rBottom: c_float,
rInitialLeft: c_float,
rInitialTop: c_float,
rInitialRight: c_float,
rInitialBottom: c_float,
}}
pub type PTA_TRANSFORM_CLIP = *mut TA_TRANSFORM_CLIP;
extern "system" {
pub fn GetThemeAnimationTransform(
hTheme: HTHEME,
iStoryboardId: c_int,
iTargetId: c_int,
dwTransformIndex: DWORD,
pTransform: *mut TA_TRANSFORM,
cbSize: DWORD,
pcbSizeOut: *mut DWORD,
) -> HRESULT;
}
ENUM!{enum TA_TIMINGFUNCTION_TYPE {
TTFT_UNDEFINED = 0,
TTFT_CUBIC_BEZIER = 1,
}}
STRUCT!{struct TA_TIMINGFUNCTION {
eTimingFunctionType: TA_TIMINGFUNCTION_TYPE,
}}
pub type PTA_TIMINGFUNCTION = *mut TA_TIMINGFUNCTION;
STRUCT!{struct TA_CUBIC_BEZIER {
header: TA_TIMINGFUNCTION,
rX0: c_float,
rY0: c_float,
rX1: c_float,
rY1: c_float,
}}
pub type PTA_CUBIC_BEZIER = *mut TA_CUBIC_BEZIER;
extern "system" {
pub fn GetThemeTimingFunction(
hTheme: HTHEME,
iTimingFunctionId: c_int,
pTimingFunction: *mut TA_TIMINGFUNCTION,
cbSize: DWORD,
pcbSizeOut: *mut DWORD,
) -> HRESULT;
pub fn OpenThemeData(
hwnd: HWND,
pszClassList: LPCWSTR,
) -> HTHEME;
}
pub const OTD_FORCE_RECT_SIZING: DWORD = 0x00000001;
pub const OTD_NONCLIENT: DWORD = 0x00000002;
pub const OTD_VALIDBITS: DWORD = OTD_FORCE_RECT_SIZING | OTD_NONCLIENT;
extern "system" {
pub fn OpenThemeDataForDpi(
hwnd: HWND,
pszClassList: LPCWSTR,
dpi: UINT,
) -> HTHEME;
pub fn OpenThemeDataEx(
hwnd: HWND,
pszClassList: LPCWSTR,
dwFlags: DWORD,
) -> HTHEME;
pub fn CloseThemeData(
hTheme: HTHEME,
) -> HRESULT;
pub fn DrawThemeBackground(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pRect: LPCRECT,
pClipRect: LPCRECT,
) -> HRESULT;
}
pub const DTBG_CLIPRECT: DWORD = 0x00000001;
pub const DTBG_DRAWSOLID: DWORD = 0x00000002;
pub const DTBG_OMITBORDER: DWORD = 0x00000004;
pub const DTBG_OMITCONTENT: DWORD = 0x00000008;
pub const DTBG_COMPUTINGREGION: DWORD = 0x00000010;
pub const DTBG_MIRRORDC: DWORD = 0x00000020;
pub const DTBG_NOMIRROR: DWORD = 0x00000040;
pub const DTBG_VALIDBITS: DWORD = DTBG_CLIPRECT | DTBG_DRAWSOLID | DTBG_OMITBORDER
| DTBG_OMITCONTENT | DTBG_COMPUTINGREGION | DTBG_MIRRORDC | DTBG_NOMIRROR;
STRUCT!{struct DTBGOPTS {
dwSize: DWORD,
dwFlags: DWORD,
rcClip: RECT,
}}
pub type PDTBGOPTS = *mut DTBGOPTS;
extern "system" {
pub fn DrawThemeBackgroundEx(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pRect: LPCRECT,
pOptions: *const DTBGOPTS,
) -> HRESULT;
}
//pub const DTT_GRAYED: u32 = 0x00000001;
//pub const DTT_FLAGS2VALIDBITS: u32 = DTT_GRAYED;
extern "system" {
pub fn DrawThemeText(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pszText: LPCWSTR,
cchText: c_int,
dwTextFlags: DWORD,
dwTextFlags2: DWORD,
pRect: LPCRECT,
) -> HRESULT;
pub fn GetThemeBackgroundContentRect(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pBoundingRect: LPCRECT,
pContentRect: LPRECT,
) -> HRESULT;
pub fn GetThemeBackgroundExtent(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pContentRect: LPCRECT,
pExtentRect: LPRECT,
) -> HRESULT;
pub fn GetThemeBackgroundRegion(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pRect: LPCRECT,
pRegion: *mut HRGN,
) -> HRESULT;
}
ENUM!{enum THEMESIZE {
TS_MIN = 0,
TS_TRUE = 1,
TS_DRAW = 2,
}}
extern "system" {
pub fn GetThemePartSize(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
prc: LPCRECT,
eSize: THEMESIZE,
psz: *mut SIZE,
) -> HRESULT;
pub fn GetThemeTextExtent(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pszText: LPCWSTR,
cchCharCount: c_int,
dwTextFlags: DWORD,
pBoundingRect: LPCRECT,
pExtentRect: LPRECT,
) -> HRESULT;
pub fn GetThemeTextMetrics(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
ptm: *mut TEXTMETRICW,
) -> HRESULT;
}
pub const HTTB_BACKGROUNDSEG: DWORD = 0x00000000;
pub const HTTB_FIXEDBORDER: DWORD = 0x00000002;
pub const HTTB_CAPTION: DWORD = 0x00000004;
pub const HTTB_RESIZINGBORDER_LEFT: DWORD = 0x00000010;
pub const HTTB_RESIZINGBORDER_TOP: DWORD = 0x00000020;
pub const HTTB_RESIZINGBORDER_RIGHT: DWORD = 0x00000040;
pub const HTTB_RESIZINGBORDER_BOTTOM: DWORD = 0x00000080;
pub const HTTB_RESIZINGBORDER: DWORD = HTTB_RESIZINGBORDER_LEFT | HTTB_RESIZINGBORDER_TOP
| HTTB_RESIZINGBORDER_RIGHT | HTTB_RESIZINGBORDER_BOTTOM;
pub const HTTB_SIZINGTEMPLATE: DWORD = 0x00000100;
pub const HTTB_SYSTEMSIZINGMARGINS: DWORD = 0x00000200;
extern "system" {
pub fn HitTestThemeBackground(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
dwOptions: DWORD,
pRect: LPCRECT,
hrgn: HRGN,
ptTest: POINT,
pwHitTestCode: *mut WORD,
) -> HRESULT;
pub fn DrawThemeEdge(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pDestRect: LPCRECT,
uEdge: UINT,
uFlags: UINT,
pContentRect: LPRECT,
) -> HRESULT;
pub fn DrawThemeIcon(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pRect: LPCRECT,
himl: HIMAGELIST,
iImageIndex: c_int,
) -> HRESULT;
pub fn IsThemePartDefined(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
) -> BOOL;
pub fn IsThemeBackgroundPartiallyTransparent(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
) -> BOOL;
pub fn GetThemeColor(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pColor: *mut COLORREF,
) -> HRESULT;
pub fn GetThemeMetric(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
piVal: *mut c_int,
) -> HRESULT;
pub fn GetThemeString(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pszBuff: LPWSTR,
cchMaxBuffChars: c_int,
) -> HRESULT;
pub fn GetThemeBool(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pfVal: *mut BOOL,
) -> HRESULT;
pub fn GetThemeInt(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
piVal: *mut c_int,
) -> HRESULT;
pub fn GetThemeEnumValue(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
piVal: *mut c_int,
) -> HRESULT;
pub fn GetThemePosition(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pPoint: *mut POINT,
) -> HRESULT;
pub fn GetThemeFont(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pFont: *mut LOGFONTW,
) -> HRESULT;
pub fn GetThemeRect(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pRect: LPRECT,
) -> HRESULT;
}
STRUCT!{struct MARGINS {
cxLeftWidth: c_int,
cxRightWidth: c_int,
cyTopHeight: c_int,
cyBottomHeight: c_int,
}}
pub type PMARGINS = *mut MARGINS;
extern "system" {
pub fn GetThemeMargins(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
prc: LPCRECT,
pMargins: *mut MARGINS,
) -> HRESULT;
}
pub const MAX_INTLIST_COUNT: usize = 402;
STRUCT!{struct INTLIST {
iValueCount: c_int,
iValues: [c_int; MAX_INTLIST_COUNT],
}}
pub type PINTLIST = *mut INTLIST;
extern "system" {
pub fn GetThemeIntList(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pIntList: *mut INTLIST,
) -> HRESULT;
}
ENUM!{enum PROPERTYORIGIN {
PO_STATE = 0,
PO_PART = 1,
PO_CLASS = 2,
PO_GLOBAL = 3,
PO_NOTFOUND = 4,
}}
extern "system" {
pub fn GetThemePropertyOrigin(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pOrigin: *mut PROPERTYORIGIN,
) -> HRESULT;
pub fn SetWindowTheme(
hwnd: HWND,
pszSubAppName: LPCWSTR,
pszSubIdList: LPCWSTR,
) -> HRESULT;
pub fn GetThemeFilename(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
pszThemeFileName: LPWSTR,
cchMaxBuffChars: c_int,
) -> HRESULT;
pub fn GetThemeSysColor(
hTheme: HTHEME,
iColorId: c_int,
) -> COLORREF;
pub fn GetThemeSysColorBrush(
hTheme: HTHEME,
iColorId: c_int,
) -> HBRUSH;
pub fn GetThemeSysBool(
hTheme: HTHEME,
iBoolId: c_int,
) -> BOOL;
pub fn GetThemeSysSize(
hTheme: HTHEME,
iSizeId: c_int,
) -> c_int;
pub fn GetThemeSysFont(
hTheme: HTHEME,
iFontId: c_int,
plf: *mut LOGFONTW,
) -> HRESULT;
pub fn GetThemeSysString(
hTheme: HTHEME,
iStringId: c_int,
pszStringBuff: LPWSTR,
cchMaxStringChars: c_int,
) -> HRESULT;
pub fn GetThemeSysInt(
hTheme: HTHEME,
iIntId: c_int,
piValue: *mut c_int,
) -> HRESULT;
pub fn IsThemeActive() -> BOOL;
pub fn IsAppThemed() -> BOOL;
pub fn GetWindowTheme(
hwnd: HWND,
) -> HTHEME;
}
pub const ETDT_DISABLE: DWORD = 0x00000001;
pub const ETDT_ENABLE: DWORD = 0x00000002;
pub const ETDT_USETABTEXTURE: DWORD = 0x00000004;
pub const ETDT_ENABLETAB: DWORD = ETDT_ENABLE | ETDT_USETABTEXTURE;
pub const ETDT_USEAEROWIZARDTABTEXTURE: DWORD = 0x00000008;
pub const ETDT_ENABLEAEROWIZARDTAB: DWORD = ETDT_ENABLE | ETDT_USEAEROWIZARDTABTEXTURE;
pub const ETDT_VALIDBITS: DWORD = ETDT_DISABLE | ETDT_ENABLE | ETDT_USETABTEXTURE
| ETDT_USEAEROWIZARDTABTEXTURE;
extern "system" {
pub fn EnableThemeDialogTexture(
hwnd: HWND,
dwFlags: DWORD,
) -> HRESULT;
pub fn IsThemeDialogTextureEnabled(
hwnd: HWND,
) -> BOOL;
}
pub const STAP_ALLOW_NONCLIENT: DWORD = 1 << 0;
pub const STAP_ALLOW_CONTROLS: DWORD = 1 << 1;
pub const STAP_ALLOW_WEBCONTENT: DWORD = 1 << 2;
pub const STAP_VALIDBITS: DWORD = STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS
| STAP_ALLOW_WEBCONTENT;
extern "system" {
pub fn GetThemeAppProperties() -> DWORD;
pub fn SetThemeAppProperties(
dwFlags: DWORD,
);
pub fn GetCurrentThemeName(
pszThemeFileName: LPWSTR,
cchMaxNameChars: c_int,
pszColorBuff: LPWSTR,
cchMaxColorChars: c_int,
pszSizeBuff: LPWSTR,
cchMaxSizeChars: c_int,
) -> HRESULT;
}
pub const SZ_THDOCPROP_DISPLAYNAME: &'static str = "DisplayName";
pub const SZ_THDOCPROP_CANONICALNAME: &'static str = "ThemeName";
pub const SZ_THDOCPROP_TOOLTIP: &'static str = "ToolTip";
pub const SZ_THDOCPROP_AUTHOR: &'static str = "author";
extern "system" {
pub fn GetThemeDocumentationProperty(
pszThemeName: LPCWSTR,
pszPropertyName: LPCWSTR,
pszValueBuff: LPWSTR,
cchMaxValChars: c_int,
) -> HRESULT;
pub fn DrawThemeParentBackground(
hwnd: HWND,
hdc: HDC,
prc: *const RECT,
) -> HRESULT;
pub fn EnableTheming(
fEnable: BOOL,
) -> HRESULT;
}
pub const GBF_DIRECT: ULONG = 0x00000001;
pub const GBF_COPY: ULONG = 0x00000002;
pub const GBF_VALIDBITS: ULONG = GBF_DIRECT | GBF_COPY;
pub const DTPB_WINDOWDC: DWORD = 0x00000001;
pub const DTPB_USECTLCOLORSTATIC: DWORD = 0x00000002;
pub const DTPB_USEERASEBKGND: DWORD = 0x00000004;
extern "system" {
pub fn DrawThemeParentBackgroundEx(
hwnd: HWND,
hdc: HDC,
dwFlags: DWORD,
prc: *const RECT,
) -> HRESULT;
}
ENUM!{enum WINDOWTHEMEATTRIBUTETYPE {
WTA_NONCLIENT = 1,
}}
STRUCT!{struct WTA_OPTIONS {
dwFlags: DWORD,
dwMask: DWORD,
}}
pub type PWTA_OPTIONS = *mut WTA_OPTIONS;
pub const WTNCA_NODRAWCAPTION: DWORD = 0x00000001;
pub const WTNCA_NODRAWICON: DWORD = 0x00000002;
pub const WTNCA_NOSYSMENU: DWORD = 0x00000004;
pub const WTNCA_NOMIRRORHELP: DWORD = 0x00000008;
pub const WTNCA_VALIDBITS: DWORD = WTNCA_NODRAWCAPTION | WTNCA_NODRAWICON | WTNCA_NOSYSMENU
| WTNCA_NOMIRRORHELP;
extern "system" {
pub fn SetWindowThemeAttribute(
hwnd: HWND,
eAttribute: WINDOWTHEMEATTRIBUTETYPE,
pvAttribute: PVOID,
cbAttribute: DWORD,
) -> HRESULT;
}
#[inline]
pub unsafe fn SetWindowThemeNonClientAttributes(
hwnd: HWND,
dwMask: DWORD,
dwAttributes: DWORD,
) -> HRESULT {
use core::mem::{size_of, zeroed};
let mut wta: WTA_OPTIONS = zeroed();
wta.dwFlags = dwAttributes;
wta.dwMask = dwMask;
SetWindowThemeAttribute(
hwnd,
WTA_NONCLIENT,
&mut wta as *mut WTA_OPTIONS as *mut c_void,
size_of::<WTA_OPTIONS>() as u32,
)
}
FN!{stdcall DTT_CALLBACK_PROC(
hdc: HDC,
pszText: LPWSTR,
cchText: c_int,
prc: LPRECT,
dwFlags: UINT,
lParam: LPARAM,
) -> c_int}
pub const DTT_TEXTCOLOR: DWORD = 1 << 0;
pub const DTT_BORDERCOLOR: DWORD = 1 << 1;
pub const DTT_SHADOWCOLOR: DWORD = 1 << 2;
pub const DTT_SHADOWTYPE: DWORD = 1 << 3;
pub const DTT_SHADOWOFFSET: DWORD = 1 << 4;
pub const DTT_BORDERSIZE: DWORD = 1 << 5;
pub const DTT_FONTPROP: DWORD = 1 << 6;
pub const DTT_COLORPROP: DWORD = 1 << 7;
pub const DTT_STATEID: DWORD = 1 << 8;
pub const DTT_CALCRECT: DWORD = 1 << 9;
pub const DTT_APPLYOVERLAY: DWORD = 1 << 10;
pub const DTT_GLOWSIZE: DWORD = 1 << 11;
pub const DTT_CALLBACK: DWORD = 1 << 12;
pub const DTT_COMPOSITED: DWORD = 1 << 13;
pub const DTT_VALIDBITS: DWORD = DTT_TEXTCOLOR | DTT_BORDERCOLOR | DTT_SHADOWCOLOR
| DTT_SHADOWTYPE | DTT_SHADOWOFFSET | DTT_BORDERSIZE | DTT_FONTPROP | DTT_COLORPROP
| DTT_STATEID | DTT_CALCRECT | DTT_APPLYOVERLAY | DTT_GLOWSIZE | DTT_COMPOSITED;
STRUCT!{struct DTTOPTS {
dwSize: DWORD,
dwFlags: DWORD,
crText: COLORREF,
crBorder: COLORREF,
crShadow: COLORREF,
iTextShadowType: c_int,
ptShadowOffset: POINT,
iBorderSize: c_int,
iFontPropId: c_int,
iColorPropId: c_int,
iStateId: c_int,
fApplyOverlay: BOOL,
iGlowSize: c_int,
pfnDrawTextCallback: DTT_CALLBACK_PROC,
lParam: LPARAM,
}}
pub type PDTTOPTS = *mut DTTOPTS;
extern "system" {
pub fn DrawThemeTextEx(
hTheme: HTHEME,
hdc: HDC,
iPartId: c_int,
iStateId: c_int,
pszText: LPCWSTR,
cchText: c_int,
dwTextFlags: DWORD,
pRect: LPRECT,
pOptions: *const DTTOPTS,
) -> HRESULT;
pub fn GetThemeBitmap(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
dwFlags: ULONG,
phBitmap: *mut HBITMAP,
) -> HRESULT;
pub fn GetThemeStream(
hTheme: HTHEME,
iPartId: c_int,
iStateId: c_int,
iPropId: c_int,
ppvStream: *mut *mut VOID,
pcbStream: *mut DWORD,
hInst: HINSTANCE,
) -> HRESULT;
pub fn BufferedPaintInit() -> HRESULT;
pub fn BufferedPaintUnInit() -> HRESULT;
}
pub type HPAINTBUFFER = HANDLE;
ENUM!{enum BP_BUFFERFORMAT {
BPBF_COMPATIBLEBITMAP = 0,
BPBF_DIB = 1,
BPBF_TOPDOWNDIB = 2,
BPBF_TOPDOWNMONODIB = 3,
}}
pub const BPBF_COMPOSITED: BP_BUFFERFORMAT = BPBF_TOPDOWNDIB;
ENUM!{enum BP_ANIMATIONSTYLE {
BPAS_NONE = 0,
BPAS_LINEAR = 1,
BPAS_CUBIC = 2,
BPAS_SINE = 3,
}}
STRUCT!{struct BP_ANIMATIONPARAMS {
cbSize: DWORD,
dwFlags: DWORD,
style: BP_ANIMATIONSTYLE,
dwDuration: DWORD,
}}
pub type PBP_ANIMATIONPARAMS = *mut BP_ANIMATIONPARAMS;
pub const BPPF_ERASE: DWORD = 0x0001;
pub const BPPF_NOCLIP: DWORD = 0x0002;
pub const BPPF_NONCLIENT: DWORD = 0x0004;
STRUCT!{struct BP_PAINTPARAMS {
cbSize: DWORD,
dwFlags: DWORD,
prcExclude: *const RECT,
pBlendFunction: *const BLENDFUNCTION,
}}
pub type PBP_PAINTPARAMS = *mut BP_PAINTPARAMS;
extern "system" {
pub fn BeginBufferedPaint(
hdcTarget: HDC,
prcTarget: *const RECT,
dwFormat: BP_BUFFERFORMAT,
pPaintParams: *mut BP_PAINTPARAMS,
phdc: *mut HDC,
) -> HPAINTBUFFER;
pub fn EndBufferedPaint(
hBufferedPaint: HPAINTBUFFER,
fUpdateTarget: BOOL,
) -> HRESULT;
pub fn GetBufferedPaintTargetRect(
hBufferedPaint: HPAINTBUFFER,
prc: *mut RECT,
) -> HRESULT;
pub fn GetBufferedPaintTargetDC(
hBufferedPaint: HPAINTBUFFER,
) -> HDC;
pub fn GetBufferedPaintDC(
hBufferedPaint: HPAINTBUFFER,
) -> HDC;
pub fn GetBufferedPaintBits(
hBufferedPaint: HPAINTBUFFER,
ppbBuffer: *mut *mut RGBQUAD,
pcxRow: *mut c_int,
) -> HRESULT;
pub fn BufferedPaintClear(
hBufferedPaint: HPAINTBUFFER,
prc: *const RECT,
) -> HRESULT;
pub fn BufferedPaintSetAlpha(
hBufferedPaint: HPAINTBUFFER,
prc: *const RECT,
alpha: BYTE,
) -> HRESULT;
pub fn BufferedPaintStopAllAnimations(
hwnd: HWND,
) -> HRESULT;
}
pub type HANIMATIONBUFFER = HANDLE;
extern "system" {
pub fn BeginBufferedAnimation(
hwnd: HWND,
hdcTarget: HDC,
prcTarget: *const RECT,
dwFormat: BP_BUFFERFORMAT,
pPaintParams: *mut BP_PAINTPARAMS,
pAnimationParams: *mut BP_ANIMATIONPARAMS,
phdcFrom: *mut HDC,
phdcTo: *mut HDC,
) -> HANIMATIONBUFFER;
pub fn EndBufferedAnimation(
hbpAnimation: HANIMATIONBUFFER,
fUpdateTarget: BOOL,
) -> HRESULT;
pub fn BufferedPaintRenderAnimation(
hwnd: HWND,
hdcTarget: HDC,
) -> BOOL;
pub fn IsCompositionActive() -> BOOL;
pub fn GetThemeTransitionDuration(
hTheme: HTHEME,
iPartId: c_int,
iStateIdFrom: c_int,
iStateIdTo: c_int,
iPropId: c_int,
pdwDuration: *mut DWORD,
) -> HRESULT;
}