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

📄 themedump.cpp

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   { NULL, MP_MENUITEM, L"MENU" },
   { NULL, MP_SEPARATOR, L"MENU" },
  { L"MENUBAND", MDP_NEWAPPBUTTON, L"MENUBAND" },
  { L"PAGE", 0, NULL },
   { NULL, PGRP_DOWN, L"DOWN" },
   { NULL, PGRP_DOWNHORZ, L"DOWNHORZ" },
   { NULL, PGRP_UP, L"UP" },
   { NULL, PGRP_UPHORZ, L"UPHORZ" },
  { L"REBAR", RP_CHEVRON, L"CHEVRON" },
  { L"SCROLLBAR", 0, NULL },
   { NULL, SBP_ARROWBTN, L"ARROWBTN" },
   { NULL, SBP_LOWERTRACKHORZ, L"SCROLLBAR" },
   { NULL, SBP_LOWERTRACKVERT, L"SCROLLBAR" },
   { NULL, SBP_THUMBBTNHORZ, L"SCROLLBAR" },
   { NULL, SBP_THUMBBTNVERT, L"SCROLLBAR" },
   { NULL, SBP_UPPERTRACKHORZ, L"SCROLLBAR" },
   { NULL, SBP_UPPERTRACKVERT, L"SCROLLBAR" },
   { NULL, SBP_SIZEBOX, L"SIZEBOX" },
  { L"SPIN", 0, NULL },
   { NULL, SPNP_DOWN, L"DOWN" },
   { NULL, SPNP_DOWNHORZ, L"DOWNHORZ" },
   { NULL, SPNP_UP, L"UP" },
   { NULL, SPNP_UPHORZ, L"UPHORZ" },
  { L"STARTPANEL", 0, NULL },
   { NULL, SPP_LOGOFFBUTTONS, L"LOGOFFBUTTONS" },
   { NULL, SPP_MOREPROGRAMSARROW, L"MOREPROGRAMSARROW" },
  { L"TAB", 0, NULL },
   { NULL, TABP_TABITEM, L"TABITEM" },
   { NULL, TABP_TABITEMBOTHEDGE, L"TABITEMBOTHEDGE" },
   { NULL, TABP_TABITEMLEFTEDGE, L"TABITEMLEFTEDGE" },
   { NULL, TABP_TABITEMRIGHTEDGE, L"TABITEMRIGHTEDGE" },
   { NULL, TABP_TOPTABITEM, L"TOPTABITEM" },
   { NULL, TABP_TOPTABITEMBOTHEDGE, L"TOPTABITEMBOTHEDGE" },
   { NULL, TABP_TOPTABITEMLEFTEDGE, L"TOPTABITEMLEFTEDGE" },
   { NULL, TABP_TOPTABITEMRIGHTEDGE, L"TOPTABITEMRIGHTEDGE" },
  { L"TOOLBAR", 0, NULL },
   { NULL, TP_BUTTON, L"TOOLBAR" },
   { NULL, TP_DROPDOWNBUTTON, L"TOOLBAR" },
   { NULL, TP_SPLITBUTTON, L"TOOLBAR" },
   { NULL, TP_SPLITBUTTONDROPDOWN, L"TOOLBAR" },
   { NULL, TP_SEPARATOR, L"TOOLBAR" },
   { NULL, TP_SEPARATORVERT, L"TOOLBAR" },
  { L"TOOLTIP", 0, NULL },
   { NULL, TTP_BALLOON, L"BALLOON" },
   { NULL, TTP_BALLOONTITLE, L"BALLOON" },
   { NULL, TTP_CLOSE, L"CLOSE" },
   { NULL, TTP_STANDARD, L"STANDARD" },
   { NULL, TTP_STANDARDTITLE, L"STANDARD" },
  { L"TRACKBAR", 0, NULL },
   { NULL, TKP_THUMB, L"THUMB" },
   { NULL, TKP_THUMBBOTTOM, L"THUMBBOTTOM" },
   { NULL, TKP_THUMBLEFT, L"THUMBLEFT" },
   { NULL, TKP_THUMBRIGHT, L"THUMBRIGHT" },
   { NULL, TKP_THUMBTOP, L"THUMBTOP" },
   { NULL, TKP_THUMBVERT, L"THUMBVERT" },
   { NULL, TKP_TICS, L"TICS" },
   { NULL, TKP_TICSVERT, L"TICSVERT" },
   { NULL, TKP_TRACK, L"TRACK" },
   { NULL, TKP_TRACKVERT, L"TRACKVERT" },
  { L"TREEVIEW", 0, NULL },
   { NULL, TVP_GLYPH, L"GLYPH" },
   { NULL, TVP_TREEITEM, L"TREEITEM" },
  { L"WINDOW", 0, NULL },
   { NULL, WP_CAPTION, L"CAPTION" },
   { NULL, WP_CLOSEBUTTON, L"CLOSEBUTTON" },
   { NULL, WP_FRAMEBOTTOM, L"FRAME" },
   { NULL, WP_FRAMELEFT, L"FRAME" },
   { NULL, WP_FRAMERIGHT, L"FRAME" },
   { NULL, WP_HELPBUTTON, L"HELPBUTTON" },
   { NULL, WP_HORZSCROLL, L"HORZSCROLL" },
   { NULL, WP_HORZTHUMB, L"HORZTHUMB" },
   { NULL, WP_MAXBUTTON, L"MAXBUTTON" },
   { NULL, WP_MAXCAPTION, L"MAXCAPTION" },
   { NULL, WP_MDICLOSEBUTTON, L"CLOSEBUTTON" },
   { NULL, WP_MDIHELPBUTTON, L"HELPBUTTON" },
   { NULL, WP_MDIMINBUTTON, L"MINBUTTON" },
   { NULL, WP_MDIRESTOREBUTTON, L"RESTOREBUTTON" },
   { NULL, WP_MDISYSBUTTON, L"SYSBUTTON" },
   { NULL, WP_MINBUTTON, L"MINBUTTON" },
   { NULL, WP_MINCAPTION, L"MINCAPTION" },
   { NULL, WP_RESTOREBUTTON, L"RESTOREBUTTON" },
   { NULL, WP_SMALLCAPTION, L"CAPTION" },
   { NULL, WP_SMALLCLOSEBUTTON, L"CLOSEBUTTON" },
   { NULL, WP_SMALLFRAMEBOTTOM, L"FRAME" },
   { NULL, WP_SMALLFRAMELEFT, L"FRAME" },
   { NULL, WP_SMALLFRAMERIGHT, L"FRAME" },
   { NULL, WP_SMALLMAXCAPTION, L"MAXCAPTION" },
   { NULL, WP_SMALLMINCAPTION, L"MINCAPTION" },
   { NULL, WP_SYSBUTTON, L"SYSBUTTON" },
   { NULL, WP_VERTSCROLL, L"HORZSCROLL" },
   { NULL, WP_VERTTHUMB, L"HORZTHUMB" },
 };

 class state_link: public std::unary_function<struct state_mapping_t, void>
 {
  private:
   tm_classes_t::iterator m_class;

  public:
   void operator()(const struct state_mapping_t& mapping_)
   {
    // switch to a new class
    if(mapping_.classname)
     m_class = tm_classes.find(std::wstring(mapping_.classname));

    // no mapping, or class not found
    if(mapping_.states == NULL || m_class == tm_classes.end()) return;

    tm_state_enums_t::iterator states =
     tm_state_enums.find(std::wstring(mapping_.states));

    // unknown set of states
    if(states == tm_state_enums.end()) return;

    tm_parts_t::iterator part = m_class->second.find(mapping_.partid);

    // unknown part
    if(part == m_class->second.end()) return;

    // success
    part->second.states = states;
   }
 };
}

int main(int argc, char * argv[])
{
 try
 {
  struct TMSCHEMAINFO const & schema = *GetSchemaInfo();

  // build the tables of properties, classes, parts and states
  std::for_each
  (
   schema.pPropTable,
   schema.pPropTable + schema.iPropCount,
   tmdump::schema_scan()
  );

  // link parts to states
  std::for_each
  (
   tmdump::state_map,
   tmdump::state_map + sizeof(tmdump::state_map) / sizeof(tmdump::state_map[0]),
   tmdump::state_link()
  );

  ::InitCommonControls();
  ::SetThemeAppProperties(STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS);

  // dump the current values of all properties
  for
  (
   tmdump::tm_classes_t::iterator p = tmdump::tm_classes.begin();
   p != tmdump::tm_classes.end();
   ++ p
  )
  {
   const std::wstring& class_name = p->first;

   // open the theme data for the current class
   class htheme_t
   {
    public:
     HTHEME m_handle;
     
     htheme_t(HTHEME handle_): m_handle(handle_) { }
     ~htheme_t() { ::CloseThemeData(m_handle); }

     operator HTHEME() { return m_handle; }
   }
   data = ::OpenThemeData(NULL, class_name.c_str());

   // failure
   if(data == NULL)
   {
    std::fwprintf
    (
     stderr,
     L"OpenThemeData(\"%s\") failed, error %d\n",
     class_name.c_str(),
     GetLastError()
    );

    continue;
   }

   // class name
   std::fwprintf(stdout, L"%s\n", p->first.c_str());

   // dump system properties
   for
   (
    tmdump::tm_properties_t::iterator p = tmdump::tm_properties.begin();
    p != tmdump::tm_properties.end();
    ++ p
   )
   {
    switch(p->type)
    {
     case TMT_POSITION:
     case TMT_MARGINS:
     case TMT_RECT:
     case TMT_INTLIST:
      continue;
    }

    // property name
    std::fwprintf(stdout, L"\t%s = ", p->name.c_str());

    HRESULT hres;

    switch(p->type)
    {
     // string
     case TMT_STRING:
     case TMT_FILENAME: // FIXME
     {
      WCHAR buffer[256];
      if(FAILED(hres = GetThemeSysString(data, p->id, buffer, 256))) break;
      std::fwprintf(stdout, L"string: \"%s\"", buffer);
      break;
     }

     // integer
     case TMT_INT:
     {
      int val;
      if(FAILED(hres = GetThemeSysInt(data, p->id, &val))) break;
      std::fwprintf(stdout, L"int: %d", val);
      break;
     }

     // boolean
     case TMT_BOOL:
     {
      SetLastError(0);
      BOOL val = GetThemeSysBool(data, p->id);
      if(FAILED(hres = GetLastError())) break;
      std::fwprintf(stdout, L"bool: %s", val ? L"true" : L"false");
      break;
     }

     // color
     case TMT_COLOR:
     {
      SetLastError(0);

      COLORREF val = GetThemeSysColor(data, p->id);

      if(FAILED(hres = GetLastError())) break;

      std::fwprintf
      (
       stdout,
       L"rgb: %d, %d, %d",
       GetRValue(val),
       GetGValue(val),
       GetBValue(val)
      );

      break;
     }

     // size
     case TMT_SIZE:
     {
      SetLastError(0);
      int val = GetThemeSysSize(data, p->id);
      if(FAILED(hres = GetLastError())) break;
      std::fwprintf(stdout, L"size: %d", val);
      break;
     }

     // font
     case TMT_FONT:
     {
      LOGFONTW val;
      if(FAILED(hres = GetThemeSysFont(data, p->id, &val))) break;
      std::fwprintf(stdout, L"font: %s", val.lfFaceName);
      break;
     }

     // enumerated integer
     case TMT_ENUM:
     {
      int val;
      if(FAILED(hres = GetThemeSysInt(data, p->id, &val))) break;

      std::fwprintf(stdout, L"enum(%s): ", p->enum_type->first.c_str());

      tmdump::tm_enum_t::iterator enumval = p->enum_type->second.find(val);

      if(enumval == p->enum_type->second.end())
       std::fwprintf(stdout, L"<%d>", val);
      else
       std::fwprintf(stdout, L"%s", enumval->second.c_str());

      break;
     }
    }

    if(FAILED(hres)) std::fwprintf(stdout, L"<error %08X>", hres);

    std::fputwc(L'\n', stdout);
   }

  }
 }
 catch(std::exception e)
 {
  std::cerr << e.what() << std::endl;
  return EXIT_FAILURE;
 }

 return EXIT_SUCCESS;
}

// EOF

⌨️ 快捷键说明

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