|
|
//-------------------------------------------------------------------------//
// Module Name: scrollp.cpp
//
// Copyright (c) 1985 - 1999, Microsoft Corporation
//
// win32k->uxtheme port routines for scrollbar
//
// History:
// 03-21-00 ScottHan Created
//-------------------------------------------------------------------------//
#include "stdafx.h"
#include "scrollp.h"
extern HBRUSH _UxGrayBrush(VOID); extern void _UxFreeGDIResources();
enum { WF_STATE1 = 0, WF_STATE2, WF_EXSTYLE, WF_STYLE, };
//-------------------------------------------------------------------------//
ULONG _ExpandWF( ULONG ulRaw, ULONG* pulField ) { ULONG ulField = ( HIBYTE(ulRaw) & 0xFC ) >> 2; ULONG ulShift = HIBYTE(ulRaw) & 0x03; ULONG ulResult = LOBYTE(ulRaw) << (ulShift << 3); if( pulField ) *pulField = ulField; return ulResult; }
//-------------------------------------------------------------------------//
// From usrctl32.h/.cpp
void SetWindowState( HWND hwnd, UINT flags) { ULONG ulField; ULONG ulVal = _ExpandWF( flags, &ulField );
if( WF_EXSTYLE == ulField || WF_STYLE == ulField) { ULONG dwBits = 0; ULONG dwGwl = (WF_EXSTYLE == ulField) ? GWL_EXSTYLE : (WF_STYLE == ulField) ? GWL_STYLE : 0; UserAssert(dwGwl);
dwBits = GetWindowLong( hwnd, dwGwl );
if( (dwBits & ulVal) != ulVal ) SetWindowLong(hwnd, dwGwl, dwBits | ulVal ); } }
//-------------------------------------------------------------------------//
// From usrctl32.h/.cpp
void ClearWindowState( HWND hwnd, UINT flags) { ULONG ulField; ULONG ulVal = _ExpandWF( flags, &ulField );
if( WF_EXSTYLE == ulField || WF_STYLE == ulField) { ULONG dwBits = 0; ULONG dwGwl = (WF_EXSTYLE == ulField) ? GWL_EXSTYLE : (WF_STYLE == ulField) ? GWL_STYLE : 0; UserAssert(dwGwl);
dwBits = GetWindowLong( hwnd, dwGwl );
if( (dwBits & ulVal) != ulVal ) SetWindowLong(hwnd, dwGwl, dwBits &= ~ulVal ); } }
//-------------------------------------------------------------------------//
// window bitfield discriminator (in lobyte of internal flags)
#define WF_SEL_STATE 0x00
#define WF_SEL_STATE2 0x04
#define WF_SEL_STYLE_EX 0x08
#define WF_SEL_STYLE 0x0C
#ifdef _WIN64
#undef GWL_WOWWORDS
#endif /* _WIN64 */
#define GWLP_WOWWORDS (-1)
#define GCL_WOWWORDS (-27)
#define GCL_WOWMENUNAME (-29)
#ifdef _WIN64
#undef GCL_WOWWORDS
#endif /* _WIN64 */
#define GCLP_WOWWORDS (-27)
LONG TestWF(HWND hwnd, DWORD flag) { LPDWORD pdwWW;
// GWLP_WOWWORDS returns a pointer to the WW struct in the hwnd.
// We're interest in the first four DWORDS: state, state2,
// ExStyle (exposed, although not all bits, by GetWindowExStyle),
// and style (exposed by GetWindowStyle).
//
// The parameter flag, contains information on how to pick the field
// we want and how to build the WS_xxx or WS_EX_xxx we want to
// check for.
//
// See UsrCtl32.h for more details on how this is done.
//
pdwWW = (LPDWORD)GetWindowLongPtr(hwnd, GWLP_WOWWORDS); if ( pdwWW ) { INT iField; // the field we want
INT iShift; // how many bytes to shift flag
LONG ulMask; // WS_xxx or WS_EX_xxx flag
iField = ( HIBYTE(flag) & 0xFC ) >> 2; iShift = HIBYTE(flag) & 0x03; ulMask = LOBYTE(flag) << (iShift << 3);
UserAssert( 0 <= iField && iField < 4 ); return pdwWW[iField] & ulMask; };
return 0; }
|