You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1053 lines
29 KiB
1053 lines
29 KiB
//
|
|
// cuiutilcpp
|
|
// = UI object library - util functions =
|
|
//
|
|
|
|
#include "private.h"
|
|
#include "cuiutil.h"
|
|
#include "cuiobj.h"
|
|
#include "cuiwnd.h"
|
|
#include "cuitip.h"
|
|
#include "cuisys.h"
|
|
#include "cmydc.h"
|
|
|
|
#ifndef NOFONTLINK
|
|
#include "fontlink.h"
|
|
#endif /* !NOFONTLINK */
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
typedef BOOL (WINAPI *PFNUPDATELAYEREDWINDOW)( HWND hwnd, HDC hdcDst, POINT *pptDst, SIZE *psize, HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags );
|
|
typedef HMONITOR (WINAPI *PFNMONITORFROMWINDOW)( HWND hwnd, DWORD dwFlags );
|
|
typedef HMONITOR (WINAPI *PFNMONITORFROMRECT)( LPRECT prc, DWORD dwFlags );
|
|
typedef HMONITOR (WINAPI *PFNMONITORFROMPOINT)( POINT pt, DWORD dwFlags );
|
|
typedef BOOL (WINAPI *PFNGETMONITORINFO)( HMONITOR hMonitor, LPMONITORINFO lpmi );
|
|
typedef BOOL (WINAPI *PFNANIMATEWINDOW)( HWND hwnd, DWORD dwTime, DWORD dwFlag );
|
|
typedef BOOL (WINAPI *PFNGETPROCESSDEFAULTLAYOUT)( DWORD *pdw);
|
|
typedef BOOL (WINAPI *PFNSETLAYOUT)( HDC hdc, DWORD dw);
|
|
|
|
static PFNUPDATELAYEREDWINDOW vpfnUpdateLayeredWindow = NULL;
|
|
static PFNMONITORFROMWINDOW vpfnMonitorFromWindow = NULL;
|
|
static PFNMONITORFROMRECT vpfnMonitorFromRect = NULL;
|
|
static PFNMONITORFROMPOINT vpfnMonitorFromPoint = NULL;
|
|
static PFNGETMONITORINFO vpfnGetMonitorInfo = NULL;
|
|
static PFNANIMATEWINDOW vpfnAnimateWindow = NULL;
|
|
static PFNGETPROCESSDEFAULTLAYOUT vpfnGetProcessDefaultLayout = NULL;
|
|
static PFNSETLAYOUT vpfnSetLayout = NULL;
|
|
|
|
|
|
/* G E T H L I B U S E R 3 2 */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
HINSTANCE GetHLibUser32( void )
|
|
{
|
|
static HINSTANCE hLibUser32 = NULL;
|
|
|
|
if (hLibUser32 == NULL) {
|
|
hLibUser32 = CUIGetSystemModuleHandle( TEXT("user32.dll") );
|
|
}
|
|
|
|
return hLibUser32;
|
|
}
|
|
|
|
/* G E T H L I B G D U 3 2 */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
HINSTANCE GetHLibGdi32( void )
|
|
{
|
|
static HINSTANCE hLibGdi32 = NULL;
|
|
|
|
if (hLibGdi32 == NULL) {
|
|
hLibGdi32 = CUIGetSystemModuleHandle( TEXT("gdi32.dll") );
|
|
}
|
|
|
|
return hLibGdi32;
|
|
}
|
|
|
|
|
|
/* C U I I S U P D A T E L A Y E R E D W I N D O W A V A I L */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIIsUpdateLayeredWindowAvail( void )
|
|
{
|
|
static BOOL fInitialized = FALSE;
|
|
|
|
if (!fInitialized) {
|
|
HMODULE hmodUser32 = GetHLibUser32();
|
|
if (hmodUser32)
|
|
vpfnUpdateLayeredWindow = (PFNUPDATELAYEREDWINDOW)GetProcAddress( hmodUser32, TEXT("UpdateLayeredWindow") );
|
|
}
|
|
|
|
return (vpfnUpdateLayeredWindow != NULL);
|
|
}
|
|
|
|
|
|
/* C U I U P D A T E L A Y E R E D W I N D O W */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIUpdateLayeredWindow( HWND hwnd, HDC hdcDst, POINT *pptDst, SIZE *psize, HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags )
|
|
{
|
|
if (!CUIIsUpdateLayeredWindowAvail()) {
|
|
return FALSE;
|
|
}
|
|
|
|
return vpfnUpdateLayeredWindow( hwnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags );
|
|
}
|
|
|
|
|
|
/* C U I I S M O N I T O R A P I A V A I L */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIIsMonitorAPIAvail( void )
|
|
{
|
|
static BOOL fInitialized = FALSE;
|
|
|
|
if (!fInitialized) {
|
|
HMODULE hmodUser32 = GetHLibUser32();
|
|
if (hmodUser32)
|
|
{
|
|
vpfnGetMonitorInfo = (PFNGETMONITORINFO)GetProcAddress( hmodUser32, TEXT("GetMonitorInfoA") );
|
|
vpfnMonitorFromWindow = (PFNMONITORFROMWINDOW)GetProcAddress( hmodUser32, TEXT("MonitorFromWindow") );
|
|
vpfnMonitorFromRect = (PFNMONITORFROMRECT)GetProcAddress( hmodUser32, TEXT("MonitorFromRect") );
|
|
vpfnMonitorFromPoint = (PFNMONITORFROMPOINT)GetProcAddress( hmodUser32, TEXT("MonitorFromPoint") );
|
|
}
|
|
}
|
|
|
|
return (vpfnGetMonitorInfo != NULL)
|
|
&& (vpfnMonitorFromWindow != NULL)
|
|
&& (vpfnMonitorFromRect != NULL)
|
|
&& (vpfnMonitorFromPoint != NULL);
|
|
}
|
|
|
|
|
|
/* C U I G E T M O N I T O R I N F O */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIGetMonitorInfo( HMONITOR hMonitor, LPMONITORINFO lpmi )
|
|
{
|
|
if (!CUIIsMonitorAPIAvail()) {
|
|
return FALSE;
|
|
}
|
|
|
|
return vpfnGetMonitorInfo( hMonitor, lpmi );
|
|
}
|
|
|
|
|
|
/* C U I M O N I T O R F R O M W I N D O W */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
HMONITOR CUIMonitorFromWindow( HWND hwnd, DWORD dwFlags )
|
|
{
|
|
if (!CUIIsMonitorAPIAvail()) {
|
|
return NULL;
|
|
}
|
|
|
|
return vpfnMonitorFromWindow( hwnd, dwFlags );
|
|
}
|
|
|
|
|
|
/* C U I M O N I T O R F R O M R E C T */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
HMONITOR CUIMonitorFromRect( LPRECT prc, DWORD dwFlags )
|
|
{
|
|
if (!CUIIsMonitorAPIAvail()) {
|
|
return NULL;
|
|
}
|
|
|
|
return vpfnMonitorFromRect( prc, dwFlags );
|
|
}
|
|
|
|
|
|
/* C U I M O N I T O R F R O M P O I N T */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
HMONITOR CUIMonitorFromPoint( POINT pt, DWORD dwFlags )
|
|
{
|
|
if (!CUIIsMonitorAPIAvail()) {
|
|
return NULL;
|
|
}
|
|
|
|
return vpfnMonitorFromPoint( pt, dwFlags );
|
|
}
|
|
|
|
/* C U I GET SCREENRECT
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
|
|
void CUIGetScreenRect(POINT pt, RECT *prc)
|
|
{
|
|
prc->left = 0;
|
|
prc->top = 0;
|
|
prc->right = GetSystemMetrics( SM_CXSCREEN );
|
|
prc->bottom = GetSystemMetrics( SM_CYSCREEN );
|
|
|
|
if (CUIIsMonitorAPIAvail()) {
|
|
HMONITOR hMonitor;
|
|
MONITORINFO MonitorInfo;
|
|
|
|
hMonitor = CUIMonitorFromPoint( pt, MONITOR_DEFAULTTONEAREST );
|
|
if (hMonitor != NULL) {
|
|
MonitorInfo.cbSize = sizeof(MonitorInfo);
|
|
if (CUIGetMonitorInfo( hMonitor, &MonitorInfo )) {
|
|
*prc = MonitorInfo.rcMonitor;
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/* C U I GET WORDARE
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
|
|
void CUIGetWorkAreaRect(POINT pt, RECT *prc)
|
|
{
|
|
SystemParametersInfo(SPI_GETWORKAREA, 0, prc, FALSE);
|
|
|
|
if (CUIIsMonitorAPIAvail()) {
|
|
HMONITOR hMonitor;
|
|
MONITORINFO MonitorInfo;
|
|
|
|
hMonitor = CUIMonitorFromPoint( pt, MONITOR_DEFAULTTONEAREST );
|
|
if (hMonitor != NULL) {
|
|
MonitorInfo.cbSize = sizeof(MonitorInfo);
|
|
if (CUIGetMonitorInfo( hMonitor, &MonitorInfo )) {
|
|
*prc = MonitorInfo.rcWork;
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/* C U I I S A N I M A T E W I N D O W A V A I L */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIIsAnimateWindowAvail( void )
|
|
{
|
|
static BOOL fInitialized = FALSE;
|
|
|
|
if (!fInitialized) {
|
|
HMODULE hmodUser32 = GetHLibUser32();
|
|
if (hmodUser32)
|
|
vpfnAnimateWindow = (PFNANIMATEWINDOW)GetProcAddress( hmodUser32, TEXT("AnimateWindow") );
|
|
}
|
|
|
|
return (vpfnAnimateWindow != NULL);
|
|
}
|
|
|
|
|
|
/* C U I A N I M A T E W I N D O W */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIAnimateWindow( HWND hwnd, DWORD dwTime, DWORD dwFlag )
|
|
{
|
|
if (!CUIIsAnimateWindowAvail()) {
|
|
return FALSE;
|
|
}
|
|
|
|
return vpfnAnimateWindow( hwnd, dwTime, dwFlag );
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
BOOL g_fInitUIFBitmapDCs = FALSE;
|
|
CBitmapDC *g_phdcSrc = NULL;
|
|
CBitmapDC *g_phdcMask = NULL;
|
|
CBitmapDC *g_phdcDst = NULL;
|
|
void InitUIFUtil()
|
|
{
|
|
if (!g_phdcSrc)
|
|
g_phdcSrc = new CBitmapDC(TRUE);
|
|
|
|
if (!g_phdcMask)
|
|
g_phdcMask = new CBitmapDC(TRUE);
|
|
|
|
if (!g_phdcDst)
|
|
g_phdcDst = new CBitmapDC(TRUE);
|
|
|
|
if (g_phdcSrc && g_phdcMask && g_phdcDst)
|
|
g_fInitUIFBitmapDCs = TRUE;
|
|
}
|
|
|
|
void DoneUIFUtil()
|
|
{
|
|
if (g_phdcSrc)
|
|
delete g_phdcSrc;
|
|
g_phdcSrc = NULL;
|
|
|
|
if (g_phdcMask)
|
|
delete g_phdcMask;
|
|
g_phdcMask = NULL;
|
|
|
|
if (g_phdcDst)
|
|
delete g_phdcDst;
|
|
g_phdcDst = NULL;
|
|
|
|
g_fInitUIFBitmapDCs = FALSE;
|
|
}
|
|
|
|
|
|
/* C U I D R A W T E X T */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
int CUIDrawText( HDC hDC, LPCWSTR pwch, int cwch, RECT *prc, UINT uFormat )
|
|
{
|
|
#ifndef NOFONTLINK
|
|
return FLDrawTextW( hDC, pwch, cwch, prc, uFormat );
|
|
#else /* NOFONTLINK */
|
|
char *pch;
|
|
int cch;
|
|
int iRet;
|
|
|
|
if (UIFIsWindowsNT()) {
|
|
return DrawTextW( hDC, pwch, cwch, prc, uFormat );
|
|
}
|
|
|
|
if (cwch == -1) {
|
|
cwch = StrLenW(pwch);
|
|
}
|
|
|
|
pch = new CHAR[ cwch*2+1 ];
|
|
if (pch == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
cch = WideCharToMultiByte( CP_ACP, 0, pwch, cwch, pch, cwch*2+1, NULL, NULL );
|
|
*(pch + cch) = '\0';
|
|
iRet = DrawTextA( hDC, pch, cch, prc, uFormat );
|
|
delete pch;
|
|
|
|
return iRet;
|
|
#endif /* NOFONTLINK */
|
|
}
|
|
|
|
|
|
/* C U I E X T T E X T O U T */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIExtTextOut( HDC hDC, int x, int y, UINT fuOptions, const RECT *prc, LPCWSTR pwch, UINT cwch, const int *lpDs )
|
|
{
|
|
#ifndef NOFONTLINK
|
|
return FLExtTextOutW( hDC, x, y, fuOptions, prc, pwch, cwch, lpDs );
|
|
#else /* NOFONTLINK */
|
|
char *pch;
|
|
int cch;
|
|
BOOL fRet;
|
|
|
|
if (UIFIsWindowsNT()) {
|
|
return ExtTextOutW( hDC, x, y, fuOptions, prc, pwch, cwch, lpDs );
|
|
}
|
|
|
|
if (cwch == -1) {
|
|
cwch = StrLenW(pwch);
|
|
}
|
|
|
|
pch = new CHAR[ cwch*2+1 ];
|
|
if (pch == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
cch = WideCharToMultiByte( CP_ACP, 0, pwch, cwch, pch, cwch*2+1, NULL, NULL );
|
|
*(pch + cch) = '\0';
|
|
fRet = ExtTextOutA( hDC, x, y, fuOptions, prc, pch, cch, lpDs );
|
|
delete pch;
|
|
|
|
return fRet;
|
|
#endif /* NOFONTLINK */
|
|
}
|
|
|
|
|
|
/* C U I G E T T E X T E X T E N T P O I N T 3 2 */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------*/
|
|
extern BOOL CUIGetTextExtentPoint32( HDC hDC, LPCWSTR pwch, int cwch, SIZE *psize )
|
|
{
|
|
#ifndef NOFONTLINK
|
|
return FLGetTextExtentPoint32( hDC, pwch, cwch, psize );
|
|
#else /* NOFONTLINK */
|
|
char *pch;
|
|
int cch;
|
|
BOOL fRet;
|
|
|
|
if (UIFIsWindowsNT()) {
|
|
return GetTextExtentPoint32W( hDC, pwch, cwch, psize );
|
|
}
|
|
|
|
if (cwch == -1) {
|
|
cwch = StrLenW(pwch);
|
|
}
|
|
|
|
pch = new CHAR[ cwch*2+1 ];
|
|
if (pch == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
cch = WideCharToMultiByte( CP_ACP, 0, pwch, cwch, pch, cwch*2+1, NULL, NULL );
|
|
*(pch + cch) = '\0';
|
|
fRet = GetTextExtentPoint32A( hDC, pch, cch, psize );
|
|
delete pch;
|
|
|
|
return fRet;
|
|
#endif /* NOFONTLINK */
|
|
}
|
|
|
|
|
|
/* C R E A T E D I T H E R B R U S H */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
Create brush of pattern
|
|
Returns handle of brush object when suceed, otherwise FALSE.
|
|
|
|
------------------------------------------------------------------------------*/
|
|
HBRUSH CreateDitherBrush( void )
|
|
{
|
|
WORD rgwPattern[8] = { 0x0055, 0x00aa, 0x0055, 0x00aa, 0x0055, 0x00aa, 0x0055, 0x00aa };
|
|
LOGBRUSH LogBrush;
|
|
HBITMAP hBitmap;
|
|
HBRUSH hBrush;
|
|
|
|
hBitmap = CreateBitmap( 8, 8, 1, 1, rgwPattern );
|
|
if (hBitmap == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
LogBrush.lbHatch = (LONG_PTR)hBitmap;
|
|
LogBrush.lbStyle = BS_PATTERN;
|
|
hBrush = CreateBrushIndirect( &LogBrush );
|
|
|
|
DeleteObject( hBitmap );
|
|
|
|
return hBrush;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ConvertBlackBKGBitmap
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HBITMAP ChangeBitmapColor(const RECT *prc, HBITMAP hbmp, COLORREF rgbOld, COLORREF rgbNew)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return NULL;
|
|
|
|
int nWidth = prc->right - prc->left;
|
|
int nHeight = prc->bottom - prc->top;
|
|
DWORD DSPDxax = 0x00E20746;
|
|
CSolidBrush cbr(rgbNew);
|
|
|
|
g_phdcDst->SetDIB(nWidth, nHeight);
|
|
|
|
g_phdcSrc->SetBitmap(hbmp);
|
|
g_phdcMask->SetBitmap(nWidth, nHeight, 1, 1);
|
|
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCCOPY);
|
|
|
|
SelectObject(*g_phdcDst, (HBRUSH)cbr);
|
|
SetBkColor(*g_phdcDst, rgbOld);
|
|
// BitBlt(*g_phdcMask, 0, 0, nWidth, nHeight, *g_phdcDst, 0, 0, DSPDxax);
|
|
BitBlt(*g_phdcMask, 0, 0, nWidth, nHeight, *g_phdcDst, 0, 0, MERGECOPY);
|
|
|
|
SetBkColor(*g_phdcDst, RGB(255,255,255));
|
|
SetTextColor(*g_phdcDst, RGB(0,0,0));
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, DSPDxax);
|
|
|
|
#if 0
|
|
BitBlt(*g_phdcTmp, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCCOPY);
|
|
BitBlt(*g_phdcTmp, 30, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCCOPY);
|
|
BitBlt(*g_phdcTmp, 60, 0, nWidth, nHeight, *g_phdcDst, 0, 0, SRCCOPY);
|
|
#endif
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit(TRUE);
|
|
return g_phdcDst->GetBitmapAndKeep();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ConvertBlackBKGBitmap
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HBITMAP ConvertBlackBKGBitmap(const RECT *prc, HBITMAP hbmp, HBITMAP hbmpMask, HBRUSH hBr)
|
|
{
|
|
LOGBRUSH lb;
|
|
HBRUSH hbrTemp;
|
|
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return NULL;
|
|
|
|
if (PtrToUlong(hBr) <= 50)
|
|
{
|
|
hbrTemp = GetSysColorBrush(PtrToUlong(hBr) - 1);
|
|
}
|
|
else
|
|
{
|
|
hbrTemp = hBr;
|
|
}
|
|
GetObject(hbrTemp, sizeof(lb), &lb);
|
|
if ((lb.lbStyle != BS_SOLID) || (lb.lbColor != RGB(0,0,0)))
|
|
return NULL;
|
|
|
|
int nWidth = prc->right - prc->left;
|
|
int nHeight = prc->bottom - prc->top;
|
|
HBITMAP hbmpChanged;
|
|
|
|
// hbmpChanged = hbmp;
|
|
hbmpChanged = ChangeBitmapColor(prc, hbmp, RGB(0,0,0), RGB(255,255,255));
|
|
if (!hbmpChanged)
|
|
return NULL;
|
|
|
|
g_phdcDst->SetDIB(nWidth, nHeight);
|
|
|
|
g_phdcSrc->SetBitmap(hbmpChanged);
|
|
g_phdcMask->SetBitmap(hbmpMask);
|
|
|
|
RECT rc;
|
|
::SetRect(&rc, 0, 0, nWidth, nHeight);
|
|
FillRect( *g_phdcDst, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCINVERT);
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCAND);
|
|
|
|
#if 0
|
|
{
|
|
CBitmapDC hdcTmp;
|
|
BitBlt(hdcTmp, 0, 30, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCCOPY);
|
|
BitBlt(hdcTmp, 30, 30, nWidth, nHeight, *g_phdcMask, 0, 0, SRCCOPY);
|
|
BitBlt(hdcTmp, 60, 30, nWidth, nHeight, *g_phdcDst, 0, 0, SRCCOPY);
|
|
}
|
|
#endif
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit(TRUE);
|
|
|
|
DeleteObject(hbmpChanged);
|
|
return g_phdcDst->GetBitmapAndKeep();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CreateMaskBitmap
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HBITMAP CreateMaskBmp(const RECT *prc, HBITMAP hbmp, HBITMAP hbmpMask, HBRUSH hbrBk, COLORREF colText, COLORREF colBk)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return NULL;
|
|
|
|
int nWidth = prc->right - prc->left;
|
|
int nHeight = prc->bottom - prc->top;
|
|
|
|
HBITMAP hbmpBlk = ConvertBlackBKGBitmap(prc, hbmp, hbmpMask, hbrBk);
|
|
if (hbmpBlk)
|
|
return hbmpBlk;
|
|
|
|
|
|
g_phdcDst->SetDIB(nWidth, nHeight);
|
|
|
|
g_phdcSrc->SetBitmap(hbmp);
|
|
g_phdcMask->SetBitmap(hbmpMask);
|
|
|
|
RECT rc;
|
|
::SetRect(&rc, 0, 0, nWidth, nHeight);
|
|
|
|
COLORREF colTextOld = SetTextColor( *g_phdcDst, colText);
|
|
COLORREF colBackOld = SetBkColor( *g_phdcDst, colBk);
|
|
FillRect( *g_phdcDst, &rc, hbrBk);
|
|
SetTextColor( *g_phdcDst, colTextOld );
|
|
SetBkColor( *g_phdcDst, colBackOld );
|
|
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCAND);
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCINVERT);
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit(TRUE);
|
|
return g_phdcDst->GetBitmapAndKeep();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CreateShadowMaskBitmap
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HBITMAP CreateShadowMaskBmp(RECT *prc, HBITMAP hbmp, HBITMAP hbmpMask, HBRUSH hbrBk, HBRUSH hbrShadow)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return NULL;
|
|
|
|
prc->left--;
|
|
prc->top--;
|
|
|
|
int nWidth = prc->right - prc->left;
|
|
int nHeight = prc->bottom - prc->top;
|
|
CBitmapDC hdcDstShadow(TRUE);
|
|
|
|
g_phdcDst->SetDIB(nWidth, nHeight);
|
|
|
|
g_phdcSrc->SetBitmap(hbmp);
|
|
g_phdcMask->SetBitmap(hbmpMask);
|
|
|
|
hdcDstShadow.SetDIB(nWidth, nHeight);
|
|
|
|
RECT rc;
|
|
::SetRect(&rc, 0, 0, nWidth, nHeight);
|
|
FillRect( *g_phdcDst, &rc, hbrBk);
|
|
|
|
FillRect(hdcDstShadow, &rc, hbrShadow);
|
|
BitBlt(hdcDstShadow, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCPAINT);
|
|
|
|
BitBlt(*g_phdcDst, 2, 2, nWidth, nHeight, hdcDstShadow, 0, 0, SRCAND);
|
|
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCAND);
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCINVERT);
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit(TRUE);
|
|
return g_phdcDst->GetBitmapAndKeep();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CreateDisabledBitmap
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HBITMAP CreateDisabledBitmap(const RECT *prc, HBITMAP hbmpMask, HBRUSH hbrBk, HBRUSH hbrShadow, BOOL fShadow)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return NULL;
|
|
|
|
int nWidth = prc->right - prc->left;
|
|
int nHeight = prc->bottom - prc->top;
|
|
|
|
g_phdcDst->SetDIB(nWidth, nHeight);
|
|
|
|
g_phdcMask->SetBitmap(hbmpMask);
|
|
|
|
g_phdcSrc->SetDIB(nWidth, nHeight);
|
|
|
|
RECT rc;
|
|
::SetRect(&rc, 0, 0, nWidth, nHeight);
|
|
FillRect( *g_phdcDst, &rc, hbrBk);
|
|
|
|
FillRect( *g_phdcSrc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
|
|
BitBlt(*g_phdcSrc, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCINVERT);
|
|
if (fShadow)
|
|
BitBlt(*g_phdcDst, 1, 1, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCPAINT);
|
|
else
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCPAINT);
|
|
|
|
#if 0
|
|
BitBlt(*g_phdcTmp, 0, 30, 30, 30, *g_phdcMask, 0, 0, SRCCOPY);
|
|
BitBlt(*g_phdcTmp, 30, 30, 30, 30, *g_phdcSrc, 0, 0, SRCCOPY);
|
|
BitBlt(*g_phdcTmp, 60, 30, 30, 30, *g_phdcDst, 0, 0, SRCCOPY);
|
|
#endif
|
|
|
|
FillRect( *g_phdcSrc, &rc, hbrShadow);
|
|
BitBlt(*g_phdcSrc, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCPAINT);
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCAND);
|
|
|
|
#if 0
|
|
BitBlt(*g_phdcTmp, 0, 60, 30, 30, *g_phdcMask, 0, 0, SRCCOPY);
|
|
BitBlt(*g_phdcTmp, 30, 60, 30, 30, *g_phdcSrc, 0, 0, SRCCOPY);
|
|
BitBlt(*g_phdcTmp, 60, 60, 30, 30, *g_phdcDst, 0, 0, SRCCOPY);
|
|
#endif
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit(TRUE);
|
|
return g_phdcDst->GetBitmapAndKeep();
|
|
}
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUIDrawState
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CUIDrawState(HDC hdc, HBRUSH hbr, DRAWSTATEPROC lpOutputFunc, LPARAM lData, WPARAM wData, int x, int y, int cx, int cy, UINT fuFlags)
|
|
{
|
|
BOOL bRet;
|
|
POINT ptOldOrg;
|
|
BOOL fRetVal;
|
|
|
|
// we have to do this viewport trick to get around the fact that
|
|
// DrawState has a GDI bug in NT4, such that it handles offsets improperly.
|
|
// so we do the offset by hand.
|
|
fRetVal = SetViewportOrgEx( hdc, 0, 0, &ptOldOrg );
|
|
Assert( fRetVal );
|
|
|
|
bRet = DrawState(hdc,
|
|
hbr,
|
|
lpOutputFunc,
|
|
lData,
|
|
wData,
|
|
x + ptOldOrg.x,
|
|
y + ptOldOrg.y,
|
|
cx,
|
|
cy,
|
|
fuFlags);
|
|
|
|
fRetVal = SetViewportOrgEx( hdc, ptOldOrg.x, ptOldOrg.y, NULL );
|
|
Assert( fRetVal );
|
|
|
|
return bRet;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// DrawMaskBitmapOnDC
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void DrawMaskBmpOnDC(HDC hdc, const RECT *prc, HBITMAP hbmp, HBITMAP hbmpMask)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return;
|
|
|
|
int nWidth = prc->right - prc->left;
|
|
int nHeight = prc->bottom - prc->top;
|
|
|
|
g_phdcDst->SetDIB(nWidth, nHeight);
|
|
|
|
g_phdcSrc->SetBitmap(hbmp);
|
|
g_phdcMask->SetBitmap(hbmpMask);
|
|
|
|
RECT rc;
|
|
::SetRect(&rc, 0, 0, nWidth, nHeight);
|
|
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, hdc, prc->left, prc->top, SRCCOPY);
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcMask, 0, 0, SRCAND);
|
|
BitBlt(*g_phdcDst, 0, 0, nWidth, nHeight, *g_phdcSrc, 0, 0, SRCINVERT);
|
|
|
|
BitBlt(hdc, prc->left, prc->top, nWidth, nHeight, *g_phdcDst, 0, 0, SRCCOPY);
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit();
|
|
}
|
|
|
|
|
|
/* C U I G E T I C O N S I Z E */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
get icon image size
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIGetIconSize( HICON hIcon, SIZE *psize )
|
|
{
|
|
ICONINFO IconInfo;
|
|
BITMAP bmp;
|
|
|
|
Assert( hIcon != NULL );
|
|
Assert( psize != NULL );
|
|
|
|
if (!GetIconInfo( hIcon, &IconInfo )) {
|
|
return FALSE;
|
|
}
|
|
|
|
GetObject( IconInfo.hbmColor, sizeof(bmp), &bmp );
|
|
DeleteObject( IconInfo.hbmColor );
|
|
DeleteObject( IconInfo.hbmMask );
|
|
|
|
psize->cx = bmp.bmWidth;
|
|
psize->cy = bmp.bmHeight;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* C U I G E T B I T M A P S I Z E */
|
|
/*------------------------------------------------------------------------------
|
|
|
|
get bitmap image size
|
|
|
|
------------------------------------------------------------------------------*/
|
|
BOOL CUIGetBitmapSize( HBITMAP hBmp, SIZE *psize )
|
|
{
|
|
BITMAP bmp;
|
|
|
|
Assert( hBmp != NULL );
|
|
Assert( psize != NULL );
|
|
|
|
if (GetObject( hBmp, sizeof(bmp), &bmp ) == 0) {
|
|
return FALSE;
|
|
}
|
|
|
|
psize->cx = bmp.bmWidth;
|
|
psize->cy = bmp.bmHeight;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUIGetIconBitmaps
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CUIGetIconBitmaps(HICON hIcon, HBITMAP *phbmp, HBITMAP *phbmpMask, SIZE *psize)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return FALSE;
|
|
|
|
SIZE size;
|
|
|
|
if (psize)
|
|
size = *psize;
|
|
else if (!CUIGetIconSize( hIcon, &size))
|
|
return FALSE;
|
|
|
|
g_phdcSrc->SetDIB(size.cx, size.cy);
|
|
g_phdcMask->SetBitmap(size.cx, size.cy, 1, 1);
|
|
RECT rc = {0, 0, size.cx, size.cy};
|
|
FillRect(*g_phdcSrc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
|
DrawIconEx(*g_phdcSrc, 0, 0, hIcon, size.cx, size.cy, 0, NULL, DI_NORMAL);
|
|
DrawIconEx(*g_phdcMask, 0, 0, hIcon, size.cx, size.cy, 0, NULL, DI_MASK);
|
|
|
|
g_phdcSrc->Uninit(TRUE);
|
|
g_phdcMask->Uninit(TRUE);
|
|
|
|
*phbmp = g_phdcSrc->GetBitmapAndKeep();
|
|
*phbmpMask = g_phdcMask->GetBitmapAndKeep();
|
|
return TRUE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUIGetProcessDefaultLayout
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DWORD CUIProcessDefaultLayout()
|
|
{
|
|
static BOOL fInitialized = FALSE;
|
|
DWORD dw;
|
|
|
|
if (!fInitialized) {
|
|
HMODULE hmodUser32 = GetHLibUser32();
|
|
if (hmodUser32)
|
|
vpfnGetProcessDefaultLayout = (PFNGETPROCESSDEFAULTLAYOUT)GetProcAddress( hmodUser32, TEXT("GetProcessDefaultLayout") );
|
|
fInitialized = TRUE;
|
|
}
|
|
|
|
if (!vpfnGetProcessDefaultLayout)
|
|
return 0;
|
|
|
|
if (!vpfnGetProcessDefaultLayout(&dw))
|
|
return 0;
|
|
|
|
return dw;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUISetLayout
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DWORD CUISetLayout(HDC hdc, DWORD dw)
|
|
{
|
|
static BOOL fInitialized = FALSE;
|
|
|
|
if (!fInitialized) {
|
|
HMODULE hmodGdi32 = GetHLibGdi32();
|
|
if (hmodGdi32)
|
|
vpfnSetLayout = (PFNSETLAYOUT)GetProcAddress( hmodGdi32, TEXT("SetLayout") );
|
|
fInitialized = TRUE;
|
|
}
|
|
|
|
if (!vpfnSetLayout)
|
|
return 0;
|
|
|
|
return vpfnSetLayout(hdc, dw);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUISetLayout
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HBITMAP CUIMirrorBitmap(HBITMAP hbmOrg, HBRUSH hbrBk)
|
|
{
|
|
if (!g_fInitUIFBitmapDCs)
|
|
return NULL;
|
|
|
|
BITMAP bm;
|
|
|
|
if (!GetObject(hbmOrg, sizeof(BITMAP), &bm))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
g_phdcSrc->SetBitmap(hbmOrg);
|
|
g_phdcDst->SetDIB(bm.bmWidth, bm.bmHeight);
|
|
g_phdcMask->SetDIB(bm.bmWidth, bm.bmHeight);
|
|
|
|
RECT rc;
|
|
::SetRect(&rc, 0, 0, bm.bmWidth, bm.bmHeight);
|
|
FillRect( *g_phdcDst, &rc, hbrBk);
|
|
|
|
CUISetLayout(*g_phdcMask, LAYOUT_RTL);
|
|
|
|
BitBlt(*g_phdcMask, 0, 0, bm.bmWidth, bm.bmHeight, *g_phdcSrc, 0, 0, SRCCOPY);
|
|
|
|
CUISetLayout(*g_phdcMask, 0);
|
|
|
|
//
|
|
// The offset by 1 is to solve the off-by-one problem.
|
|
//
|
|
BitBlt(*g_phdcDst, 0, 0, bm.bmWidth, bm.bmHeight, *g_phdcMask, 1, 0, SRCCOPY);
|
|
|
|
g_phdcSrc->Uninit();
|
|
g_phdcMask->Uninit();
|
|
g_phdcDst->Uninit(TRUE);
|
|
return g_phdcDst->GetBitmapAndKeep();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUICicSystemModulePath
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CUICicSystemModulePath
|
|
{
|
|
public:
|
|
CUICicSystemModulePath()
|
|
{
|
|
m_szPath[0] = TEXT('\0');
|
|
m_uRet = 0;
|
|
}
|
|
|
|
UINT Init(LPCTSTR lpModuleName)
|
|
{
|
|
m_uRet = GetSystemDirectory(m_szPath, ARRAYSIZE(m_szPath));
|
|
if (m_uRet)
|
|
{
|
|
if (m_szPath[m_uRet - 1] != TEXT('\\'))
|
|
{
|
|
m_szPath[m_uRet] = TEXT('\\');
|
|
m_uRet++;
|
|
}
|
|
UINT uLength = lstrlen(lpModuleName);
|
|
if (ARRAYSIZE(m_szPath) - m_uRet > uLength)
|
|
{
|
|
lstrcpyn(&m_szPath[m_uRet], lpModuleName, ARRAYSIZE(m_szPath) - m_uRet);
|
|
m_uRet += uLength;
|
|
}
|
|
else
|
|
m_uRet = 0;
|
|
}
|
|
return m_uRet;
|
|
}
|
|
|
|
LPTSTR GetPath()
|
|
{
|
|
return m_szPath;
|
|
}
|
|
|
|
private:
|
|
TCHAR m_szPath[MAX_PATH + 1];
|
|
UINT m_uRet;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUIGetSystemModuleHandle
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HMODULE CUIGetSystemModuleHandle(LPCTSTR lpModuleName)
|
|
{
|
|
CUICicSystemModulePath path;
|
|
|
|
if (!path.Init(lpModuleName))
|
|
return NULL;
|
|
|
|
return GetModuleHandle(path.GetPath());
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CUILoadSystemModuleHandle
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HMODULE CUILoadSystemModuleHandle(LPCTSTR lpModuleName)
|
|
{
|
|
CUICicSystemModulePath path;
|
|
|
|
if (!path.Init(lpModuleName))
|
|
return NULL;
|
|
|
|
return LoadLibrary(path.GetPath());
|
|
}
|
|
|