[Win32] Visual StyleのPart/Stateを視覚的に確認する
Windows XP以降、Visual Styleが導入され、ユーザーコード上でも、Visual Styles Referenceにあるような関数群を使うことによって、OSのコントロールと同様の外見のコントロールを描画できるようになっている。
しかしながら、DrawThemeBackground関数などに渡す、iPartId, iStateIdについては、Parts and Statesに一覧があるものの、いったい、具体的に何を示しているのかは非常にわかりにくい。
そこで、この一覧をグラフィカルに表示するコードをやっつけで作ってみた。コンパイルは、VS2008/VS2010で確認した。VS2005でもWindows SDKを導入すればコンパイルできるかな??
#include <windows.h> #include <commctrl.h> #include <uxtheme.h> #include <vsstyle.h> #include <vssym32.h> #include <process.h> #include <stdio.h> #include <tchar.h> #include <string.h> #include <vector> #pragma comment(lib, "gdi32.lib") #pragma comment(lib, "user32.lib") #pragma comment(lib, "comctl32.lib") #pragma comment(lib, "uxtheme.lib") #define LNULL NULL #define DEF_THEME(class_,part_, ...) {L##class_, part_, {__VA_ARGS__}, #part_, "" #__VA_ARGS__} #define DEF_THEME_NULL(part_, ...) {NULL, part_, {__VA_ARGS__}, #part_, "" #__VA_ARGS__} const struct THEMEINFO_STRUCT { LPCWSTR tClass; int tPart; int tStates[20]; LPCSTR partName; LPCSTR tStateNames; } g_tinfo_template[] = { DEF_THEME("BUTTON", BP_CHECKBOX, CBS_CHECKEDDISABLED, CBS_CHECKEDHOT, CBS_CHECKEDNORMAL, CBS_CHECKEDPRESSED, CBS_MIXEDDISABLED, CBS_MIXEDHOT, CBS_MIXEDNORMAL, CBS_MIXEDPRESSED, CBS_UNCHECKEDDISABLED, CBS_UNCHECKEDHOT, CBS_UNCHECKEDNORMAL, CBS_UNCHECKEDPRESSED), DEF_THEME_NULL(BP_COMMANDLINK, CMDLS_DEFAULTED, CMDLS_DEFAULTED_ANIMATING, CMDLS_DISABLED, CMDLS_HOT, CMDLS_NORMAL, CMDLS_PRESSED), DEF_THEME_NULL(BP_COMMANDLINKGLYPH, CMDLGS_DEFAULTED, CMDLGS_DISABLED, CMDLGS_HOT, CMDLGS_NORMAL, CMDLGS_PRESSED), DEF_THEME_NULL(BP_GROUPBOX, GBS_DISABLED, GBS_NORMAL), DEF_THEME_NULL(BP_PUSHBUTTON, PBS_DEFAULTED, PBS_DISABLED, PBS_HOT, PBS_NORMAL, PBS_PRESSED), DEF_THEME_NULL(BP_RADIOBUTTON, RBS_CHECKEDDISABLED, RBS_CHECKEDHOT, RBS_CHECKEDNORMAL, RBS_CHECKEDPRESSED, RBS_UNCHECKEDDISABLED, RBS_UNCHECKEDHOT, RBS_UNCHECKEDNORMAL, RBS_UNCHECKEDPRESSED), DEF_THEME_NULL(BP_USERBUTTON), DEF_THEME("CLOCK", CLP_TIME, CLS_NORMAL, CLS_HOT, CLS_PRESSED), DEF_THEME("COMBOBOX", CP_BACKGROUND), DEF_THEME_NULL(CP_BORDER, CBB_DISABLED, CBB_FOCUSED, CBB_HOT, CBB_NORMAL), DEF_THEME_NULL(CP_CUEBANNER, CBCB_DISABLED, CBCB_HOT, CBCB_NORMAL, CBCB_PRESSED), DEF_THEME_NULL(CP_DROPDOWNBUTTON, CBXS_DISABLED, CBXS_HOT, CBXS_NORMAL, CBXS_PRESSED), DEF_THEME_NULL(CP_DROPDOWNBUTTONLEFT, CBXSL_DISABLED, CBXSL_HOT, CBXSL_NORMAL, CBXSL_PRESSED), DEF_THEME_NULL(CP_DROPDOWNBUTTONRIGHT, CBXSR_DISABLED, CBXSR_HOT, CBXSR_NORMAL, CBXSR_PRESSED), DEF_THEME_NULL(CP_TRANSPARENTBACKGROUND, CBTBS_DISABLED, CBTBS_FOCUSED, CBTBS_HOT, CBTBS_NORMAL), DEF_THEME_NULL(CP_READONLY, CBRO_DISABLED, CBRO_HOT, CBRO_NORMAL, CBRO_PRESSED), DEF_THEME("COMMUNICATIONS", CSST_TAB, CSTB_HOT, CSTB_NORMAL, CSTB_SELECTED), DEF_THEME("CONTROLPANEL", CPANEL_BANNERAREA), DEF_THEME_NULL(CPANEL_BODYTEXT), DEF_THEME_NULL(CPANEL_BODYTITLE), DEF_THEME_NULL(CPANEL_BUTTON), DEF_THEME_NULL(CPANEL_CONTENTLINK, CPCL_DISABLED, CPCL_HOT, CPCL_NORMAL, CPCL_PRESSED), DEF_THEME_NULL(CPANEL_CONTENTPANE), DEF_THEME_NULL(CPANEL_CONTENTPANELABEL), DEF_THEME_NULL(CPANEL_CONTENTPANELINE), DEF_THEME_NULL(CPANEL_GROUPTEXT), DEF_THEME_NULL(CPANEL_HELPLINK, CPHL_DISABLED, CPHL_HOT, CPHL_NORMAL, CPHL_PRESSED), DEF_THEME_NULL(CPANEL_LARGECOMMANDAREA), DEF_THEME_NULL(CPANEL_MESSAGETEXT), DEF_THEME_NULL(CPANEL_NAVIGATIONPANE), DEF_THEME_NULL(CPANEL_NAVIGATIONPANELABEL), DEF_THEME_NULL(CPANEL_NAVIGATIONPANELINE), DEF_THEME_NULL(CPANEL_SECTIONTITLELINK, CPSTL_HOT, CPSTL_NORMAL), DEF_THEME_NULL(CPANEL_SMALLCOMMANDAREA), DEF_THEME_NULL(CPANEL_TASKLINK, CPTL_DISABLED, CPTL_HOT, CPTL_NORMAL, CPTL_PAGE, CPTL_PRESSED), DEF_THEME_NULL(CPANEL_TITLE), DEF_THEME("DATEPICKER", DP_DATEBORDER, DPDB_DISABLED, DPDB_FOCUSED, DPDB_HOT, DPDB_NORMAL), DEF_THEME_NULL(DP_DATETEXT, DPDT_DISABLED, DPDT_NORMAL, DPDT_SELECTED), DEF_THEME_NULL(DP_SHOWCALENDARBUTTONRIGHT, DPSCBR_DISABLED, DPSCBR_HOT, DPSCBR_NORMAL, DPSCBR_PRESSED), DEF_THEME("DRAGDROP", DD_COPY, DDCOPY_HIGHLIGHT, DDCOPY_NOHIGHLIGHT), DEF_THEME_NULL(DD_CREATELINK, DDCREATELINK_HIGHLIGHT, DDCREATELINK_NOHIGHLIGHT), DEF_THEME_NULL(DD_IMAGEBG), DEF_THEME_NULL(DD_MOVE, DDMOVE_HIGHLIGHT, DDMOVE_NOHIGHLIGHT), DEF_THEME_NULL(DD_NONE, DDNONE_HIGHLIGHT, DDNONE_NOHIGHLIGHT), DEF_THEME_NULL(DD_TEXTBG), DEF_THEME_NULL(DD_UPDATEMETADATA, DDUPDATEMETADATA_HIGHLIGHT, DDUPDATEMETADATA_NOHIGHLIGHT), DEF_THEME_NULL(DD_WARNING, DDWARNING_HIGHLIGHT, DDWARNING_NOHIGHLIGHT), DEF_THEME("EDIT", EP_BACKGROUND, EBS_ASSIST, EBS_DISABLED, EBS_FOCUSED, EBS_HOT, EBS_NORMAL, EBS_READONLY), DEF_THEME_NULL(EP_BACKGROUNDWITHBORDER, EBWBS_DISABLED, EBWBS_FOCUSED, EBWBS_HOT, EBWBS_NORMAL), DEF_THEME_NULL(EP_CARET), DEF_THEME_NULL(EP_EDITBORDER_HSCROLL, EPSH_DISABLED, EPSH_FOCUSED, EPSH_HOT, EPSH_NORMAL), DEF_THEME_NULL(EP_EDITBORDER_HVSCROLL, EPSHV_DISABLED, EPSHV_FOCUSED, EPSHV_HOT, EPSHV_NORMAL), DEF_THEME_NULL(EP_EDITBORDER_NOSCROLL, EPSN_DISABLED, EPSN_FOCUSED, EPSN_HOT, EPSN_NORMAL), DEF_THEME_NULL(EP_EDITBORDER_VSCROLL, EPSV_DISABLED, EPSV_FOCUSED, EPSV_HOT, EPSV_NORMAL), DEF_THEME_NULL(EP_EDITTEXT, ETS_ASSIST, ETS_CUEBANNER, ETS_DISABLED, ETS_FOCUSED, ETS_HOT, ETS_NORMAL, ETS_READONLY, ETS_SELECTED), DEF_THEME_NULL(EP_PASSWORD), DEF_THEME("EXPLORERBAR", EBP_HEADERBACKGROUND), DEF_THEME_NULL(EBP_HEADERCLOSE, EBHC_HOT, EBHC_NORMAL, EBHC_PRESSED), DEF_THEME_NULL(EBP_HEADERPIN, EBHP_HOT, EBHP_NORMAL, EBHP_PRESSED, EBHP_SELECTEDHOT, EBHP_SELECTEDNORMAL, EBHP_SELECTEDPRESSED), DEF_THEME_NULL(EBP_IEBARMENU, EBM_HOT, EBM_NORMAL, EBM_PRESSED), DEF_THEME_NULL(EBP_NORMALGROUPBACKGROUND), DEF_THEME_NULL(EBP_NORMALGROUPCOLLAPSE, EBNGC_HOT, EBNGC_NORMAL, EBNGC_PRESSED), DEF_THEME_NULL(EBP_NORMALGROUPEXPAND, EBNGE_HOT, EBNGE_NORMAL, EBNGE_PRESSED), DEF_THEME_NULL(EBP_NORMALGROUPHEAD), DEF_THEME_NULL(EBP_SPECIALGROUPBACKGROUND), DEF_THEME_NULL(EBP_SPECIALGROUPCOLLAPSE, EBSGC_HOT, EBSGC_NORMAL, EBSGC_PRESSED), DEF_THEME_NULL(EBP_SPECIALGROUPEXPAND, EBSGE_HOT, EBSGE_NORMAL, EBSGE_PRESSED), DEF_THEME_NULL(EBP_SPECIALGROUPHEAD), DEF_THEME("FLYOUT", FLYOUT_BODY, FBS_EMPHASIZED, FBS_NORMAL), DEF_THEME_NULL(FLYOUT_DIVIDER), DEF_THEME_NULL(FLYOUT_HEADER), DEF_THEME_NULL(FLYOUT_LABEL, FLS_DISABLED, FLS_EMPHASIZED, FLS_NORMAL, FLS_SELECTED), DEF_THEME_NULL(FLYOUT_LINK, FLYOUTLINK_HOVER, FLYOUTLINK_NORMAL), DEF_THEME_NULL(FLYOUT_LINKAREA), DEF_THEME_NULL(FLYOUT_LINKHEADER, FLH_HOVER, FLH_NORMAL), DEF_THEME_NULL(FLYOUT_WINDOW), /* DEF_THEME("GLOBALS", GP_BORDER, BSS_FLAT, BSS_RAISED, BSS_SUNKEN), DEF_THEME_NULL(GP_LINEHORZ, LHS_FLAT, LHS_RAISED, LHS_SUNKEN), DEF_THEME_NULL(GP_LINEVERT, LVS_FLAT, LVS_RAISED, LVS_SUNKEN), */ DEF_THEME("HEADER", HP_HEADERDROPDOWN, HDDS_HOT, HDDS_NORMAL, HDDS_SOFTHOT), DEF_THEME_NULL(HP_HEADERDROPDOWNFILTER, HDDFS_HOT, HDDFS_NORMAL, HDDFS_SOFTHOT), DEF_THEME_NULL(HP_HEADERITEM, HIS_HOT, HIS_ICONHOT, HIS_ICONNORMAL, HIS_ICONPRESSED, HIS_ICONSORTEDHOT, HIS_ICONSORTEDNORMAL, HIS_ICONSORTEDPRESSED, HIS_NORMAL, HIS_PRESSED, HIS_SORTEDNORMAL, HIS_SORTEDHOT, HIS_SORTEDPRESSED), DEF_THEME_NULL(HP_HEADERITEMLEFT, HILS_HOT, HILS_NORMAL, HILS_PRESSED), DEF_THEME_NULL(HP_HEADERITEMRIGHT, HIRS_HOT, HIRS_NORMAL, HIRS_PRESSED), DEF_THEME_NULL(HP_HEADEROVERFLOW, HOFS_HOT, HOFS_NORMAL), DEF_THEME_NULL(HP_HEADERSORTARROW, HSAS_SORTEDDOWN, HSAS_SORTEDUP), DEF_THEME("LISTBOX", LBCP_BORDER_HSCROLL, LBPSH_DISABLED, LBPSH_FOCUSED, LBPSH_HOT, LBPSH_NORMAL), DEF_THEME_NULL(LBCP_BORDER_HVSCROLL, LBPSHV_DISABLED, LBPSHV_FOCUSED, LBPSHV_HOT, LBPSHV_NORMAL), DEF_THEME_NULL(LBCP_BORDER_NOSCROLL, LBPSN_DISABLED, LBPSN_FOCUSED, LBPSN_HOT, LBPSN_NORMAL), DEF_THEME_NULL(LBCP_BORDER_VSCROLL, LBPSV_DISABLED, LBPSV_FOCUSED, LBPSV_HOT, LBPSV_NORMAL), DEF_THEME_NULL(LBCP_ITEM, LBPSI_HOT, LBPSI_HOTSELECTED, LBPSI_SELECTED, LBPSI_SELECTEDNOTFOCUS), DEF_THEME("LISTVIEW", LVP_COLLAPSEBUTTON, LVCB_HOVER, LVCB_NORMAL, LVCB_PUSHED), DEF_THEME_NULL(LVP_COLUMNDETAIL), DEF_THEME_NULL(LVP_EMPTYTEXT), DEF_THEME_NULL(LVP_EXPANDBUTTON, LVEB_HOVER, LVEB_NORMAL, LVEB_PUSHED), DEF_THEME_NULL(LVP_GROUPHEADER, LVGH_CLOSE, LVGH_CLOSEHOT, LVGH_CLOSESELECTED, LVGH_CLOSESELECTEDHOT, LVGH_CLOSESELECTEDNOTFOCUSED, LVGH_CLOSESELECTEDNOTFOCUSEDHOT, LVGH_CLOSEMIXEDSELECTION, LVGH_CLOSEMIXEDSELECTIONHOT, LVGH_OPEN, LVGH_OPENHOT, LVGH_OPENSELECTED, LVGH_OPENSELECTEDHOT, LVGH_OPENSELECTEDNOTFOCUSED, LVGH_OPENSELECTEDNOTFOCUSEDHOT, LVGH_OPENMIXEDSELECTION, LVGH_OPENMIXEDSELECTIONHOT), DEF_THEME_NULL(LVP_GROUPHEADERLINE, LVGHL_CLOSE, LVGHL_CLOSEHOT, LVGHL_CLOSESELECTED, LVGHL_CLOSESELECTEDHOT, LVGHL_CLOSESELECTEDNOTFOCUSED, LVGHL_CLOSESELECTEDNOTFOCUSEDHOT, LVGHL_CLOSEMIXEDSELECTION, LVGHL_CLOSEMIXEDSELECTIONHOT, LVGHL_OPEN, LVGHL_OPENHOT, LVGHL_OPENSELECTED, LVGHL_OPENSELECTEDHOT, LVGHL_OPENSELECTEDNOTFOCUSED, LVGHL_OPENSELECTEDNOTFOCUSEDHOT, LVGHL_OPENMIXEDSELECTION, LVGHL_OPENMIXEDSELECTIONHOT), DEF_THEME_NULL(LVP_LISTGROUP), DEF_THEME_NULL(LVP_LISTDETAIL), DEF_THEME_NULL(LVP_LISTITEM, LISS_DISABLED, LISS_HOT, LISS_HOTSELECTED, LISS_NORMAL, LISS_SELECTED, LISS_SELECTEDNOTFOCUS), DEF_THEME_NULL(LVP_LISTSORTEDDETAIL), DEF_THEME("MENU", MENU_BARBACKGROUND, MB_ACTIVE, MB_INACTIVE), DEF_THEME_NULL(MENU_BARITEM, MBI_DISABLED, MBI_DISABLEDHOT, MBI_DISABLEDPUSHED, MBI_HOT, MBI_NORMAL, MBI_PUSHED), DEF_THEME_NULL(MENU_CHEVRON_TMSCHEMA), DEF_THEME_NULL(MENU_MENUBARDROPDOWN_TMSCHEMA), DEF_THEME_NULL(MENU_MENUBARITEM_TMSCHEMA), DEF_THEME_NULL(MENU_MENUDROPDOWN_TMSCHEMA), DEF_THEME_NULL(MENU_MENUITEM_TMSCHEMA), DEF_THEME_NULL(MENU_POPUPBACKGROUND), DEF_THEME_NULL(MENU_POPUPBORDERS), DEF_THEME_NULL(MENU_POPUPCHECK, MC_BULLETDISABLED, MC_BULLETNORMAL, MC_CHECKMARKDISABLED, MC_CHECKMARKNORMAL), DEF_THEME_NULL(MENU_POPUPCHECKBACKGROUND, MCB_BITMAP, MCB_DISABLED, MCB_NORMAL), DEF_THEME_NULL(MENU_POPUPGUTTER), DEF_THEME_NULL(MENU_POPUPITEM, MPI_DISABLED, MPI_DISABLEDHOT, MPI_HOT, MPI_NORMAL), DEF_THEME_NULL(MENU_POPUPSEPARATOR), DEF_THEME_NULL(MENU_POPUPSUBMENU, MSM_DISABLED, MSM_NORMAL), DEF_THEME_NULL(MENU_SEPARATOR_TMSCHEMA), DEF_THEME_NULL(MENU_SYSTEMCLOSE, MSYSC_DISABLED, MSYSC_NORMAL), DEF_THEME_NULL(MENU_SYSTEMMAXIMIZE, MSYSMX_DISABLED, MSYSMX_NORMAL), DEF_THEME_NULL(MENU_SYSTEMMINIMIZE, MSYSMN_DISABLED, MSYSMN_NORMAL), DEF_THEME_NULL(MENU_SYSTEMRESTORE, MSYSR_DISABLED, MSYSR_NORMAL), DEF_THEME("MENUBAND", MDP_NEWAPPBUTTON, MDS_CHECKED, MDS_DISABLED, MDS_HOT, MDS_HOTCHECKED, MDS_NORMAL, MDS_PRESSED), DEF_THEME_NULL(MDP_SEPERATOR), DEF_THEME("NAVIGATION", NAV_BACKBUTTON, NAV_BB_DISABLED, NAV_BB_HOT, NAV_BB_NORMAL, NAV_BB_PRESSED), DEF_THEME_NULL(NAV_FORWARDBUTTON, NAV_FB_DISABLED, NAV_FB_HOT, NAV_FB_NORMAL, NAV_FB_PRESSED), DEF_THEME_NULL(NAV_MENUBUTTON, NAV_MB_DISABLED, NAV_MB_HOT, NAV_MB_NORMAL, NAV_MB_PRESSED), DEF_THEME("PAGE", PGRP_DOWN, DNS_DISABLED, DNS_HOT, DNS_NORMAL, DNS_PRESSED), DEF_THEME_NULL(PGRP_DOWNHORZ, DNHZS_DISABLED, DNHZS_HOT, DNHZS_NORMAL, DNHZS_PRESSED), DEF_THEME_NULL(PGRP_UP, UPS_DISABLED, UPS_HOT, UPS_NORMAL, UPS_PRESSED), DEF_THEME_NULL(PGRP_UPHORZ, UPHZS_DISABLED, UPHZS_HOT, UPHZS_NORMAL, UPHZS_PRESSED), DEF_THEME("PROGRESS", PP_BAR), DEF_THEME_NULL(PP_BARVERT), DEF_THEME_NULL(PP_CHUNK), DEF_THEME_NULL(PP_CHUNKVERT), DEF_THEME_NULL(PP_FILL, PBFS_ERROR, PBFS_NORMAL, PBFS_PARTIAL, PBFS_PAUSED), DEF_THEME_NULL(PP_FILLVERT, PBFVS_ERROR, PBFVS_NORMAL, PBFVS_PARTIAL, PBFVS_PAUSED), DEF_THEME_NULL(PP_MOVEOVERLAY), DEF_THEME_NULL(PP_MOVEOVERLAYVERT), DEF_THEME_NULL(PP_PULSEOVERLAY), DEF_THEME_NULL(PP_PULSEOVERLAYVERT), DEF_THEME_NULL(PP_TRANSPARENTBAR, PBBS_NORMAL, PBBS_PARTIAL), DEF_THEME_NULL(PP_TRANSPARENTBARVERT, PBBVS_NORMAL, PBBVS_PARTIAL), DEF_THEME("REBAR", RP_BACKGROUND), DEF_THEME_NULL(RP_BAND), DEF_THEME_NULL(RP_CHEVRON, CHEVS_HOT, CHEVS_NORMAL, CHEVS_PRESSED), DEF_THEME_NULL(RP_CHEVRONVERT, CHEVSV_HOT, CHEVSV_NORMAL, CHEVSV_PRESSED), DEF_THEME_NULL(RP_GRIPPER), DEF_THEME_NULL(RP_GRIPPERVERT), DEF_THEME_NULL(RP_SPLITTER, SPLITS_HOT, SPLITS_NORMAL, SPLITS_PRESSED), DEF_THEME_NULL(RP_SPLITTERVERT, SPLITSV_HOT, SPLITSV_NORMAL, SPLITSV_PRESSED), DEF_THEME("SCROLLBAR", SBP_ARROWBTN, ABS_DOWNDISABLED, ABS_DOWNHOT, ABS_DOWNNORMAL, ABS_DOWNPRESSED, ABS_DOWNHOVER, ABS_LEFTDISABLED, ABS_LEFTHOT, ABS_LEFTHOVER, ABS_LEFTNORMAL, ABS_LEFTPRESSED, ABS_RIGHTDISABLED, ABS_RIGHTHOT, ABS_RIGHTHOVER, ABS_RIGHTNORMAL, ABS_RIGHTPRESSED, ABS_UPDISABLED, ABS_UPHOT, ABS_UPHOVER, ABS_UPNORMAL, ABS_UPPRESSED), DEF_THEME_NULL(SBP_GRIPPERHORZ, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_GRIPPERVERT, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_LOWERTRACKHORZ, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_LOWERTRACKVERT, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_SIZEBOX, SZB_HALFBOTTOMRIGHTALIGN, SZB_HALFBOTTOMLEFTALIGN, SZB_HALFTOPRIGHTALIGN, SZB_HALFTOPLEFTALIGN, SZB_LEFTALIGN, SZB_RIGHTALIGN, SZB_TOPRIGHTALIGN, SZB_TOPLEFTALIGN), DEF_THEME_NULL(SBP_THUMBBTNHORZ, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_THUMBBTNVERT, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_UPPERTRACKHORZ, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), DEF_THEME_NULL(SBP_UPPERTRACKVERT, SCRBS_DISABLED, SCRBS_HOT, SCRBS_HOVER, SCRBS_NORMAL, SCRBS_PRESSED), // DEF_THEME("SEARCHEDITBOX", SEBP_SEARCHEDITBOXTEXT, SEBTS_FORMATTED), DEF_THEME("SPIN", SPNP_DOWN, DNS_DISABLED, DNS_HOT, DNS_NORMAL, DNS_PRESSED), DEF_THEME_NULL(SPNP_DOWNHORZ, DNHZS_DISABLED, DNHZS_HOT, DNHZS_NORMAL, DNHZS_PRESSED), DEF_THEME_NULL(SPNP_UP, UPS_DISABLED, UPS_HOT, UPS_NORMAL, UPS_PRESSED), DEF_THEME_NULL(SPNP_UPHORZ, UPHZS_DISABLED, UPHZS_HOT, UPHZS_NORMAL, UPHZS_PRESSED), DEF_THEME("STARTPANEL", SPP_LOGOFF), DEF_THEME_NULL(SPP_LOGOFFBUTTONS, SPLS_HOT, SPLS_NORMAL, SPLS_PRESSED), DEF_THEME_NULL(SPP_MOREPROGRAMS), DEF_THEME_NULL(SPP_MOREPROGRAMSARROW, SPS_HOT, SPS_NORMAL, SPS_PRESSED), DEF_THEME_NULL(SPP_PLACESLIST), DEF_THEME_NULL(SPP_PLACESLISTSEPARATOR), DEF_THEME_NULL(SPP_PREVIEW), DEF_THEME_NULL(SPP_PROGLIST), DEF_THEME_NULL(SPP_PROGLISTSEPARATOR), DEF_THEME_NULL(SPP_USERPANE), DEF_THEME_NULL(SPP_USERPICTURE), DEF_THEME("STATUS", SP_GRIPPER), DEF_THEME_NULL(SP_GRIPPERPANE), DEF_THEME_NULL(SP_PANE), DEF_THEME("TAB", TABP_AEROWIZARDBODY), DEF_THEME_NULL(TABP_BODY), DEF_THEME_NULL(TABP_PANE), DEF_THEME_NULL(TABP_TABITEM, TIS_DISABLED, TIS_FOCUSED, TIS_HOT, TIS_NORMAL, TIS_SELECTED), DEF_THEME_NULL(TABP_TABITEMBOTHEDGE, TIBES_DISABLED, TIBES_FOCUSED, TIBES_HOT, TIBES_NORMAL, TIBES_SELECTED), DEF_THEME_NULL(TABP_TABITEMLEFTEDGE, TILES_DISABLED, TILES_FOCUSED, TILES_HOT, TILES_NORMAL, TILES_SELECTED), DEF_THEME_NULL(TABP_TABITEMRIGHTEDGE, TIRES_DISABLED, TIRES_FOCUSED, TIRES_HOT, TIRES_NORMAL, TIRES_SELECTED), DEF_THEME_NULL(TABP_TOPTABITEM, TTIS_DISABLED, TTIS_FOCUSED, TTIS_HOT, TTIS_NORMAL, TTIS_SELECTED), DEF_THEME_NULL(TABP_TOPTABITEMBOTHEDGE, TTIBES_DISABLED, TTIBES_FOCUSED, TTIBES_HOT, TTIBES_NORMAL, TTIBES_SELECTED), DEF_THEME_NULL(TABP_TOPTABITEMLEFTEDGE, TTILES_DISABLED, TTILES_FOCUSED, TTILES_HOT, TTILES_NORMAL, TTILES_SELECTED), DEF_THEME_NULL(TABP_TOPTABITEMRIGHTEDGE, TTIRES_DISABLED, TTIRES_FOCUSED, TTIRES_HOT, TTIRES_NORMAL, TTIRES_SELECTED), DEF_THEME("TASKBAND", TDP_GROUPCOUNT), DEF_THEME_NULL(TDP_FLASHBUTTON), DEF_THEME_NULL(TDP_FLASHBUTTONGROUPMENU), DEF_THEME("TASKBAR", TBP_BACKGROUNDBOTTOM), DEF_THEME_NULL(TBP_BACKGROUNDLEFT), DEF_THEME_NULL(TBP_BACKGROUNDRIGHT), // DEF_THEME_NULL(TBP_BACKGROUNDTOP), DEF_THEME_NULL(TBP_SIZINGBARBOTTOM), // DEF_THEME_NULL(TBP_SIZINGBARBOTTOMLEFT), DEF_THEME_NULL(TBP_SIZINGBARRIGHT), DEF_THEME_NULL(TBP_SIZINGBARTOP), DEF_THEME("TASKDIALOG", TDLG_BUTTONSECTION), DEF_THEME_NULL(TDLG_BUTTONWRAPPER), DEF_THEME_NULL(TDLG_COMMANDLINKPANE), DEF_THEME_NULL(TDLG_CONTENTICON), DEF_THEME_NULL(TDLG_CONTENTPANE, TDLGCPS_STANDALONE), DEF_THEME_NULL(TDLG_CONTROLPANE), DEF_THEME_NULL(TDLG_EXPANDEDCONTENT), DEF_THEME_NULL(TDLG_EXPANDEDFOOTERAREA), DEF_THEME_NULL(TDLG_EXPANDOBUTTON, TDLGEBS_EXPANDEDHOVER, TDLGEBS_EXPANDEDNORMAL, TDLGEBS_EXPANDEDPRESSED, TDLGEBS_HOVER, TDLGEBS_NORMAL, TDLGEBS_PRESSED), DEF_THEME_NULL(TDLG_EXPANDOTEXT), DEF_THEME_NULL(TDLG_FOOTNOTEAREA), DEF_THEME_NULL(TDLG_FOOTNOTEPANE), DEF_THEME_NULL(TDLG_FOOTNOTESEPARATOR), DEF_THEME_NULL(TDLG_IMAGEALIGNMENT), DEF_THEME_NULL(TDLG_MAINICON), DEF_THEME_NULL(TDLG_MAININSTRUCTIONPANE), DEF_THEME_NULL(TDLG_PRIMARYPANEL), DEF_THEME_NULL(TDLG_PROGRESSBAR), DEF_THEME_NULL(TDLG_RADIOBUTTONPANE), DEF_THEME_NULL(TDLG_SECONDARYPANEL), DEF_THEME_NULL(TDLG_VERIFICATIONTEXT), DEF_THEME("TEXTSTYLE", TEXT_BODYTITLE), DEF_THEME_NULL(TEXT_BODYTEXT), DEF_THEME_NULL(TEXT_CONTROLLABEL, TS_CONTROLLABEL_DISABLED, TS_CONTROLLABEL_NORMAL), DEF_THEME_NULL(TEXT_EXPANDED), DEF_THEME_NULL(TEXT_HYPERLINKTEXT, TS_HYPERLINK_DISABLED, TS_HYPERLINK_HOT, TS_HYPERLINK_NORMAL, TS_HYPERLINK_PRESSED), DEF_THEME_NULL(TEXT_INSTRUCTION), DEF_THEME_NULL(TEXT_LABEL), DEF_THEME_NULL(TEXT_MAININSTRUCTION), DEF_THEME_NULL(TEXT_SECONDARYTEXT), DEF_THEME("TOOLBAR", TP_BUTTON, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME_NULL(TP_DROPDOWNBUTTON, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME_NULL(TP_DROPDOWNBUTTONGLYPH, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME_NULL(TP_SEPARATOR, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME_NULL(TP_SEPARATORVERT, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME_NULL(TP_SPLITBUTTON, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME_NULL(TP_SPLITBUTTONDROPDOWN, TS_CHECKED, TS_DISABLED, TS_HOT, TS_HOTCHECKED, TS_NEARHOT, TS_NORMAL, TS_OTHERSIDEHOT, TS_PRESSED), DEF_THEME("TOOLTIP", TTP_BALLOON, TTBS_LINK, TTBS_NORMAL), DEF_THEME_NULL(TTP_BALLOONSTEM, TTBSS_POINTINGUPLEFTWALL, TTBSS_POINTINGUPCENTERED, TTBSS_POINTINGUPRIGHTWALL, TTBSS_POINTINGDOWNRIGHTWALL, TTBSS_POINTINGDOWNCENTERED, TTBSS_POINTINGDOWNLEFTWALL), DEF_THEME_NULL(TTP_BALLOONTITLE), DEF_THEME_NULL(TTP_CLOSE, TTCS_HOT, TTCS_NORMAL, TTCS_PRESSED), DEF_THEME_NULL(TTP_STANDARD, TTSS_LINK, TTSS_NORMAL), DEF_THEME_NULL(TTP_STANDARDTITLE, TTSS_LINK, TTSS_NORMAL), DEF_THEME_NULL(TTP_WRENCH, TTWS_NORMAL, TTWS_HOT, TTWS_PRESSED), DEF_THEME("TRACKBAR", TKP_THUMB, TUS_DISABLED, TUS_FOCUSED, TUS_HOT, TUS_NORMAL, TUS_PRESSED), DEF_THEME_NULL(TKP_THUMBBOTTOM, TUBS_DISABLED, TUBS_FOCUSED, TUBS_HOT, TUBS_NORMAL, TUBS_PRESSED), DEF_THEME_NULL(TKP_THUMBLEFT, TUVLS_DISABLED, TUVLS_FOCUSED, TUVLS_HOT, TUVLS_NORMAL, TUVLS_PRESSED), DEF_THEME_NULL(TKP_THUMBRIGHT, TUVRS_DISABLED, TUVRS_FOCUSED, TUVRS_HOT, TUVRS_NORMAL, TUVRS_PRESSED), DEF_THEME_NULL(TKP_THUMBTOP, TUTS_DISABLED, TUTS_FOCUSED, TUTS_HOT, TUTS_NORMAL, TUTS_PRESSED), DEF_THEME_NULL(TKP_THUMBVERT, TUVS_DISABLED, TUVS_FOCUSED, TUVS_HOT, TUVS_NORMAL, TUVS_PRESSED), DEF_THEME_NULL(TKP_TICS, TSS_NORMAL), DEF_THEME_NULL(TKP_TICSVERT, TSVS_NORMAL), DEF_THEME_NULL(TKP_TRACK, TRS_NORMAL), DEF_THEME_NULL(TKP_TRACKVERT, TRVS_NORMAL), DEF_THEME("TRAYNOTIFY", TNP_ANIMBACKGROUND), DEF_THEME_NULL(TNP_BACKGROUND), DEF_THEME("TREEVIEW", TVP_BRANCH), DEF_THEME_NULL(TVP_GLYPH, GLPS_CLOSED, GLPS_OPENED), DEF_THEME_NULL(TVP_HOTGLYPH, HGLPS_CLOSED, HGLPS_OPENED), DEF_THEME_NULL(TVP_TREEITEM, TREIS_DISABLED, TREIS_HOT, TREIS_NORMAL, TREIS_SELECTED, TREIS_SELECTEDNOTFOCUS, TREIS_HOTSELECTED), DEF_THEME("WINDOW", WP_CAPTION, CS_ACTIVE, CS_DISABLED, CS_INACTIVE), DEF_THEME_NULL(WP_CAPTIONSIZINGTEMPLATE), DEF_THEME_NULL(WP_CLOSEBUTTON, CBS_DISABLED, CBS_HOT, CBS_NORMAL, CBS_PUSHED), DEF_THEME_NULL(WP_DIALOG), DEF_THEME_NULL(WP_FRAME, FS_ACTIVE, FS_INACTIVE), DEF_THEME_NULL(WP_FRAMEBOTTOM), DEF_THEME_NULL(WP_FRAMEBOTTOMSIZINGTEMPLATE), DEF_THEME_NULL(WP_FRAMELEFT), DEF_THEME_NULL(WP_FRAMELEFTSIZINGTEMPLATE), DEF_THEME_NULL(WP_FRAMERIGHT), DEF_THEME_NULL(WP_FRAMERIGHTSIZINGTEMPLATE), DEF_THEME_NULL(WP_HELPBUTTON, HBS_DISABLED, HBS_HOT, HBS_NORMAL, HBS_PUSHED), DEF_THEME_NULL(WP_HORZSCROLL, HSS_DISABLED, HSS_HOT, HSS_NORMAL, HSS_PUSHED), DEF_THEME_NULL(WP_HORZTHUMB, HTS_DISABLED, HTS_HOT, HTS_NORMAL, HTS_PUSHED), DEF_THEME_NULL(WP_MAXBUTTON, MAXBS_DISABLED, MAXBS_HOT, MAXBS_NORMAL, MAXBS_PUSHED), DEF_THEME_NULL(WP_MAXCAPTION, MXCS_ACTIVE, MXCS_DISABLED, MXCS_INACTIVE), DEF_THEME_NULL(WP_MDICLOSEBUTTON), DEF_THEME_NULL(WP_MDIHELPBUTTON), DEF_THEME_NULL(WP_MDIMINBUTTON), DEF_THEME_NULL(WP_MDIRESTOREBUTTON), DEF_THEME_NULL(WP_MDISYSBUTTON), DEF_THEME_NULL(WP_MINBUTTON, MINBS_DISABLED, MINBS_HOT, MINBS_NORMAL, MINBS_PUSHED), DEF_THEME_NULL(WP_MINCAPTION, MNCS_ACTIVE, MNCS_DISABLED, MNCS_INACTIVE), DEF_THEME_NULL(WP_RESTOREBUTTON, RBS_DISABLED, RBS_HOT, RBS_NORMAL, RBS_PUSHED), DEF_THEME_NULL(WP_SMALLCAPTION), DEF_THEME_NULL(WP_SMALLCAPTIONSIZINGTEMPLATE), DEF_THEME_NULL(WP_SMALLCLOSEBUTTON), DEF_THEME_NULL(WP_SMALLFRAMEBOTTOM), DEF_THEME_NULL(WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE), DEF_THEME_NULL(WP_SMALLFRAMELEFT), DEF_THEME_NULL(WP_SMALLFRAMELEFTSIZINGTEMPLATE), DEF_THEME_NULL(WP_SMALLFRAMERIGHT), DEF_THEME_NULL(WP_SMALLFRAMERIGHTSIZINGTEMPLATE), DEF_THEME_NULL(WP_SMALLMAXCAPTION), DEF_THEME_NULL(WP_SMALLMINCAPTION), DEF_THEME_NULL(WP_SYSBUTTON, SBS_DISABLED, SBS_HOT, SBS_NORMAL, SBS_PUSHED), DEF_THEME_NULL(WP_VERTSCROLL, VSS_DISABLED, VSS_HOT, VSS_NORMAL, VSS_PUSHED), DEF_THEME_NULL(WP_VERTTHUMB, VTS_DISABLED, VTS_HOT, VTS_NORMAL, VTS_PUSHED) }; const size_t CLASSANDPART_COUNT = sizeof(g_tinfo_template) / sizeof(THEMEINFO_STRUCT); HFONT g_hSysFont = NULL; struct RUNTIME_THEMEINFO { LPCWSTR className; int part; int state; LPCTSTR partName; LPCTSTR stateName; }; std::vector<RUNTIME_THEMEINFO> g_tinfo; size_t g_idx = 0; BOOL IsClearTypeEnabled() { BOOL check = FALSE; UINT check2 = 0; if(!SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &check,0)) return FALSE; if(!check) return FALSE; if(!SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &check2,0)) return FALSE; return (check2 == FE_FONTSMOOTHINGCLEARTYPE); } void InitSysFont() { NONCLIENTMETRICS ncm; ncm.cbSize = sizeof(NONCLIENTMETRICS); #if(WINVER >= 0x0600) ncm.cbSize -= 4; // Quick hack for Windows SDK 6.0 #endif if(SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)) { // Enable ClearType or simple antialias ncm.lfMenuFont.lfQuality = IsClearTypeEnabled() ? CLEARTYPE_QUALITY : ANTIALIASED_QUALITY; g_hSysFont = CreateFontIndirect(&ncm.lfMenuFont); } } void DoPaint(HWND hwnd) { RECT rc; GetClientRect(hwnd, &rc); rc.left += 16; rc.top += 50; rc.right -= 16; rc.bottom -= 16; RUNTIME_THEMEINFO& t = g_tinfo[g_idx]; HTHEME hTheme = OpenThemeData(hwnd, t.className); PAINTSTRUCT ps; BeginPaint(hwnd, &ps); HGDIOBJ hOldFont = SelectObject(ps.hdc, g_hSysFont); SetBkMode(ps.hdc, TRANSPARENT); SetTextColor(ps.hdc, 0); TextOutW(ps.hdc, 0, 0, t.className, wcslen(t.className)); TextOutA(ps.hdc, 0, 16, t.partName, strlen(t.partName)); TextOutA(ps.hdc, 0, 32, t.stateName, strlen(t.stateName)); DrawThemeBackground( hTheme, ps.hdc, t.part, t.state, &rc, &ps.rcPaint); RECT rcContent; GetThemeBackgroundContentRect( hTheme, ps.hdc, t.part, t.state, &rc, &rcContent); rcContent.left += 16; rcContent.top += 16; DrawThemeText( hTheme, ps.hdc, t.part, t.state, t.className, -1, 0, 0, &rcContent); SelectObject(ps.hdc, hOldFont); EndPaint(hwnd, &ps); CloseThemeData(hTheme); } // level: 0,class 1,part 2,state void next(HWND hwnd, bool inc, int level) { size_t add = inc ? 1 : g_tinfo.size() - 1; RUNTIME_THEMEINFO& last = g_tinfo[g_idx]; for(;;) { g_idx = (g_idx + add) % g_tinfo.size(); RUNTIME_THEMEINFO& cur = g_tinfo[g_idx]; if(level == 0 && last.className != cur.className) break; else if(level == 1 && last.part != cur.part) break; else if(level == 2) break; } InvalidateRect(hwnd, NULL, TRUE); } static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: break; case WM_PAINT: DoPaint(hwnd); break; case WM_LBUTTONDOWN: next(hwnd, true, 2); break; case WM_RBUTTONDOWN: next(hwnd, false, 2); break; case WM_KEYDOWN: switch(wParam) { case VK_HOME: g_idx = 0; InvalidateRect(hwnd, NULL, TRUE); break; case VK_END: g_idx = g_tinfo.size() - 1; InvalidateRect(hwnd, NULL, TRUE); break; case VK_PRIOR: next(hwnd, false, 0); break; case VK_NEXT: next(hwnd, true, 0); break; case VK_SPACE: case VK_RIGHT: next(hwnd, true, 2); break; case VK_BACK: case VK_LEFT: next(hwnd, false, 2); break; case VK_UP: next(hwnd, false, 1); break; case VK_DOWN: next(hwnd, true, 1); break; } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } int main() { HINSTANCE hInstance = NULL; int nCmdShow = SW_SHOW; int state = 0, classAndPart = 0; int count = 0; LPCWSTR lastClass = NULL; do { const THEMEINFO_STRUCT& t = g_tinfo_template[classAndPart]; LPCWSTR className = t.tClass; if(!className) className = lastClass; lastClass = className; char* buf = new char[strlen(t.tStateNames) + 1]; strcpy(buf, t.tStateNames); char* stateName = buf; for(int i = 0; i < state; i++) { stateName = strchr(stateName, ','); if(!stateName) break; stateName++; while(*stateName == ' ') stateName++; } if(stateName && stateName[0]) { char* p = strchr(stateName, ','); if(p) *p = 0; } else { stateName = "0"; } RUNTIME_THEMEINFO rti = { className, t.tPart, t.tStates[state], t.partName, stateName}; g_tinfo.push_back(rti); count++; state++; if(state > 0 && g_tinfo_template[classAndPart].tStates[state] == 0) { classAndPart++; state = 0; } } while(classAndPart < CLASSANDPART_COUNT); printf("%u\n", count); InitCommonControls(); InitSysFont(); LPCTSTR className = _T("uxtheme_viewer_class"); WNDCLASSEX wc; ZeroMemory(&wc, sizeof(wc)); wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wc.lpszClassName = className; RegisterClassEx(&wc); HWND hwnd = CreateWindow(className, _T("UxTheme Viewer"), WS_OVERLAPPED | WS_SYSMENU, 0, 0, 400, 400, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }