⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xp_theme.c

📁 This GTK+ version 2.12.3. GTK+ is a multi-platform toolkit for creating graphical user interfaces.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* MS-Windows Engine (aka GTK-Wimp) * * Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#define _WIN32_WINNT 0x0501#include "xp_theme.h"#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <windows.h>#include <math.h>#include <string.h>#include <stdio.h>/* #include "gdk/gdkwin32.h" */#include "gdk/win32/gdkwin32.h"#include "xp_theme_defs.h"#ifndef TMT_CAPTIONFONT/* These aren't in mingw's "w32api" headers, nor in the Platform SDK * headers. */#define TMT_CAPTIONFONT 801#define TMT_MENUFONT 803#define TMT_STATUSFONT 804#define TMT_MSGBOXFONT 805#endif#define GP_LINEHORZ 2#define GP_LINEVERT 3#define TP_SEPARATOR           5#define TP_SEPARATORVERT       6/* GLOBALS LINEHORZ states */#define LHS_FLAT   1#define LHS_RAISED 2#define LHS_SUNKEN 3/* GLOBAL LINEVERT states */#define LVS_FLAT   1#define LVS_RAISED 2#define LVS_SUNKEN 3/* TRACKBAR parts */#define TKP_TRACK       1#define TKP_TRACKVERT   2#define TKP_THUMB       3#define TKP_THUMBBOTTOM 4#define TKP_THUMBTOP    5#define TKP_THUMBVERT   6#define TKP_THUMBLEFT   7#define TKP_THUMBRIGHT  8#define TKP_TICS        9#define TKP_TICSVERT    10#define TRS_NORMAL 1static const LPCWSTR class_descriptors[] = {    L"Scrollbar",		/* XP_THEME_CLASS_SCROLLBAR */    L"Button",			/* XP_THEME_CLASS_BUTTON */    L"Header",			/* XP_THEME_CLASS_HEADER */    L"ComboBox",		/* XP_THEME_CLASS_COMBOBOX */    L"Tab",			    /* XP_THEME_CLASS_TAB */    L"Edit",			/* XP_THEME_CLASS_EDIT */    L"TreeView",		/* XP_THEME_CLASS_TREEVIEW */    L"Spin",			/* XP_THEME_CLASS_SPIN */    L"Progress",		/* XP_THEME_CLASS_PROGRESS */    L"Tooltip",			/* XP_THEME_CLASS_TOOLTIP */    L"Rebar",			/* XP_THEME_CLASS_REBAR */    L"Toolbar",			/* XP_THEME_CLASS_TOOLBAR */    L"Globals",			/* XP_THEME_CLASS_GLOBALS */    L"Menu",			/* XP_THEME_CLASS_MENU */    L"Window",			/* XP_THEME_CLASS_WINDOW */    L"Status",			/* XP_THEME_CLASS_STATUS */    L"Trackbar"			/* XP_THEME_CLASS_TRACKBAR */};static const short element_part_map[XP_THEME_ELEMENT__SIZEOF] = {    BP_CHECKBOX,    BP_CHECKBOX,    BP_CHECKBOX,    BP_PUSHBUTTON,    HP_HEADERITEM,    CP_DROPDOWNBUTTON,    TABP_BODY,    TABP_TABITEM,    TABP_TABITEMLEFTEDGE,   	TABP_TABITEMRIGHTEDGE,    TABP_PANE,    SBP_THUMBBTNHORZ,    SBP_THUMBBTNVERT,    SBP_ARROWBTN,    SBP_ARROWBTN,    SBP_ARROWBTN,    SBP_ARROWBTN,    SBP_GRIPPERHORZ,    SBP_GRIPPERVERT,    SBP_LOWERTRACKHORZ,    SBP_LOWERTRACKVERT,    EP_EDITTEXT,    BP_PUSHBUTTON,    SPNP_UP,    SPNP_DOWN,    BP_RADIOBUTTON,    BP_RADIOBUTTON,    TVP_GLYPH,    TVP_GLYPH,    PP_CHUNK,    PP_CHUNKVERT,    PP_BAR,    PP_BARVERT,    TTP_STANDARD,    0 /* RP_BAND */ ,    RP_GRIPPER,    RP_GRIPPERVERT,    RP_CHEVRON,    TP_BUTTON,    MP_MENUITEM,    MP_SEPARATOR,    SP_GRIPPER,    SP_PANE,    GP_LINEHORZ,    GP_LINEVERT,    TP_SEPARATOR,    TP_SEPARATORVERT,    TKP_TRACK,    TKP_TRACKVERT,    TKP_THUMB,    TKP_THUMBVERT,    TKP_TICS,    TKP_TICSVERT};static HINSTANCE uxtheme_dll = NULL;static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];static gboolean use_xp_theme = FALSE;typedef HRESULT (FAR PASCAL * GetThemeSysFontFunc)    (HTHEME hTheme, int iFontID, OUT LOGFONT * plf);typedef int (FAR PASCAL * GetThemeSysSizeFunc) (HTHEME hTheme, int iSizeId);typedef COLORREF (FAR PASCAL * GetThemeSysColorFunc) (HTHEME hTheme,						      int iColorID);typedef HTHEME (FAR PASCAL * OpenThemeDataFunc) (HWND hwnd,						 LPCWSTR pszClassList);typedef HRESULT (FAR PASCAL * CloseThemeDataFunc) (HTHEME theme);typedef HRESULT (FAR PASCAL * DrawThemeBackgroundFunc)    (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,     const RECT * pRect, const RECT * pClipRect);typedef HRESULT (FAR PASCAL * EnableThemeDialogTextureFunc) (HWND hwnd,							     DWORD dwFlags);typedef BOOL (FAR PASCAL * IsThemeActiveFunc) (VOID);typedef BOOL (FAR PASCAL * IsAppThemedFunc) (VOID);typedef BOOL (FAR PASCAL *	      IsThemeBackgroundPartiallyTransparentFunc) (HTHEME hTheme,							  int iPartId,							  int iStateId);typedef HRESULT (FAR PASCAL * DrawThemeParentBackgroundFunc) (HWND hwnd,							      HDC hdc,							      RECT * prc);static GetThemeSysFontFunc get_theme_sys_font_func = NULL;static GetThemeSysColorFunc get_theme_sys_color_func = NULL;static GetThemeSysSizeFunc get_theme_sys_metric_func = NULL;static OpenThemeDataFunc open_theme_data_func = NULL;static CloseThemeDataFunc close_theme_data_func = NULL;static DrawThemeBackgroundFunc draw_theme_background_func = NULL;static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;static IsThemeActiveFunc is_theme_active_func = NULL;static IsAppThemedFunc is_app_themed_func = NULL;static IsThemeBackgroundPartiallyTransparentFunc    is_theme_partially_transparent_func = NULL;static DrawThemeParentBackgroundFunc draw_theme_parent_background_func = NULL;static voidxp_theme_close_open_handles (void){    int i;    for (i = 0; i < XP_THEME_CLASS__SIZEOF; i++)	{	    if (open_themes[i])		{		    close_theme_data_func (open_themes[i]);		    open_themes[i] = NULL;		}	}}voidxp_theme_init (void){    if (uxtheme_dll)	return;    memset (open_themes, 0, sizeof (open_themes));    uxtheme_dll = LoadLibrary ("uxtheme.dll");    if (!uxtheme_dll)	return;    is_app_themed_func =	(IsAppThemedFunc) GetProcAddress (uxtheme_dll, "IsAppThemed");    if (is_app_themed_func)	{	    is_theme_active_func =		(IsThemeActiveFunc) GetProcAddress (uxtheme_dll,						    "IsThemeActive");	    open_theme_data_func =		(OpenThemeDataFunc) GetProcAddress (uxtheme_dll,						    "OpenThemeData");	    close_theme_data_func =		(CloseThemeDataFunc) GetProcAddress (uxtheme_dll,						     "CloseThemeData");	    draw_theme_background_func =		(DrawThemeBackgroundFunc) GetProcAddress (uxtheme_dll,							  "DrawThemeBackground");	    enable_theme_dialog_texture_func =		(EnableThemeDialogTextureFunc) GetProcAddress (uxtheme_dll,							       "EnableThemeDialogTexture");	    get_theme_sys_font_func =		(GetThemeSysFontFunc) GetProcAddress (uxtheme_dll,						      "GetThemeSysFont");	    get_theme_sys_color_func =		(GetThemeSysColorFunc) GetProcAddress (uxtheme_dll,						       "GetThemeSysColor");	    get_theme_sys_metric_func =		(GetThemeSysSizeFunc) GetProcAddress (uxtheme_dll,						      "GetThemeSysSize");	    is_theme_partially_transparent_func =		(IsThemeBackgroundPartiallyTransparentFunc)		GetProcAddress (uxtheme_dll,				"IsThemeBackgroundPartiallyTransparent");	    draw_theme_parent_background_func =		(DrawThemeParentBackgroundFunc) GetProcAddress (uxtheme_dll,								"DrawThemeParentBackground");	}    if (is_app_themed_func && is_theme_active_func) {        use_xp_theme = (is_app_themed_func () && is_theme_active_func ());    }    else {        use_xp_theme = FALSE;    }}voidxp_theme_reset (void){    xp_theme_close_open_handles ();    if (is_app_themed_func && is_theme_active_func) {        use_xp_theme = (is_app_themed_func () && is_theme_active_func ());    }    else {        use_xp_theme = FALSE;    }}voidxp_theme_exit (void){    if (!uxtheme_dll)	return;    xp_theme_close_open_handles ();    FreeLibrary (uxtheme_dll);    uxtheme_dll = NULL;	use_xp_theme = FALSE;    is_app_themed_func = NULL;    is_theme_active_func = NULL;    open_theme_data_func = NULL;    close_theme_data_func = NULL;    draw_theme_background_func = NULL;    enable_theme_dialog_texture_func = NULL;    get_theme_sys_font_func = NULL;    get_theme_sys_color_func = NULL;    get_theme_sys_metric_func = NULL;    is_theme_partially_transparent_func = NULL;    draw_theme_parent_background_func = NULL;}static HTHEMExp_theme_get_handle_by_class (XpThemeClass klazz){    if (!open_themes[klazz] && open_theme_data_func)	{	    open_themes[klazz] =		open_theme_data_func (NULL, class_descriptors[klazz]);	}    return open_themes[klazz];}static HTHEMExp_theme_get_handle_by_element (XpThemeElement element){    HTHEME ret = NULL;    XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;    switch (element)	{	case XP_THEME_ELEMENT_TOOLTIP:	    klazz = XP_THEME_CLASS_TOOLTIP;	    break;	case XP_THEME_ELEMENT_REBAR:	case XP_THEME_ELEMENT_REBAR_GRIPPER_H:	case XP_THEME_ELEMENT_REBAR_GRIPPER_V:	case XP_THEME_ELEMENT_REBAR_CHEVRON:	    klazz = XP_THEME_CLASS_REBAR;	    break;	case XP_THEME_ELEMENT_SCALE_TROUGH_H:	case XP_THEME_ELEMENT_SCALE_TROUGH_V:	case XP_THEME_ELEMENT_SCALE_SLIDER_H:	case XP_THEME_ELEMENT_SCALE_SLIDER_V:	case XP_THEME_ELEMENT_SCALE_TICS_H:	case XP_THEME_ELEMENT_SCALE_TICS_V:	    klazz = XP_THEME_CLASS_TRACKBAR;	    break;	case XP_THEME_ELEMENT_STATUS_GRIPPER:	case XP_THEME_ELEMENT_STATUS_PANE:	    klazz = XP_THEME_CLASS_STATUS;	    break;	case XP_THEME_ELEMENT_TOOLBAR_BUTTON:	case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H:	case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V:	    klazz = XP_THEME_CLASS_TOOLBAR;	    break;	case XP_THEME_ELEMENT_MENU_ITEM:	case XP_THEME_ELEMENT_MENU_SEPARATOR:	    klazz = XP_THEME_CLASS_MENU;	    break;	case XP_THEME_ELEMENT_PRESSED_CHECKBOX:	case XP_THEME_ELEMENT_INCONSISTENT_CHECKBOX:	case XP_THEME_ELEMENT_CHECKBOX:	case XP_THEME_ELEMENT_BUTTON:	case XP_THEME_ELEMENT_DEFAULT_BUTTON:	case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:	case XP_THEME_ELEMENT_RADIO_BUTTON:	    klazz = XP_THEME_CLASS_BUTTON;	    break;	case XP_THEME_ELEMENT_LIST_HEADER:	    klazz = XP_THEME_CLASS_HEADER;	    break;	case XP_THEME_ELEMENT_COMBOBUTTON:	    klazz = XP_THEME_CLASS_COMBOBOX;	    break;	case XP_THEME_ELEMENT_BODY:	case XP_THEME_ELEMENT_TAB_ITEM:	case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:	case XP_THEME_ELEMENT_TAB_ITEM_RIGHT_EDGE:	case XP_THEME_ELEMENT_TAB_PANE:	    klazz = XP_THEME_CLASS_TAB;	    break;	case XP_THEME_ELEMENT_SCROLLBAR_V:	case XP_THEME_ELEMENT_SCROLLBAR_H:	case XP_THEME_ELEMENT_ARROW_UP:	case XP_THEME_ELEMENT_ARROW_DOWN:	case XP_THEME_ELEMENT_ARROW_LEFT:	case XP_THEME_ELEMENT_ARROW_RIGHT:	case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V:	case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H:	case XP_THEME_ELEMENT_TROUGH_V:	case XP_THEME_ELEMENT_TROUGH_H:	    klazz = XP_THEME_CLASS_SCROLLBAR;	    break;	case XP_THEME_ELEMENT_EDIT_TEXT:	    klazz = XP_THEME_CLASS_EDIT;	    break;	case XP_THEME_ELEMENT_SPIN_BUTTON_UP:	case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:	    klazz = XP_THEME_CLASS_SPIN;	    break;	case XP_THEME_ELEMENT_PROGRESS_BAR_H:	case XP_THEME_ELEMENT_PROGRESS_BAR_V:	case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:	case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:	    klazz = XP_THEME_CLASS_PROGRESS;	    break;	case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:	case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:	    klazz = XP_THEME_CLASS_TREEVIEW;	    break;	case XP_THEME_ELEMENT_LINE_H:	case XP_THEME_ELEMENT_LINE_V:	    klazz = XP_THEME_CLASS_GLOBALS;	    break;	default:	    break;	}    if (klazz != XP_THEME_CLASS__SIZEOF)	{	    ret = xp_theme_get_handle_by_class (klazz);	}    return ret;}static intxp_theme_map_gtk_state (XpThemeElement element, GtkStateType state){    int ret = 0;    switch (element)	{	case XP_THEME_ELEMENT_TOOLTIP:	    ret = TTSS_NORMAL;	    break;	case XP_THEME_ELEMENT_REBAR:	    ret = 0;	    break;	case XP_THEME_ELEMENT_REBAR_GRIPPER_H:	case XP_THEME_ELEMENT_REBAR_GRIPPER_V:	    ret = 0;	    break;	case XP_THEME_ELEMENT_STATUS_GRIPPER:	case XP_THEME_ELEMENT_STATUS_PANE:	    ret = 1;	    break;	case XP_THEME_ELEMENT_REBAR_CHEVRON:	    switch (state)		{		case GTK_STATE_PRELIGHT:		    ret = CHEVS_HOT;		    break;		case GTK_STATE_SELECTED:		case GTK_STATE_ACTIVE:		    ret = CHEVS_PRESSED;		    break;		default:		    ret = CHEVS_NORMAL;		}	    break;	case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_H:	case XP_THEME_ELEMENT_TOOLBAR_SEPARATOR_V:	    ret = TS_NORMAL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -