如何获取 Aero 风格菜单的背景颜色?
如何获取 Aero 风格菜单的背景颜色?
兄弟,我太懂你想精准还原Aero主题弹出菜单样式的执念了——你要的那个RGB(240,240,240)菜单项背景色,用GetThemeSysColorBrush()拿不到是正常的,因为这个函数取的是系统全局的通用控件颜色,而Aero菜单的背景色是属于菜单控件专属的主题部件属性,得换个姿势取才行!
给你捋捋正确的操作步骤,都是我踩过坑后摸出来的:
- 首先得先打开菜单对应的主题数据,用
OpenThemeData函数,参数传窗口句柄和主题类名L"Menu"; - 然后别用系统颜色函数了,改用
GetThemeColor,这个函数能精准获取主题里某个部件特定状态下的颜色:- 部件ID选
MENU_POPUPITEM(弹出菜单项); - 状态ID选
MPI_NORMAL(普通未选中状态); - 颜色属性选
TMT_BACKGROUND(背景色);
- 部件ID选
- 最后记得用完主题数据后用
CloseThemeData释放资源,别漏了!
给你贴段实际可用的代码片段(C++):
// 假设hWnd是你的窗口句柄 HTHEME hTheme = OpenThemeData(hWnd, L"Menu"); if (hTheme != NULL) { COLORREF menuBgColor; HRESULT hr = GetThemeColor(hTheme, MENU_POPUPITEM, MPI_NORMAL, TMT_BACKGROUND, &menuBgColor); if (SUCCEEDED(hr)) { // 提取RGB值,就是你要的240,240,240 int red = GetRValue(menuBgColor); int green = GetGValue(menuBgColor); int blue = GetBValue(menuBgColor); } // 用完记得关闭主题数据 CloseThemeData(hTheme); }
要是你需要的是选中/hover状态下的菜单项背景色,只需要把状态ID换成MPI_HOT或者MPI_SELECTED就行,对应的颜色属性还是TMT_BACKGROUND,这样就能拿到对应状态的正确颜色了。
备注:内容来源于stack exchange,提问作者Ig_M
相关产品推荐
相关产品推荐

