www.pudn.com > ExpBar_src.zip > shellstyle.c
/* * file : shellstyle.c * language : ANSI/ISO C * plattform : Win32 (Windows 98/Me/NT/2000/XP) * description : implements the parser (shellstyle.dll) for the xp-style explorer bar * * revision history: * ================= * * date: author: description: * -------------------------------------------------------------------------- * 02/17/2004 Ingo A. Kubbilun first published version 1.0 */ #include#include #include typedef struct tagCOLORDEF COLDEF, *PCOLDEF; typedef struct tagCURSORDEF CURDEF, *PCURDEF; typedef struct tagALIGNDEF ALIGNDEF, *PALIGNDEF; #define XCHGCOLORREF(_x) ((((_x)&0xFF00FF00L)|(((_x)&0x00FF0000L)>>16)|(((_x)&0x000000FFL)<<16))) struct tagCOLORDEF { char szColor[60]; ULONG uColor; }; struct tagCURSORDEF { char szCursor[60]; LPCTSTR lpCursorName; }; struct tagALIGNDEF { char szAlign[60]; UINT uAlign; }; #define NUM_DEFCOLORS 175 static COLDEF sColors[NUM_DEFCOLORS] = { { "AliceBlue",0xF0F8FF }, { "AntiqueWhite",0xFAEBD7 }, { "Aqua",0x00FFFF }, { "Aquamarine",0x7FFFD4 }, { "Azure",0xF0FFFF }, { "Beige",0xF5F5DC }, { "Bisque",0xFFE4C4 }, { "Black",0x000000 }, { "BlanchedAlmond",0xFFEBCD }, { "Blue",0x0000FF }, { "BlueViolet",0x8A2BE2 }, { "Brown",0xA52A2A }, { "BurlyWood",0xDEB887 }, { "CadetBlue",0x5F9EA0 }, { "Chartreuse",0x7FFF00 }, { "Chocolate",0xD2691E }, { "Coral",0xFF7F50 }, { "CornflowerBlue",0x6495ED }, { "Cornsilk",0xFFF8DC }, { "Crimson",0xDC143C }, { "Cyan",0x00FFFF }, { "DarkBlue",0x00008B }, { "DarkCyan",0x008B8B }, { "DarkGoldenrod",0xB8860B }, { "DarkGray",0xA9A9A9 }, { "DarkGreen",0x006400 }, { "DarkGrey",0xA9A9A9 }, { "DarkKhaki",0xBDB76B }, { "DarkMagenta",0x8B008B }, { "DarkOliveGreen",0x556B2F }, { "DarkOrange",0xFF8C00 }, { "DarkOrchid",0x9932CC }, { "DarkRed",0x8B0000 }, { "DarkSalmon",0xE9967A }, { "DarkSeaGreen",0x8FBC8F }, { "DarkSlateBlue",0x483D8B }, { "DarkSlateGray",0x2F4F4F }, { "DarkTurquoise",0x00CED1 }, { "DarkViolet",0x9400D3 }, { "DeepPink",0xFF1493 }, { "DeepSkyBlue",0x00BFFF }, { "DimGray",0x696969 }, { "DkBlue",0x00008B }, { "DkCyan",0x008B8B }, { "DkGoldenrod",0xB8860B }, { "DkGray",0xA9A9A9 }, { "DkGreen",0x006400 }, { "DkGrey",0xA9A9A9 }, { "DkKhaki",0xBDB76B }, { "DkMagenta",0x8B008B }, { "DkOliveGreen",0x556B2F }, { "DkOrange",0xFF8C00 }, { "DkOrchid",0x9932CC }, { "DkRed",0x8B0000 }, { "DkSalmon",0xE9967A }, { "DkSeaGreen",0x8FBC8F }, { "DkSlateBlue",0x483D8B }, { "DkSlateGray",0x2F4F4F }, { "DkTurquoise",0x00CED1 }, { "DkViolet",0x9400D3 }, { "DodgerBlue",0x1E90FF }, { "FireBrick",0xB22222 }, { "FloralWhite",0xFFFAF0 }, { "ForestGreen",0x228B22 }, { "Fuchsia",0xFF00FF }, { "Gainsboro",0xDCDCDC }, { "GhostWhite",0xF8F8FF }, { "Gold",0xFFD700 }, { "Goldenrod",0xDAA520 }, { "Gray",0x808080 }, { "Green",0x008000 }, { "GreenYellow",0xADFF2F }, { "Grey",0x808080 }, { "Honeydew",0xF0FFF0 }, { "HotPink",0xFF69B4 }, { "IndianRed",0xCD5C5C }, { "Indigo",0x4B0082 }, { "Ivory",0xFFFFF0 }, { "Khaki",0xF0E68C }, { "Lavender",0xE6E6FA }, { "LavenderBlush",0xFFF0F5 }, { "LawnGreen",0x7CFC00 }, { "LemonChiffon",0xFFFACD }, { "LightBlue",0xADD8E6 }, { "LightCoral",0xF08080 }, { "LightCyan",0xE0FFFF }, { "LightGoldenrodYellow",0xFAFAD2 }, { "LightGray",0xD3D3D3 }, { "LightGreen",0x90EE90 }, { "LightGrey",0xD3D3D3 }, { "LightPink",0xFFB6C1 }, { "LightSalmon",0xFFA07A }, { "LightSeaGreen",0x20B2AA }, { "LightSkyBlue",0x87CEFA }, { "LightSlateGray",0x778899 }, { "LightSteelBlue",0xB0C4DE }, { "LightYellow",0xFFFFE0 }, { "Lime",0x00FF00 }, { "LimeGreen",0x32CD32 }, { "Linen",0xFAF0E6 }, { "LtBlue",0xADD8E6 }, { "LtCoral",0xF08080 }, { "LtCyan",0xE0FFFF }, { "LtGoldenrodYellow",0xFAFAD2 }, { "LtGray",0xD3D3D3 }, { "LtGreen",0x90EE90 }, { "LtGrey",0xD3D3D3 }, { "LtPink",0xFFB6C1 }, { "LtSalmon",0xFFA07A }, { "LtSeaGreen",0x20B2AA }, { "LtSkyBlue",0x87CEFA }, { "LtSlateGray",0x778899 }, { "LtSteelBlue",0xB0C4DE }, { "LtYellow",0xFFFFE0 }, { "Magenta",0xFF00FF }, { "Maroon",0x800000 }, { "MediumAquamarine",0x66CDAA }, { "MediumBlue",0x0000CD }, { "MediumOrchid",0xBA55D3 }, { "MediumPurple",0x9370DB }, { "MediumSeaGreen",0x3CB371 }, { "MediumSlateBlue",0x7B68EE }, { "MediumSpringGreen",0x00FA9A }, { "MediumTurquoise",0x48D1CC }, { "MediumVioletRed",0xC71585 }, { "MidnightBlue",0x191970 }, { "MintCream",0xF5FFFA }, { "MistyRose",0xFFE4E1 }, { "Moccasin",0xFFE4B5 }, { "NavajoWhite",0xFFDEAD }, { "Navy",0x000080 }, { "OldLace",0xFDF5E6 }, { "Olive",0x808000 }, { "OliveDrab",0x6B8E23 }, { "Orange",0xFFA500 }, { "OrangeRed",0xFF4500 }, { "Orchid",0xDA70D6 }, { "PaleGoldenrod",0xEEE8AA }, { "PaleGreen",0x98FB98 }, { "PaleTurquoise",0xAFEEEE }, { "PaleVioletRed",0xDB7093 }, { "PapayaWhip",0xFFEFD5 }, { "PeachPuff",0xFFDAB9 }, { "Peru",0xCD853F }, { "Pink",0xFFC0CB }, { "Plum",0xDDA0DD }, { "PowderBlue",0xB0E0E6 }, { "Purple",0x800080 }, { "Red",0xFF0000 }, { "RosyBrown",0xBC8F8F }, { "RoyalBlue",0x4169E1 }, { "SaddleBrown",0x8B4513 }, { "Salmon",0xFA8072 }, { "SandyBrown",0xF4A460 }, { "SeaGreen",0x2E8B57 }, { "Seashell",0xFFF5EE }, { "Sienna",0xA0522D }, { "Silver",0xC0C0C0 }, { "SkyBlue",0x87CEEB }, { "SlateBlue",0x6A5ACD }, { "SlateGray",0x708090 }, { "Snow",0xFFFAFA }, { "SpringGreen",0x00FF7F }, { "SteelBlue",0x4682B4 }, { "Tan",0xD2B48C }, { "Teal",0x008080 }, { "Thistle",0xD8BFD8 }, { "Tomato",0xFF6347 }, { "Turquoise",0x40E0D0 }, { "Violet",0xEE82EE }, { "Wheat",0xF5DEB3 }, { "White",0xFFFFFF }, { "WhiteSmoke",0xF5F5F5 }, { "Yellow",0xFFFF00 }, { "YellowGreen",0x9ACD32 } }; #define NUM_DEFALIGNS 29 static ALIGNDEF sAlignments[NUM_DEFALIGNS] = { { "bottom", TDA_BOTTOM }, { "bottomcenter", TDA_BOTTOMCENTER }, { "bottomleft", TDA_BOTTOMLEFT }, { "bottomright", TDA_BOTTOMRIGHT }, { "center", TDA_CENTER }, { "centerbottom", TDA_CENTERBOTTOM }, { "centermiddle", TDA_CENTERMIDDLE }, { "centertop", TDA_CENTERTOP }, { "focusrect", TDA_FOCUSRECT }, { "left", TDA_LEFT }, { "leftbottom", TDA_LEFTBOTTOM }, { "leftmiddle", TDA_LEFTMIDDLE }, { "lefttop", TDA_LEFTTOP }, { "middle", TDA_MIDDLE }, { "middlecenter", TDA_MIDDLECENTER }, { "middleleft", TDA_MIDDLELEFT }, { "middleright", TDA_MIDDLERIGHT }, { "right", TDA_RIGHT }, { "rightbottom", TDA_RIGHTBOTTOM }, { "rightmiddle", TDA_RIGHTMIDDLE }, { "righttop", TDA_RIGHTTOP }, { "top", TDA_TOP }, { "topcenter", TDA_TOPCENTER }, { "topleft", TDA_TOPLEFT }, { "topright", TDA_TOPRIGHT }, { "wrap", TDA_WRAP }, { "wrapcenter", TDA_WRAPCENTER }, { "wrapleft", TDA_WRAPLEFT }, { "wrapright", TDA_WRAPRIGHT } }; #define NUM_DEFCURSORS 14 static CURDEF sCursors[NUM_DEFCURSORS] = { { "arrow", IDC_ARROW }, { "cross", IDC_CROSS }, { "hand", IDC_HAND }, { "help", IDC_HELP }, { "ibeam", IDC_IBEAM }, { "no", IDC_NO }, { "size", IDC_SIZE }, { "sizeall", IDC_SIZEALL }, { "sizenesw", IDC_SIZENESW }, { "sizens", IDC_SIZENS }, { "sizenwse", IDC_SIZENWSE }, { "sizewe", IDC_SIZEWE }, { "uparrow", IDC_UPARROW }, { "wait", IDC_WAIT } }; static int CALLBACK EnumFontFamProc( ENUMLOGFONT *lpelf, NEWTEXTMETRIC *lpntm, int FontType, LPARAM lParam ) { return 0; } int APIPRIVATE Pt2FontHeight ( int iPt ) { HDC hDC = GetDC(NULL); POINT pt,ptOrg; pt.y = MulDiv(iPt,GetDeviceCaps(hDC, LOGPIXELSY),72); DPtoLP(hDC, &pt, 1); ptOrg.x = 0; ptOrg.y = 0; DPtoLP(hDC, &ptOrg, 1); ReleaseDC(NULL,hDC); return -abs(pt.y - ptOrg.y); } static PTOKEN APIPRIVATE ParsePropertyFile ( PBYTE pbyBuffer, UINT uSize ); static PTOKEN APIPRIVATE GetPropertyTokens ( PTOKEN pTokens, char *pcszResId, // e.g. "taskpane" char *pcszElement, // e.g. "scrollbar" int iElemSpecifiers, // no. of specifiers PELEMSPEC pSpecs, // NULL or ptr to specs char *pcszProperty ); static VOID APIPRIVATE FreeTokens ( PTOKEN pTokens ); static BOOL APIPRIVATE AnalyseToken ( PTOKEN pTokens, PTOKDATA pTD, HMODULE hinstDLL ); static PTOKEN APIPRIVATE GetColor ( PTOKEN pTokens, DWORD *pdwColor, BOOL *pbIndex ); static BOOL APIPRIVATE GetStyleDllValues ( PTOKEN pTokens, PEXPBARINFO pEBI, HMODULE hinstDll ); static HBITMAP APIPRIVATE Bitmap2AlphaBitmap ( HBITMAP hBitmap, DWORD dwTransColor, BOOL bColorIdx, int *piWidth, int *piHeight ); static HBITMAP APIPRIVATE LoadAlphaBitmap ( HMODULE hInstDll, UINT uBmpId, COLORREF crReplaceCol, COLORREF crReplaceBy, COLORREF crTransparent, int *piWidth, int *piHeight ); VOID APIENTRY FreeExplorerBarInfo ( PEXPBARINFO pEBI ) { if (pEBI->hAlphaPreXPBmpArrowUp[0]) DeleteObject(pEBI->hAlphaPreXPBmpArrowUp[0]); if (pEBI->hAlphaPreXPBmpArrowUp[1]) DeleteObject(pEBI->hAlphaPreXPBmpArrowUp[1]); if (pEBI->hAlphaPreXPBmpArrowUp[2]) DeleteObject(pEBI->hAlphaPreXPBmpArrowUp[2]); if (pEBI->hAlphaPreXPBmpArrowDn[0]) DeleteObject(pEBI->hAlphaPreXPBmpArrowDn[0]); if (pEBI->hAlphaPreXPBmpArrowDn[1]) DeleteObject(pEBI->hAlphaPreXPBmpArrowDn[1]); if (pEBI->hAlphaPreXPBmpArrowDn[2]) DeleteObject(pEBI->hAlphaPreXPBmpArrowDn[2]); if (pEBI->headernormal.hAlphaBmpListHeader) DeleteObject(pEBI->headernormal.hAlphaBmpListHeader); if (pEBI->headernormal.hAlphaBmpArrowUp[0]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowUp[0]); if (pEBI->headernormal.hAlphaBmpArrowUp[1]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowUp[1]); if (pEBI->headernormal.hAlphaBmpArrowUp[2]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowUp[2]); if (pEBI->headernormal.hAlphaBmpArrowDn[0]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowDn[0]); if (pEBI->headernormal.hAlphaBmpArrowDn[1]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowDn[1]); if (pEBI->headernormal.hAlphaBmpArrowDn[2]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowDn[2]); if (pEBI->headerspecial.hAlphaBmpListHeader) DeleteObject(pEBI->headerspecial.hAlphaBmpListHeader); if (pEBI->headerspecial.hAlphaBmpArrowUp[0]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowUp[0]); if (pEBI->headerspecial.hAlphaBmpArrowUp[1]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowUp[1]); if (pEBI->headerspecial.hAlphaBmpArrowUp[2]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowUp[2]); if (pEBI->headerspecial.hAlphaBmpArrowDn[0]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowDn[0]); if (pEBI->headerspecial.hAlphaBmpArrowDn[1]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowDn[1]); if (pEBI->headerspecial.hAlphaBmpArrowDn[2]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowDn[2]); } BOOL APIENTRY GetExplorerBarInfo ( PEXPBARINFO pEBI, BOOL bIgnoreShellStyleDll ) { HKEY hKey = NULL; TCHAR szString[MAX_PATH]; DWORD dwSize; TCHAR *p; HMODULE hinstDll; HRSRC hShellInfo; HGLOBAL hShellInfoMem; PVOID pvShellInfo; UINT uShellInfoSize; PTOKEN pTokens; LOGFONT lf; if ((!pEBI) || (pEBI->cbSize!=sizeof(EXPBARINFO))) return FALSE; memset(pEBI,0,sizeof(EXPBARINFO)); pEBI->cbSize = sizeof(EXPBARINFO); if ((g_uOSVersion bPreXP = TRUE; pEBI->taskpane.crBackground1 = GetSysColor(COLOR_WINDOW); pEBI->taskpane.crBackground2 = GetSysColor(COLOR_WINDOW); pEBI->taskpane.iValue = 0; pEBI->taskpane.rcPadding.left = pEBI->taskpane.rcPadding.top = pEBI->taskpane.rcPadding.right = pEBI->taskpane.rcPadding.bottom = 12; pEBI->tasknormal.rcTitlePadding.left = 6; pEBI->tasknormal.rcTitlePadding.top = 0; pEBI->tasknormal.rcTitlePadding.right = 4; pEBI->tasknormal.rcTitlePadding.bottom = 0; pEBI->tasknormal.rcMarginsActionTask.left = 0; pEBI->tasknormal.rcMarginsActionTask.top = 4; pEBI->tasknormal.rcMarginsActionTask.right = 0; pEBI->tasknormal.rcMarginsActionTask.bottom = 0; pEBI->tasknormal.rcMarginsDestinationTask.left = 0; pEBI->tasknormal.rcMarginsDestinationTask.top = 4; pEBI->tasknormal.rcMarginsDestinationTask.right = 0; pEBI->tasknormal.rcMarginsDestinationTask.bottom = 0; pEBI->tasknormal.crLinkNormal = GetSysColor(COLOR_BTNTEXT); pEBI->tasknormal.crLinkHot = GetSysColor(COLOR_HOTLIGHT); memcpy(&pEBI->taskspecial,&pEBI->tasknormal,sizeof(pEBI->tasknormal)); if (GetLogFont((HFONT)GetStockObject(DEFAULT_GUI_FONT),&lf)) { #ifdef UNICODE WideCharToMultiByte(CP_ACP,0,lf.lfFaceName,-1,pEBI->headernormal.szFontFace,MAX_PATH,NULL,NULL); #else strcpy(pEBI->headernormal.szFontFace,lf.lfFaceName); #endif pEBI->headernormal.iFontSize = lf.lfHeight; } else { strcpy(pEBI->headernormal.szFontFace,"Arial"); pEBI->headernormal.iFontSize = -13; } pEBI->headernormal.iMargin = 15; pEBI->headernormal.crHeaderNormal = GetSysColor(COLOR_BTNTEXT); pEBI->headernormal.crHeaderHot = GetSysColor(COLOR_BTNTEXT); pEBI->headernormal.uAlignment = TDA_MIDDLELEFT; pEBI->headernormal.iFontWeightHeader = FW_BOLD; pEBI->headernormal.rcPaddingHeader.left = 10; pEBI->headernormal.rcPaddingHeader.top = 0; pEBI->headernormal.rcPaddingHeader.right = 1; pEBI->headernormal.rcPaddingHeader.bottom = 0; pEBI->headernormal.rcBorderThicknessHeader.left = 2; pEBI->headernormal.rcBorderThicknessHeader.top = 2; pEBI->headernormal.rcBorderThicknessHeader.right = 2; pEBI->headernormal.rcBorderThicknessHeader.bottom = 0; pEBI->headernormal.crBorderColorHeader = GetSysColor(COLOR_3DFACE); pEBI->headernormal.iHeaderBmpWidth = 186; pEBI->headernormal.iHeaderBmpHeight = 21; pEBI->headernormal.hAlphaBmpArrowUp[0] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP_NORMAL, RGB(13,14,15), GetSysColor(COLOR_BTNTEXT), RGB(255,0,0), &pEBI->headernormal.iBmpArrowWidth, &pEBI->headernormal.iBmpArrowHeight); pEBI->headernormal.hAlphaBmpArrowUp[1] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP_HOT, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->headernormal.hAlphaBmpArrowUp[2] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP_PRESSED, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->headernormal.hAlphaBmpArrowDn[0] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN_NORMAL, RGB(13,14,15), GetSysColor(COLOR_BTNTEXT), RGB(255,0,0), NULL,NULL); pEBI->headernormal.hAlphaBmpArrowDn[1] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN_HOT, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->headernormal.hAlphaBmpArrowDn[2] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN_PRESSED, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->headernormal.crTLbackground = GetSysColor(COLOR_WINDOW); pEBI->headernormal.crTLBorder = GetSysColor(COLOR_3DFACE); pEBI->headernormal.rcTLBorderThickness.left = 1; pEBI->headernormal.rcTLBorderThickness.right = 1; pEBI->headernormal.rcTLBorderThickness.top = 0; pEBI->headernormal.rcTLBorderThickness.bottom = 1; pEBI->headernormal.rcTLPadding.left = pEBI->headernormal.rcTLPadding.right = 12; pEBI->headernormal.rcTLPadding.top = pEBI->headernormal.rcTLPadding.bottom = 10; if (GetLogFont((HFONT)GetStockObject(DEFAULT_GUI_FONT),&lf)) { #ifdef UNICODE WideCharToMultiByte(CP_ACP,0,lf.lfFaceName,-1,pEBI->headerspecial.szFontFace,MAX_PATH,NULL,NULL); #else strcpy(pEBI->headerspecial.szFontFace,lf.lfFaceName); #endif pEBI->headerspecial.iFontSize = lf.lfHeight; } else { strcpy(pEBI->headerspecial.szFontFace,"Arial"); pEBI->headerspecial.iFontSize = -13; } pEBI->headerspecial.iMargin = 15; pEBI->headerspecial.crHeaderNormal = GetSysColor(COLOR_HIGHLIGHTTEXT); pEBI->headerspecial.crHeaderHot = GetSysColor(COLOR_HIGHLIGHTTEXT); pEBI->headerspecial.uAlignment = TDA_MIDDLELEFT; pEBI->headerspecial.iFontWeightHeader = FW_BOLD; pEBI->headerspecial.rcPaddingHeader.left = 10; pEBI->headerspecial.rcPaddingHeader.top = 0; pEBI->headerspecial.rcPaddingHeader.right = 1; pEBI->headerspecial.rcPaddingHeader.bottom = 0; pEBI->headerspecial.rcBorderThicknessHeader.left = 2; pEBI->headerspecial.rcBorderThicknessHeader.top = 2; pEBI->headerspecial.rcBorderThicknessHeader.right = 2; pEBI->headerspecial.rcBorderThicknessHeader.bottom = 0; pEBI->headerspecial.crBorderColorHeader = GetSysColor(COLOR_HIGHLIGHT); pEBI->headerspecial.iHeaderBmpWidth = 186; pEBI->headerspecial.iHeaderBmpHeight = 21; pEBI->headerspecial.hAlphaBmpArrowUp[0] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP_NORMAL, RGB(13,14,15), GetSysColor(COLOR_HIGHLIGHTTEXT), RGB(255,0,0), &pEBI->headerspecial.iBmpArrowWidth, &pEBI->headerspecial.iBmpArrowHeight); pEBI->headerspecial.hAlphaBmpArrowUp[1] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP_HOT, RGB(13,14,15), GetSysColor(COLOR_HIGHLIGHTTEXT), RGB(255,0,0), NULL,NULL); pEBI->headerspecial.hAlphaBmpArrowUp[2] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP_PRESSED, RGB(13,14,15), GetSysColor(COLOR_HIGHLIGHTTEXT), RGB(255,0,0), NULL,NULL); pEBI->headerspecial.hAlphaBmpArrowDn[0] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN_NORMAL, RGB(13,14,15), GetSysColor(COLOR_HIGHLIGHTTEXT), RGB(255,0,0), NULL,NULL); pEBI->headerspecial.hAlphaBmpArrowDn[1] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN_HOT, RGB(13,14,15), GetSysColor(COLOR_HIGHLIGHTTEXT), RGB(255,0,0), NULL,NULL); pEBI->headerspecial.hAlphaBmpArrowDn[2] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN_PRESSED, RGB(13,14,15), GetSysColor(COLOR_HIGHLIGHTTEXT), RGB(255,0,0), NULL,NULL); pEBI->headerspecial.crTLbackground = GetSysColor(COLOR_WINDOW); pEBI->headerspecial.crTLBorder = GetSysColor(COLOR_HIGHLIGHT); pEBI->headerspecial.uTLAlign = TDA_BOTTOMRIGHT; pEBI->headerspecial.rcTLBorderThickness.left = 1; pEBI->headerspecial.rcTLBorderThickness.right = 1; pEBI->headerspecial.rcTLBorderThickness.top = 0; pEBI->headerspecial.rcTLBorderThickness.bottom = 1; pEBI->headerspecial.rcTLPadding.left = pEBI->headerspecial.rcTLPadding.right = 12; pEBI->headerspecial.rcTLPadding.top = pEBI->headerspecial.rcTLPadding.bottom = 10; pEBI->hAlphaPreXPBmpArrowUp[0] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP2_NORMAL, RGB(13,14,15), GetSysColor(COLOR_BTNTEXT), RGB(255,0,0), &pEBI->iBmpPreXPArrowWidth, &pEBI->iBmpPreXPArrowHeight); pEBI->hAlphaPreXPBmpArrowUp[1] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP2_HOT, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->hAlphaPreXPBmpArrowUp[2] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRUP2_PRESSED, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->hAlphaPreXPBmpArrowDn[0] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN2_NORMAL, RGB(13,14,15), GetSysColor(COLOR_BTNTEXT), RGB(255,0,0), NULL,NULL); pEBI->hAlphaPreXPBmpArrowDn[1] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN2_HOT, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); pEBI->hAlphaPreXPBmpArrowDn[2] = LoadAlphaBitmap(g_hInstDLL, IDB_ARRDN2_PRESSED, RGB(13,14,15), GetSysColor(COLOR_HOTLIGHT), RGB(255,0,0), NULL,NULL); return TRUE; } if ((ERROR_SUCCESS!=RegOpenKey(HKEY_CURRENT_USER, __T("Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager"), &hKey)) || (!hKey)) goto DoThemePreXP; dwSize=sizeof(szString); if (ERROR_SUCCESS!=RegQueryValueEx(hKey,__T("ThemeActive"),NULL,NULL,(LPBYTE)szString,&dwSize)) { RegCloseKey(hKey); goto DoThemePreXP; } #ifdef UNICODE if (!_wtoi(szString)) #else if (!atoi(szString)) #endif { RegCloseKey(hKey); goto DoThemePreXP; } dwSize=sizeof(szString); if (ERROR_SUCCESS!=RegQueryValueEx(hKey,__T("DllName"),NULL,NULL,(LPBYTE)szString,&dwSize)) { RegCloseKey(hKey); goto DoThemePreXP; } ExpandEnvironmentStrings(szString,pEBI->szMsStylesDllName,MAX_PATH-1); __strcpy(szString,pEBI->szMsStylesDllName); __strlwr(szString); if (!__strstr(szString,__T(".msstyles"))) { RegCloseKey(hKey); memset(pEBI->szMsStylesDllName,0,sizeof(pEBI->szMsStylesDllName)); goto DoThemePreXP; } dwSize=sizeof(pEBI->szColorname); if (ERROR_SUCCESS!=RegQueryValueEx(hKey,__T("ColorName"),NULL,NULL,(PBYTE)pEBI->szColorname,&dwSize)) { RegCloseKey(hKey); ErrDoThemePreXP: memset(pEBI->szMsStylesDllName,0,sizeof(pEBI->szMsStylesDllName)); memset(pEBI->szColorname,0,sizeof(pEBI->szColorname)); goto DoThemePreXP; } RegCloseKey(hKey); __strcpy(szString,pEBI->szMsStylesDllName); p=__strrchr(szString,__T('\\')); if (!p) goto ErrDoThemePreXP; *p=0; __strcat(szString,__T("\\shell\\")); __strcat(szString,pEBI->szColorname); __strcat(szString,__T("\\shellstyle.dll")); __strcpy(pEBI->szShellStyleDllName,szString); // Try to open shell style dll and extract information if ((bIgnoreShellStyleDll) || (!(hinstDll = LoadLibraryEx(pEBI->szShellStyleDllName,NULL,LOAD_LIBRARY_AS_DATAFILE)))) { NoShellStyle: //pEBI->bUseThemeRenderer = TRUE; goto DoThemePreXP; } else // shell style dll present { pEBI->bShellStyleDll = TRUE; hShellInfo = FindResource(hinstDll,MAKEINTRESOURCE(1),TEXT("UIFILE")); if (!hShellInfo) { FreeLibrary(hinstDll); goto NoShellStyle; } hShellInfoMem = LoadResource(hinstDll,hShellInfo); if (!hShellInfoMem) { FreeLibrary(hinstDll); goto NoShellStyle; } uShellInfoSize = SizeofResource(hinstDll,hShellInfo); pvShellInfo = LockResource(hShellInfoMem); if ((!uShellInfoSize) || (!pvShellInfo)) { if (pvShellInfo) UnlockResource(hShellInfoMem); FreeResource(hShellInfoMem); FreeLibrary(hinstDll); goto NoShellStyle; } pTokens = ParsePropertyFile((PBYTE)pvShellInfo,uShellInfoSize); if (!pTokens) { UnlockResource(hShellInfoMem); FreeResource(hShellInfoMem); FreeLibrary(hinstDll); goto NoShellStyle; } if (!GetStyleDllValues(pTokens,pEBI,hinstDll)) { if (pEBI->headernormal.hAlphaBmpListHeader) DeleteObject(pEBI->headernormal.hAlphaBmpListHeader); if (pEBI->headernormal.hAlphaBmpArrowUp[0]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowUp[0]); if (pEBI->headernormal.hAlphaBmpArrowUp[1]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowUp[1]); if (pEBI->headernormal.hAlphaBmpArrowUp[2]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowUp[2]); if (pEBI->headernormal.hAlphaBmpArrowDn[0]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowDn[0]); if (pEBI->headernormal.hAlphaBmpArrowDn[1]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowDn[1]); if (pEBI->headernormal.hAlphaBmpArrowDn[2]) DeleteObject(pEBI->headernormal.hAlphaBmpArrowDn[2]); if (pEBI->headerspecial.hAlphaBmpListHeader) DeleteObject(pEBI->headerspecial.hAlphaBmpListHeader); if (pEBI->headerspecial.hAlphaBmpArrowUp[0]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowUp[0]); if (pEBI->headerspecial.hAlphaBmpArrowUp[1]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowUp[1]); if (pEBI->headerspecial.hAlphaBmpArrowUp[2]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowUp[2]); if (pEBI->headerspecial.hAlphaBmpArrowDn[0]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowDn[0]); if (pEBI->headerspecial.hAlphaBmpArrowDn[1]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowDn[1]); if (pEBI->headerspecial.hAlphaBmpArrowDn[2]) DeleteObject(pEBI->headerspecial.hAlphaBmpArrowDn[2]); FreeTokens(pTokens); UnlockResource(hShellInfoMem); FreeResource(hShellInfoMem); FreeLibrary(hinstDll); goto NoShellStyle; } FreeTokens(pTokens); UnlockResource(hShellInfoMem); FreeResource(hShellInfoMem); FreeLibrary(hinstDll); } return TRUE; } /* xxx.msstyles wegcutten => Resources\themes\Luna\ "shell" anfügen => Resources\themes\Luna\shell\ ColorName anfügen => Resources\themes\Luna\shell\NormalColor => dort liegt shellstyle.dll DllName = %SystemRoot%\\Resources\\themes\\Luna\Luna.msstyles ColorName = NormalColor %SystemRoot%\resources\Themes\Panther\Panther.msstyles pantherg */ #define CHARAVAIL (uSize!=0) #define IGNWS { while ((CHARAVAIL) && ((*pbyBuffer)<=0x20)){pbyBuffer++;uSize--;} } #define GETCHAR ((!uSize) ? 0x00 : (*pbyBuffer)) #define EATCHAR { if (uSize) { pbyBuffer++;uSize--; } } #define CHARLA1 ((uSize<2) ? 0x00 : pbyBuffer[1]) #define HEXDIGIT(_c) ( ( ((_c)>='0') && ((_c)<='9') ) || ( ((_c)>='A') && ((_c)<='F') ) || ( ((_c)>='a') && ((_c)<='f') ) ) #define DIGIT(_c) (((_c)>='0') && ((_c)<='9')) static VOID APIPRIVATE FreeTokens ( PTOKEN pTokens ) { PTOKEN pTemp; while (pTokens) { pTemp=pTokens; pTokens=pTokens->pNext; free(pTemp); } } static PTOKEN APIPRIVATE ParsePropertyFile ( PBYTE pbyBuffer, UINT uSize ) { PTOKEN pRoot = NULL; PTOKEN pAct = NULL; PTOKEN pToken = NULL; BYTE byChar,byCharLA1; BYTE byString[256]; UINT uStrLen,uToken; ULONG uHexVal; TokenLoop: if (!CHARAVAIL) return pRoot; IGNWS; byChar = GETCHAR; switch(byChar) { case '<': uToken = TOK_LT; DoToken: EATCHAR; pToken = (PTOKEN)malloc(sizeof(TOKEN)); if (!pToken) goto ExitError; memset(pToken,0,sizeof(TOKEN)); pToken->uToken = uToken; goto LinkToken; case '>': uToken = TOK_GT; goto DoToken; case '=': uToken = TOK_EQ; goto DoToken; case '(': uToken = TOK_LP; goto DoToken; case ')': uToken = TOK_RP; goto DoToken; case '[': uToken = TOK_LB; goto DoToken; case ']': uToken = TOK_RB; goto DoToken; case '{': uToken = TOK_LC; goto DoToken; case '}': uToken = TOK_RC; goto DoToken; case ':': uToken = TOK_COLON; goto DoToken; case ';': uToken = TOK_SEMICOLON; goto DoToken; case ',': uToken = TOK_COMMA; goto DoToken; case '|': uToken = TOK_OR; goto DoToken; case '/': uToken = TOK_SLASH; goto DoToken; case '#': byCharLA1 = CHARLA1; if (!(HEXDIGIT(byCharLA1))) goto UnknownToken; EATCHAR; uHexVal = 0L; byChar = GETCHAR; while (HEXDIGIT(byChar)) { byChar &= ~(0x20); byChar -= 0x10; if (byChar>0x09) byChar-=0x27; uHexVal = (uHexVal<<4)|((ULONG)byChar); EATCHAR; byChar = GETCHAR; } pToken = (PTOKEN)malloc(sizeof(TOKEN)+sizeof(ULONG)); if (!pToken) goto ExitError; memset(pToken,0,sizeof(TOKEN)+sizeof(ULONG)); pToken->uToken = TOK_HTMLCOLOR; pToken->uDataSize = sizeof(ULONG); memcpy(pToken->byData,&uHexVal,sizeof(ULONG)); goto LinkToken; case '-': uToken = TOK_MINUS; goto DoToken; case '+': uToken = TOK_PLUS; goto DoToken; case '0': if ((CHARLA1=='x') || (CHARLA1=='X')) // hex { EATCHAR; EATCHAR; uHexVal = 0; while ( (uSize) && HEXDIGIT(*pbyBuffer) ) { byChar = *(pbyBuffer++); uSize--; uHexVal <<= 4; byChar &= ~(0x20); byChar -= 0x10; if (byChar>0x09) byChar-=0x27; uHexVal |= (ULONG)byChar; } goto PutValue; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': uHexVal = 0; while ( (uSize) && DIGIT(*pbyBuffer) ) { byChar = *(pbyBuffer++); uSize--; uHexVal *= 10; uHexVal += (ULONG)(byChar-0x30); } PutValue: if ((pAct) && (pAct->uToken==TOK_MINUS)) { pToken = pAct; pAct = pAct->pPrev; if (!pAct) pRoot = NULL; free(pToken); uHexVal = (ULONG)(-((LONG)uHexVal)); } else if ((pAct) && (pAct->uToken==TOK_PLUS)) { pToken = pAct; pAct = pAct->pPrev; if (!pAct) pRoot = NULL; free(pToken); } pToken = (PTOKEN)malloc(sizeof(TOKEN)+sizeof(ULONG)); if (!pToken) goto ExitError; memset(pToken,0,sizeof(TOKEN)+sizeof(ULONG)); pToken->uToken = TOK_INTEGER; pToken->uDataSize = sizeof(ULONG); memcpy(pToken->byData,&uHexVal,sizeof(ULONG)); goto LinkToken; default : if ( ((byChar>='A') && (byChar<='Z')) || ((byChar>='a') && (byChar<='z')) || (byChar=='_') ) { uStrLen = 1; byString[0] = byChar; EATCHAR; StringLoop: byChar = GETCHAR; if ( ((byChar>='A') && (byChar<='Z')) || ((byChar>='a') && (byChar<='z')) || ((byChar>='0') && (byChar<='9')) || (byChar=='_') ) { byString[uStrLen++] = byChar; EATCHAR; goto StringLoop; } pToken = (PTOKEN)malloc(sizeof(TOKEN)+uStrLen); if (!pToken) { ExitError: while (pRoot) { pToken=pRoot; pRoot=pRoot->pNext; free(pToken); } return NULL; } memset(pToken,0,sizeof(TOKEN)+uStrLen); pToken->uToken = TOK_STRING; pToken->uDataSize = uStrLen; memcpy(pToken->byData,byString,uStrLen); LinkToken: if (!pRoot) pRoot = pToken; else { pToken->pPrev = pAct; pAct->pNext = pToken; } pAct = pToken; } else { UnknownToken: pToken = (PTOKEN)malloc(sizeof(TOKEN)); if (!pToken) goto ExitError; memset(pToken,0,sizeof(TOKEN)); pToken->uToken = TOK_UNKNOWN; pToken->uDataSize = 1; pToken->byData[0] = byChar; EATCHAR; goto LinkToken; } break; } goto TokenLoop; } static PTOKEN APIPRIVATE GetPropertyTokens ( PTOKEN pTokens, char *pcszResId, // e.g. "taskpane" char *pcszElement, // e.g. "scrollbar" int iElemSpecifiers, // no. of specifiers PELEMSPEC pSpecs, // NULL or ptr to specs char *pcszProperty ) { int i; while (!( (pTokens) && (pTokens->uToken==TOK_LT) && (pTokens->pNext) && (pTokens->pNext->uToken==TOK_STRING) && (!stricmp(pTokens->pNext->byData,"style")) && (pTokens->pNext->pNext) && (pTokens->pNext->pNext->uToken==TOK_STRING) && (!stricmp(pTokens->pNext->pNext->byData,"resid")) && (pTokens->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->uToken==TOK_EQ) && (pTokens->pNext->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->pNext->uToken==TOK_STRING) && (!stricmp(pTokens->pNext->pNext->pNext->pNext->byData,pcszResId)) && (pTokens->pNext->pNext->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->pNext->pNext->uToken==TOK_GT) )) { pTokens=pTokens->pNext; } if (!pTokens) return NULL; pTokens = pTokens->pNext->pNext->pNext->pNext->pNext->pNext; NextElement: if (!pTokens) return NULL; while (! ( (pTokens) && (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,pcszElement)) ) ) { if ( (pTokens) && (pTokens->uToken==TOK_LT) && (pTokens->pNext) && (pTokens->pNext->uToken==TOK_SLASH) && (pTokens->pNext->pNext) && (pTokens->pNext->pNext->uToken==TOK_STRING) && (!stricmp(pTokens->pNext->pNext->byData,"style")) && (pTokens->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->uToken==TOK_GT) ) { return NULL; } pTokens=pTokens->pNext; } if (!pTokens) return NULL; pTokens = pTokens->pNext; if (!pTokens) return NULL; for (i=0;i uToken==TOK_LB))) { if (pTokens) pTokens = pTokens->pNext; goto NextElement; } pTokens = pTokens->pNext; if (pSpecs[i].uType==ELEMSPEC_STRING) { if (!((pTokens) && (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,pSpecs[i].szString)))) { if (pTokens) pTokens = pTokens->pNext; goto NextElement; } pTokens=pTokens->pNext; if (!((pTokens) && (pTokens->uToken==TOK_RB))) { if (pTokens) pTokens = pTokens->pNext; goto NextElement; } pTokens = pTokens->pNext; } else if (pSpecs[i].uType==ELEMSPEC_ATOM) { if (!( (pTokens) && (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"id")) && (pTokens->pNext) && (pTokens->pNext->uToken==TOK_EQ) && (pTokens->pNext->pNext) && (pTokens->pNext->pNext->uToken==TOK_STRING) && (!stricmp(pTokens->pNext->pNext->byData,"atom")) && (pTokens->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->uToken==TOK_LP) && (pTokens->pNext->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->pNext->uToken==TOK_STRING) && (!stricmp(pTokens->pNext->pNext->pNext->pNext->byData,pSpecs[i].szString)) && (pTokens->pNext->pNext->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->pNext->pNext->uToken==TOK_RP) )) { if (pTokens) pTokens = pTokens->pNext; goto NextElement; } pTokens=pTokens->pNext->pNext->pNext->pNext->pNext->pNext; if (!((pTokens) && (pTokens->uToken==TOK_RB))) { if (pTokens) pTokens = pTokens->pNext; goto NextElement; } pTokens = pTokens->pNext; } else return NULL; } if (!pTokens) return NULL; if (pTokens->uToken != TOK_LC) { pTokens = pTokens->pNext; goto NextElement; } pTokens = pTokens->pNext; if (!pTokens) return NULL; // Lookup property ('}' is end of element char) while (!( (pTokens) && (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,pcszProperty)) && (pTokens->pNext) && (pTokens->pNext->uToken==TOK_COLON) )) { if ((pTokens) && (pTokens->uToken==TOK_RC)) return NULL; if (pTokens) pTokens=pTokens->pNext; } if (!pTokens) return NULL; pTokens = pTokens->pNext; if (!pTokens) return NULL; pTokens = pTokens->pNext; return pTokens; } static BOOL APIPRIVATE AnalyseToken ( PTOKEN pTokens, PTOKDATA pTD, HMODULE hinstDLL ) { int iCmp,iLeft,iRight,iMiddle; char szStringA[MAX_PATH]; DWORD dwColor; PTOKEN pNewTokens; memset(pTD,0,sizeof(TOKDATA)); if (!pTokens) return FALSE; if (pTokens->uToken==TOK_INTEGER) { pTD->uType = TD_INTEGER; pTD->iValue = *((int*)pTokens->byData); pTokens = pTokens->pNext; if ((pTokens) && (pTokens->uToken==TOK_STRING)) { if (!stricmp(pTokens->byData,"rp")) pTD->uType = TD_INTEGER_RP; else if (!stricmp(pTokens->byData,"pt")) pTD->uType = TD_INTEGER_PT; } return TRUE; } if (pTokens->uToken==TOK_HTMLCOLOR) { pTD->uType = TD_RGB; pTD->crRGB = XCHGCOLORREF(*((PDWORD)pTokens->byData)); return TRUE; } // Check colors if (pTokens->uToken==TOK_STRING) { iLeft = 0; iRight = NUM_DEFCOLORS-1; while (iLeft<=iRight) { iMiddle = (iLeft+iRight)>>1; if (!(iCmp=stricmp(pTokens->byData,sColors[iMiddle].szColor))) { pTD->uType = TD_RGB; pTD->crRGB = XCHGCOLORREF((DWORD)sColors[iMiddle].uColor); return TRUE; } if (iCmp<0) iRight = iMiddle-1; else iLeft = iMiddle+1; } } // Check alignments if (pTokens->uToken==TOK_STRING) { iLeft = 0; iRight = NUM_DEFALIGNS-1; while (iLeft<=iRight) { iMiddle = (iLeft+iRight)>>1; if (!(iCmp=stricmp(pTokens->byData,sAlignments[iMiddle].szAlign))) { pTD->uType = TD_ALIGNMENT; pTD->uAlign = (DWORD)sAlignments[iMiddle].uAlign; return TRUE; } if (iCmp<0) iRight = iMiddle-1; else iLeft = iMiddle+1; } } // Check cursors if (pTokens->uToken==TOK_STRING) { iLeft = 0; iRight = NUM_DEFCURSORS-1; while (iLeft<=iRight) { iMiddle = (iLeft+iRight)>>1; if (!(iCmp=stricmp(pTokens->byData,sCursors[iMiddle].szCursor))) { pTD->uType = TD_CURSOR; pTD->lpCursorName = sCursors[iMiddle].lpCursorName; return TRUE; } if (iCmp<0) iRight = iMiddle-1; else iLeft = iMiddle+1; } } // Check fontstyles if (pTokens->uToken==TOK_STRING) { if (!stricmp(pTokens->byData,"underline")) { pTD->uType = TD_FONTSTYLE; pTD->uFontStyle = TDFS_UNDERLINE; NextFS: pTokens = pTokens->pNext; if ( (pTokens) && (pTokens->uToken==TOK_COMMA) && (pTokens->pNext) && (pTokens->pNext->uToken==TOK_STRING) ) { pTokens = pTokens->pNext; if (!stricmp(pTokens->byData,"underline")) { pTD->uFontStyle |= TDFS_UNDERLINE; goto NextFS; } else if (!stricmp(pTokens->byData,"bold")) { pTD->uFontStyle |= TDFS_BOLD; goto NextFS; } else if (!stricmp(pTokens->byData,"normal")) { pTD->uFontStyle = TDFS_NORMAL; goto NextFS; } else if ((!stricmp(pTokens->byData,"italic")) || (!stricmp(pTokens->byData,"oblique"))) { pTD->uFontStyle |= TDFS_ITALIC; goto NextFS; } } return TRUE; } if (!stricmp(pTokens->byData,"bold")) { pTD->uType = TD_FONTSTYLE; pTD->uFontStyle = TDFS_BOLD; goto NextFS; } if (!stricmp(pTokens->byData,"normal")) { pTD->uType = TD_FONTSTYLE; pTD->uFontStyle = TDFS_NORMAL; goto NextFS; } if ((!stricmp(pTokens->byData,"italic")) || (!stricmp(pTokens->byData,"oblique"))) { pTD->uType = TD_FONTSTYLE; pTD->uFontStyle = TDFS_ITALIC; goto NextFS; } } if ((pTokens->uToken==TOK_STRING) && (pTokens->pNext) && (pTokens->pNext->uToken==TOK_LP) && (pTokens->pNext->pNext) && (pTokens->pNext->pNext->uToken==TOK_INTEGER) && (pTokens->pNext->pNext->pNext) && (pTokens->pNext->pNext->pNext->uToken==TOK_RP) ) { if (!stricmp(pTokens->byData,"sysmetric")) { pTD->uType = TD_SYSMETRIC; pTD->iValue = *((int*)pTokens->pNext->pNext->byData); return TRUE; } else if (!stricmp(pTokens->byData,"sysmetricstr")) { pTD->uType = TD_SYSMETRICSTR; pTD->iValue = *((int*)pTokens->pNext->pNext->byData); return TRUE; } else if (!stricmp(pTokens->byData,"rcstr")) { pTD->uType = TD_STRING; LoadString(hinstDLL,*((int*)pTokens->pNext->pNext->byData),pTD->szString,MAX_PATH); return TRUE; } else if (!stricmp(pTokens->byData,"rcint")) { pTD->uType = TD_INTEGER; szStringA[0] = 0x00; LoadStringA(hinstDLL,*((int*)pTokens->pNext->pNext->byData),szStringA,MAX_PATH); pTD->iValue = atoi(szStringA); pTokens = pTokens->pNext->pNext->pNext->pNext; if ((pTokens) && (pTokens->uToken==TOK_STRING)) { if (!stricmp(pTokens->byData,"pt")) pTD->uType = TD_INTEGER_PT; else if (!stricmp(pTokens->byData,"rp")) pTD->uType = TD_INTEGER_RP; } return TRUE; } } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"rect")) ) { pTD->uType = TD_RECT; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) return TRUE; pTokens = pTokens->pNext; // get left if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->rect.uIntTypes[0] = TD_INTEGER; pTD->rect.rcRect.left = *((int*)pTokens->byData); pTokens = pTokens->pNext; if ((pTokens) && (pTokens->uToken==TOK_STRING)) { if (!stricmp(pTokens->byData,"rp")) { pTD->rect.uIntTypes[0] = TD_INTEGER_RP; pTokens = pTokens->pNext; } else if (!stricmp(pTokens->byData,"pt")) { pTD->rect.uIntTypes[0] = TD_INTEGER_PT; pTokens = pTokens->pNext; } else return TRUE; } if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get top if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->rect.uIntTypes[1] = TD_INTEGER; pTD->rect.rcRect.top = *((int*)pTokens->byData); pTokens = pTokens->pNext; if ((pTokens) && (pTokens->uToken==TOK_STRING)) { if (!stricmp(pTokens->byData,"rp")) { pTD->rect.uIntTypes[1] = TD_INTEGER_RP; pTokens = pTokens->pNext; } else if (!stricmp(pTokens->byData,"pt")) { pTD->rect.uIntTypes[1] = TD_INTEGER_PT; pTokens = pTokens->pNext; } else return TRUE; } if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get right if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->rect.uIntTypes[2] = TD_INTEGER; pTD->rect.rcRect.right = *((int*)pTokens->byData); pTokens = pTokens->pNext; if ((pTokens) && (pTokens->uToken==TOK_STRING)) { if (!stricmp(pTokens->byData,"rp")) { pTD->rect.uIntTypes[2] = TD_INTEGER_RP; pTokens = pTokens->pNext; } else if (!stricmp(pTokens->byData,"pt")) { pTD->rect.uIntTypes[2] = TD_INTEGER_PT; pTokens = pTokens->pNext; } else return TRUE; } if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get bottom if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->rect.uIntTypes[3] = TD_INTEGER; pTD->rect.rcRect.bottom = *((int*)pTokens->byData); pTokens = pTokens->pNext; if ((pTokens) && (pTokens->uToken==TOK_STRING)) { if (!stricmp(pTokens->byData,"rp")) { pTD->rect.uIntTypes[3] = TD_INTEGER_RP; pTokens = pTokens->pNext; } else if (!stricmp(pTokens->byData,"pt")) { pTD->rect.uIntTypes[3] = TD_INTEGER_PT; pTokens = pTokens->pNext; } else return TRUE; } return TRUE; } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"rgb")) ) { pTD->uType = TD_RGB; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) return TRUE; pTokens = pTokens->pNext; // get red if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crRGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<16; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get green if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crRGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<8; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get blue if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crRGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL); pTD->crRGB = XCHGCOLORREF(pTD->crRGB); return TRUE; } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"argb")) ) { pTD->uType = TD_ARGB; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) return TRUE; pTokens = pTokens->pNext; // get alpha if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crARGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<24; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get red if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crARGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<16; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get green if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crARGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<8; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; // get blue if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->crARGB |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL); pTD->crARGB = XCHGCOLORREF(pTD->crARGB); return TRUE; } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"rcbmp")) ) { pTD->uType = TD_BITMAP; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) { ErrorExit: memset(pTD,0,sizeof(TOKDATA)); pTD->uType = TD_ERROR; return FALSE; } pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) goto ErrorExit; pTD->bitmap.hBitmap = LoadImage(hinstDLL, MAKEINTRESOURCE((*((int*)pTokens->byData))), IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION); if (!pTD->bitmap.hBitmap) goto ErrorExit; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) { ErrorExit2: DeleteObject(pTD->bitmap.hBitmap); goto ErrorExit; } pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) goto ErrorExit2; pTD->bitmap.biCompression = (*((int*)pTokens->byData))-1; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) goto ErrorExit2; pTokens = pTokens->pNext; pNewTokens = GetColor(pTokens,&dwColor,&pTD->bitmap.bColorIdx); if (!pNewTokens) goto ErrorExit2; pTD->bitmap.crTransRGB = dwColor; pTokens = pNewTokens; // ignore ",left,top,right,bottom)" return TRUE; } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"gradient")) ) { pTD->uType = TD_GRADIENT; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) return TRUE; pTokens = pTokens->pNext; pNewTokens = GetColor(pTokens,&dwColor,NULL); if (!pNewTokens) return TRUE; pTD->gradient.crARGB1 = dwColor; pTokens = pNewTokens; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; pNewTokens = GetColor(pTokens,&dwColor,NULL); if (!pNewTokens) return TRUE; pTD->gradient.crARGB2 = dwColor; pTokens = pNewTokens; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return TRUE; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return TRUE; pTD->gradient.iValue = *((int*)pTokens->byData); if (pTD->gradient.iValue<0) pTD->gradient.iValue = 0; return TRUE; } memset(pTD,0,sizeof(TOKDATA)); pTD->uType = TD_UNKNOWN; return FALSE; } static PTOKEN APIPRIVATE GetColor ( PTOKEN pTokens, DWORD *pdwColor, BOOL *pbIndex ) { if (pbIndex) *pbIndex = FALSE; if (!pTokens) return NULL; if (pTokens->uToken==TOK_INTEGER) { *pdwColor = (DWORD) (*((int*)pTokens->byData)); if (pbIndex) *pbIndex = TRUE; return pTokens->pNext; } if (pTokens->uToken==TOK_HTMLCOLOR) { *pdwColor = XCHGCOLORREF((*((PDWORD)pTokens->byData))); return pTokens->pNext; } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"rgb")) ) { *pdwColor = 0L; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) return NULL; pTokens = pTokens->pNext; // get red if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<16; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return NULL; pTokens = pTokens->pNext; // get green if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<8; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return NULL; pTokens = pTokens->pNext; // get blue if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<0; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_RP)) ) return NULL; *pdwColor = XCHGCOLORREF((*pdwColor)); return pTokens->pNext; } if ( (pTokens->uToken==TOK_STRING) && (!stricmp(pTokens->byData,"argb")) ) { *pdwColor = 0L; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_LP)) ) return NULL; pTokens = pTokens->pNext; // get alpha if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<24; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return NULL; pTokens = pTokens->pNext; // get red if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<16; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return NULL; pTokens = pTokens->pNext; // get green if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<8; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_COMMA)) ) return NULL; pTokens = pTokens->pNext; // get blue if (! ((pTokens) && (pTokens->uToken==TOK_INTEGER)) ) return NULL; (*pdwColor) |= (((DWORD)(*((int*)pTokens->byData)))&0xFFL)<<0; pTokens = pTokens->pNext; if (! ((pTokens) && (pTokens->uToken==TOK_RP)) ) return NULL; *pdwColor = XCHGCOLORREF((*pdwColor)); return pTokens->pNext; } return NULL; } static BOOL APIPRIVATE GetStyleDllValues ( PTOKEN pTokens, PEXPBARINFO pEBI, HMODULE hinstDll ) { ELEMSPEC es[3]; PTOKEN pCurrToken; TOKDATA TD; // 1.) task link information (normal) //////////////////////////////////////////////////////////////// pCurrToken = GetPropertyTokens(pTokens, "sectiontaskss", "button",0,NULL, "foreground"); if (!pCurrToken) return FALSE; if (!AnalyseToken(pCurrToken,&TD,hinstDll)) return FALSE; if ((TD.uType!=TD_RGB) && (TD.uType!=TD_ARGB)) return FALSE; pEBI->tasknormal.crLinkNormal = TD.crRGB; pCurrToken = GetPropertyTokens(pTokens, "sectiontaskss", "actiontask",0,NULL, "margin"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->tasknormal.rcMarginsActionTask,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "sectiontaskss", "destinationtask",0,NULL, "margin"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->tasknormal.rcMarginsDestinationTask,&TD.rect.rcRect,sizeof(RECT)); es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"title"); pCurrToken = GetPropertyTokens(pTokens, "sectiontaskss", "element",1,es, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->tasknormal.rcTitlePadding,&TD.rect.rcRect,sizeof(RECT)); // may fail, if not: overrides color !!! pCurrToken = GetPropertyTokens(pTokens, "sectiontaskss", "element",1,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->tasknormal.crLinkNormal = TD.crRGB; es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "sectiontaskss", "element",2,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->tasknormal.crLinkHot = TD.crRGB; else return FALSE; // 2.) task link information (special) /////////////////////////////////////////////////////////////// pCurrToken = GetPropertyTokens(pTokens, "mainsectiontaskss", "button",0,NULL, "foreground"); if (!pCurrToken) return FALSE; if (!AnalyseToken(pCurrToken,&TD,hinstDll)) return FALSE; if ((TD.uType!=TD_RGB) && (TD.uType!=TD_ARGB)) return FALSE; pEBI->taskspecial.crLinkNormal = TD.crRGB; pCurrToken = GetPropertyTokens(pTokens, "mainsectiontaskss", "actiontask",0,NULL, "margin"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->taskspecial.rcMarginsActionTask,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "mainsectiontaskss", "destinationtask",0,NULL, "margin"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->taskspecial.rcMarginsDestinationTask,&TD.rect.rcRect,sizeof(RECT)); es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"title"); pCurrToken = GetPropertyTokens(pTokens, "mainsectiontaskss", "element",1,es, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->taskspecial.rcTitlePadding,&TD.rect.rcRect,sizeof(RECT)); // may fail, if not: overrides color !!! pCurrToken = GetPropertyTokens(pTokens, "mainsectiontaskss", "element",1,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->taskspecial.crLinkNormal = TD.crRGB; es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "mainsectiontaskss", "element",2,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->taskspecial.crLinkHot = TD.crRGB; else return FALSE; // 3.) explorer bar information ////////////////////////////////////////////////////////////////////// es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"sectionlist"); pCurrToken = GetPropertyTokens(pTokens, "taskpane", "element",1,es, "background"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) ) { if ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) { pEBI->taskpane.crBackground1 = TD.crRGB; pEBI->taskpane.iValue = 0; } else if (TD.uType==TD_GRADIENT) { pEBI->taskpane.crBackground1 = TD.gradient.crARGB1; pEBI->taskpane.crBackground2 = TD.gradient.crARGB2; pEBI->taskpane.iValue = TD.gradient.iValue; } else return FALSE; } else return FALSE; pCurrToken = GetPropertyTokens(pTokens, "taskpane", "element",1,es, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->taskpane.rcPadding,&TD.rect.rcRect,sizeof(RECT)); else { pEBI->taskpane.rcPadding.left = 12; pEBI->taskpane.rcPadding.top = 12; pEBI->taskpane.rcPadding.right = 12; pEBI->taskpane.rcPadding.bottom = 12; } pCurrToken = GetPropertyTokens(pTokens, "taskpane", "element",1,es, "borderthickness"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->taskpane.rcBorderThickness,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "taskpane", "element",1,es, "bordercolor"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->taskpane.crBorder = TD.crRGB; // 4.) normal header information ///////////////////////////////////////////////////////////////////// pCurrToken = GetPropertyTokens(pTokens, "sectionss", "expando",0,NULL, "fontface"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_STRING) ) #ifdef UNICODE WideCharToMultiByte(CP_ACP,0,TD.szString,-1,pEBI->headernormal.szFontFace,MAX_PATH,NULL,NULL); #else strcpy(pEBI->headernormal.szFontFace,TD.szString); #endif else { HDC hDC = GetDC(NULL); if ((EnumFontFamilies(hDC,TEXT("Tahoma"),(FONTENUMPROC)EnumFontFamProc,0) == 0)) strcpy(pEBI->headernormal.szFontFace,"Tahoma"); else strcpy(pEBI->headernormal.szFontFace,"Arial"); ReleaseDC(NULL,hDC); } pCurrToken = GetPropertyTokens(pTokens, "sectionss", "expando",0,NULL, "fontsize"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) ) { if ((TD.uType==TD_INTEGER) || (TD.uType==TD_INTEGER_RP)) pEBI->headernormal.iFontSize = TD.iValue; else if (TD.uType==TD_INTEGER_PT) pEBI->headernormal.iFontSize = Pt2FontHeight(TD.iValue); else pEBI->headernormal.iFontSize = Pt2FontHeight(8); } else pEBI->headernormal.iFontSize = Pt2FontHeight(8); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "expando",0,NULL, "margin"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) { pEBI->headernormal.iMargin = TD.rect.rcRect.left; if (TD.rect.rcRect.top>pEBI->headernormal.iMargin) pEBI->headernormal.iMargin = TD.rect.rcRect.top; if (TD.rect.rcRect.right>pEBI->headernormal.iMargin) pEBI->headernormal.iMargin = TD.rect.rcRect.right; if (TD.rect.rcRect.bottom>pEBI->headernormal.iMargin) pEBI->headernormal.iMargin = TD.rect.rcRect.bottom; } else pEBI->headernormal.iMargin = 15; pCurrToken = GetPropertyTokens(pTokens, "sectionss", "button",0,NULL, "bordercolor"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headernormal.crBorderColorHeader = TD.crRGB; pCurrToken = GetPropertyTokens(pTokens, "sectionss", "button",0,NULL, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headernormal.crHeaderNormal = TD.crRGB; else return FALSE; pCurrToken = GetPropertyTokens(pTokens, "sectionss", "button",0,NULL, "fontweight"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_INTEGER) ) pEBI->headernormal.iFontWeightHeader = TD.iValue; else pEBI->headernormal.iFontWeightHeader = FW_BOLD; pCurrToken = GetPropertyTokens(pTokens, "sectionss", "button",0,NULL, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headernormal.rcPaddingHeader,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "button",0,NULL, "borderthickness"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headernormal.rcBorderThicknessHeader,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "button",0,NULL, "background"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headernormal.hAlphaBmpListHeader = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, &pEBI->headernormal.iHeaderBmpWidth, &pEBI->headernormal.iHeaderBmpHeight); es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"title"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "element",1,es, "contentalign"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_ALIGNMENT) ) pEBI->headernormal.uAlignment = TD.uAlign; es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "element",2,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headernormal.crHeaderHot = TD.crRGB; else pEBI->headernormal.crHeaderHot = pEBI->headernormal.crHeaderNormal; es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"arrow"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "element",1,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headernormal.hAlphaBmpArrowDn[0] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, &pEBI->headernormal.iBmpArrowWidth, &pEBI->headernormal.iBmpArrowHeight); es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"selected"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "element",2,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headernormal.hAlphaBmpArrowUp[0] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, NULL, NULL); es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "element",2,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headernormal.hAlphaBmpArrowDn[1] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, NULL, NULL); es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"selected"); es[2].uType = ELEMSPEC_STRING; strcpy(es[2].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "element",3,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headernormal.hAlphaBmpArrowUp[1] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, NULL, NULL); es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"tasklist"); pCurrToken = GetPropertyTokens(pTokens, "sectionss", "tasklist",1,es, "background"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headernormal.crTLbackground = TD.crRGB; else return FALSE; pCurrToken = GetPropertyTokens(pTokens, "sectionss", "tasklist",1,es, "borderthickness"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headernormal.rcTLBorderThickness,&TD.rect.rcRect,sizeof(RECT)); else { pEBI->headernormal.rcTLBorderThickness.left = 1; pEBI->headernormal.rcTLBorderThickness.right = 1; pEBI->headernormal.rcTLBorderThickness.top = 0; pEBI->headernormal.rcTLBorderThickness.bottom = 1; } pCurrToken = GetPropertyTokens(pTokens, "sectionss", "tasklist",1,es, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headernormal.rcTLPadding,&TD.rect.rcRect,sizeof(RECT)); else { pEBI->headernormal.rcTLPadding.left = pEBI->headernormal.rcTLPadding.right = 12; pEBI->headernormal.rcTLPadding.top = pEBI->headernormal.rcTLPadding.bottom = 10; } pCurrToken = GetPropertyTokens(pTokens, "sectionss", "tasklist",1,es, "bordercolor"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headernormal.crTLBorder = TD.crRGB; else pEBI->headernormal.crTLBorder = RGB(0xFF,0xFF,0xFF); // 5.) special header information //////////////////////////////////////////////////////////////////// pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "expando",0,NULL, "fontface"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_STRING) ) #ifdef UNICODE WideCharToMultiByte(CP_ACP,0,TD.szString,-1,pEBI->headerspecial.szFontFace,MAX_PATH,NULL,NULL); #else strcpy(pEBI->headerspecial.szFontFace,TD.szString); #endif else { HDC hDC = GetDC(NULL); if ((EnumFontFamilies(hDC,TEXT("Tahoma"),(FONTENUMPROC)EnumFontFamProc,0) == 0)) strcpy(pEBI->headerspecial.szFontFace,"Tahoma"); else strcpy(pEBI->headerspecial.szFontFace,"Arial"); ReleaseDC(NULL,hDC); } pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "expando",0,NULL, "fontsize"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) ) { if ((TD.uType==TD_INTEGER) || (TD.uType==TD_INTEGER_RP)) pEBI->headerspecial.iFontSize = TD.iValue; else if (TD.uType==TD_INTEGER_PT) pEBI->headerspecial.iFontSize = Pt2FontHeight(TD.iValue); else pEBI->headerspecial.iFontSize = Pt2FontHeight(8); } else pEBI->headerspecial.iFontSize = Pt2FontHeight(8); pEBI->headerspecial.iMargin = pEBI->headernormal.iMargin; pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "button",0,NULL, "bordercolor"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headerspecial.crBorderColorHeader = TD.crRGB; es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"header"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "button",1,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headerspecial.crHeaderNormal = TD.crRGB; else return FALSE; pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "button",1,es, "fontweight"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_INTEGER) ) pEBI->headerspecial.iFontWeightHeader = TD.iValue; else pEBI->headerspecial.iFontWeightHeader = FW_BOLD; pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "button",1,es, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headerspecial.rcPaddingHeader,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "button",1,es, "borderthickness"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headerspecial.rcBorderThicknessHeader,&TD.rect.rcRect,sizeof(RECT)); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "button",1,es, "background"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headerspecial.hAlphaBmpListHeader = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, &pEBI->headerspecial.iHeaderBmpWidth, &pEBI->headerspecial.iHeaderBmpHeight); es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"title"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",1,es, "contentalign"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_ALIGNMENT) ) pEBI->headerspecial.uAlignment = TD.uAlign; es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",2,es, "foreground"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headerspecial.crHeaderHot = TD.crRGB; else pEBI->headerspecial.crHeaderHot = pEBI->headerspecial.crHeaderNormal; es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"arrow"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",1,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headerspecial.hAlphaBmpArrowDn[0] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, &pEBI->headerspecial.iBmpArrowWidth, &pEBI->headerspecial.iBmpArrowHeight); es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"selected"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",2,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headerspecial.hAlphaBmpArrowUp[0] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, NULL, NULL); es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",2,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headerspecial.hAlphaBmpArrowDn[1] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, NULL, NULL); es[1].uType = ELEMSPEC_STRING; strcpy(es[1].szString,"selected"); es[2].uType = ELEMSPEC_STRING; strcpy(es[2].szString,"mousefocused"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",3,es, "content"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_BITMAP) ) pEBI->headerspecial.hAlphaBmpArrowUp[1] = Bitmap2AlphaBitmap(TD.bitmap.hBitmap, TD.bitmap.crTransRGB, TD.bitmap.bColorIdx, NULL, NULL); es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"watermark"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",1,es, "background"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headerspecial.crTLbackground = TD.crRGB; else return FALSE; pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "element",1,es, "contentalign"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_ALIGNMENT) ) pEBI->headerspecial.uTLAlign = TD.uAlign; es[0].uType = ELEMSPEC_ATOM; strcpy(es[0].szString,"tasklist"); pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "tasklist",1,es, "borderthickness"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headerspecial.rcTLBorderThickness,&TD.rect.rcRect,sizeof(RECT)); else { pEBI->headerspecial.rcTLBorderThickness.left = 1; pEBI->headerspecial.rcTLBorderThickness.right = 1; pEBI->headerspecial.rcTLBorderThickness.top = 0; pEBI->headerspecial.rcTLBorderThickness.bottom = 1; } pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "tasklist",1,es, "padding"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && (TD.uType==TD_RECT) ) memcpy(&pEBI->headerspecial.rcTLPadding,&TD.rect.rcRect,sizeof(RECT)); else { pEBI->headerspecial.rcTLPadding.left = pEBI->headerspecial.rcTLPadding.right = 12; pEBI->headerspecial.rcTLPadding.top = pEBI->headerspecial.rcTLPadding.bottom = 10; } pCurrToken = GetPropertyTokens(pTokens, "mainsectionss", "tasklist",1,es, "bordercolor"); if ( (pCurrToken) && (AnalyseToken(pCurrToken,&TD,hinstDll)) && ((TD.uType==TD_RGB) || (TD.uType==TD_ARGB)) ) pEBI->headerspecial.crTLBorder = TD.crRGB; else pEBI->headerspecial.crTLBorder = RGB(0xFF,0xFF,0xFF); return TRUE; } static HBITMAP APIPRIVATE Bitmap2AlphaBitmap ( HBITMAP hBitmap, DWORD dwTransColor, BOOL bColorIdx, int *piWidth, int *piHeight ) { DIBSECTION ds; HBITMAP hAlphaBitmap = NULL; PDWORD pdwImage; DWORD dwColor; BYTE byColor,byRed,byGreen,byBlue; int i,j; static DWORD dwColorLUT[256]; HDC hDC,hDCmem; HGDIOBJ hOldObj; BITMAPINFO bif; BITMAPINFOHEADER bih; LPVOID pvBits; if (!(sizeof(DIBSECTION)==GetObject(hBitmap,sizeof(DIBSECTION),(LPVOID)&ds))) { DeleteObject(hBitmap); return hAlphaBitmap; } if (piWidth) *piWidth = ds.dsBm.bmWidth; if (piHeight) *piHeight = ds.dsBm.bmHeight; if (bColorIdx) { hAlphaBitmap = hBitmap; if (ds.dsBmih.biBitCount==32) // calulate premultiplied alpha channels { for (i=0;i >24); byRed = (BYTE)(dwColor>>16); byGreen = (BYTE)(dwColor>>8); byBlue = (BYTE)(dwColor>>0); byRed = (BYTE) (((DWORD)byRed)*((DWORD)byColor)/255); byGreen = (BYTE) (((DWORD)byGreen)*((DWORD)byColor)/255); byBlue = (BYTE) (((DWORD)byBlue)*((DWORD)byColor)/255); dwColor = (((DWORD)byColor)<<24)| (((DWORD)byRed)<<16)| (((DWORD)byGreen)<<8)| (((DWORD)byBlue)<<0); *(((PDWORD)ds.dsBm.bmBits)+i*ds.dsBm.bmWidth+j) = dwColor; } } } } else { if ((ds.dsBmih.biBitCount==8) && (ds.dsBmih.biCompression==BI_RGB)) { pdwImage = (PDWORD)malloc((ds.dsBm.bmWidth<<2)*ds.dsBm.bmHeight); if (!pdwImage) { DeleteObject(hBitmap); return hAlphaBitmap; } memset(dwColorLUT,0,sizeof(dwColorLUT)); hDC = GetDC(NULL); hDCmem = CreateCompatibleDC(hDC); hOldObj = SelectObject(hDCmem,hBitmap); GetDIBColorTable(hDCmem,0,256,(RGBQUAD*)dwColorLUT); SelectObject(hDCmem,hOldObj); DeleteDC(hDCmem); if (bColorIdx) dwTransColor = dwColorLUT[dwTransColor&255]; else dwTransColor = XCHGCOLORREF(dwTransColor); dwTransColor &= 0x00FFFFFF; for (i=0;i