131 lines
3.6 KiB
C++
131 lines
3.6 KiB
C++
|
//-------------------------------------------------------------------------//
|
||
|
// 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;
|
||
|
}
|