📄 xp_theme.c
字号:
/* 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 + -