纯 Win32 C++(无 WTL、MFC 等)中的自定义菜单边框
Custom menu border in pure Win32 C++ (w/o WTL, MFC, etc)
仅使用 Win32 C++(没有 WTL 或 MFC 或任何其他第三方库),如何获取自定义菜单边框?
我能够所有者绘制项目,但边框位于非客户区域,我无法找到更改它们的方法。
有办法吗?
无论你如何实现这一点,这都会是一个黑客。
一种选择是忘记 HMENU,并使用自定义的始终在顶部窗口构建自己的菜单。这可能是太多的工作,你永远不会得到一切完美。在我的头顶上,你必须处理LTR与RTL,可访问性,可配置的设置,如阴影和菜单动画(滑动/淡入淡出)。SetMenu
可能对 HWND 所做的一些事情您无法通过这样的黑客复制,但您可以通过在钢筋中实现它来回避这个问题。
如果你想继续使用HMENUs,那么你必须使用SetWindowsHookEx来查找菜单HWND。菜单类是 #32768
。然后,您可以对窗口进行子类化并覆盖 WM_NC* 和 WM_PRINT* 消息。这篇 Codeproject 文章还包含有关需要处理的未记录消息 (0x01e5) 的信息。
static bool isInitPopup = false;
switch (message)
{
case WM_INITMENUPOPUP:
{
isInitPopup = true;
break;
}
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)lParam;
if (lpDIS->CtlType == ODT_MENU)
{
auto hMenuWnd = FindWindow(_T("#32768"), NULL);
if (IsWindow(hMenuWnd)&& isInitPopup)
{
RECT rect;
::GetWindowRect(hMenuWnd, &rect);
auto menuDc = ::GetWindowDC(hMenuWnd);
::OffsetRect(&rect, -rect.left, -rect.top);
int border = 1;
rect.left = rect.left + border;
rect.top = rect.top + border;
rect.bottom = rect.bottom - border;
rect.right = rect.right - border;
HBRUSH bg = CreateSolidBrush(RGB(255,0,0));
//Rectangle(menuDc, rect.left, rect.top, rect.right, rect.bottom);
int borderThiness = 3;
::ExcludeClipRect(menuDc, rect.left+ borderThiness, rect.top+ borderThiness, rect.right- borderThiness, rect.bottom- borderThiness);
::FillRect(menuDc, &rect, bg);
DeleteObject(bg);
isInitPopup = false;
}
break;
}
在此处输入图像描述
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 调整大小的大小时,会创建自定义的Windows边框边缘消失
- 如何在涡轮C 图形中设置对象的自定义边框宽度
- 纯 Win32 C++(无 WTL、MFC 等)中的自定义菜单边框