c++ - 自定义最小最大关闭按钮实现

标签 c++ windows winapi

我正在使用纯 C++(没有 MFC)来实现应用程序。 我想添加自定义最小/最大/关闭按钮

下面的代码是我使用的。 对于 HTCAPTION 和其他与边框相关的定义来说,就像一个魅力, 但我无法让 HTMINBUTTON、HTMINBUTTON、HTCLOSE 以同样的方式工作。 NCHITTEST 还需要实现什么才能生效吗?

// Defining min/max/close
if ((p.x > rt.right - 130) && (p.x < rt.right - 104) &&
    (p.y > 41) && (p.y < 67))
    return HTMINBUTTON;
else if ((p.x > rt.right - 100) && (p.x < rt.right - 74) &&
    (p.y > 41) && (p.y < 67))
    return HTMAXBUTTON;
else if ((p.x > rt.right - 70) && (p.x < rt.right - 44) &&
    (p.y > 41) && (p.y < 67))
    return HTCLOSE;

// Defining window border and caption
else if ((p.x > EDGE) && (p.x < rt.right-EDGE) &&
    (p.y > EDGE) && (p.y < rt.bottom-EDGE))
    return HTCAPTION;
else if (p.x <= EDGE && p.y <= EDGE)
    return HTTOPLEFT;
else if (p.x <= EDGE && p.y >= rt.bottom - EDGE)
    return HTBOTTOMLEFT;
else if (p.x >= rt.right - EDGE && p.y <= EDGE)
    return HTTOPRIGHT;
else if (p.x >= rt.right - EDGE && p.y >= rt.bottom - EDGE)
    return HTBOTTOMRIGHT;
else if (p.x <= EDGE)
    return HTLEFT;
else if (p.x >= rt.right - EDGE)
    return HTRIGHT;
else if (p.y <= EDGE)
    return HTTOP;
else if (p.y >= rt.top - EDGE)
    return HTBOTTOM;
else
    return DefWindowProc(hWnd, message, wParam, lParam);

最佳答案

如果您要绘制程序的整个非客户端区域(即您有自定义窗口标题栏和边框),那么最好的选择是删除默认标题栏和边框并使用整个客户端区域作为您的窗口。这样,您可以使用最小/最大/退出按钮所需的图形制作自定义按钮(或所有者绘制的按钮),并将它们作为按钮控件放置在标题栏区域中。您的程序仍然会像有标题栏和边框一样运行,因为您正在处理 WM_NCHITTEST 消息。我今天刚刚用我的自定义窗口做了同样的事情,效果非常好。

编辑:我忘了补充一点,返回 HTMAX/HTMIN/HTCLOSE 不会导致窗口使用react。从 WM_NCHITTEST 返回的值在其他消息的 WPARAM 中发送,特别是 WM_NCLBUTTONDOWN 和 WM_NCLBUTTONUP。不幸的是,WM_NCLBUTTONUP 消息无法正确发送,因为当您单击标题栏时,它会捕获鼠标。

关于c++ - 自定义最小最大关闭按钮实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9552238/

相关文章:

c++ - 如果我想使用 std::shared_ptr,要包含哪个 header ?

c++ - 获取/释放通过 []-operator 访问的原子变量的语义

c# - 使用 ScheduledTasks 类删除计划作业

windows - 如何批量增加文件名? (第2部分)

c++ - PKEY_EdgeGesture_DisableTouchWhenFullscreen 未声明的标识符

c++ - 在消息映射中创建按钮和引用

windows - 用户界面的缩放(放大/缩小)行为的标准键是什么

c# - 如何在 C# 中调用 GetVirtualDiskInformation

delphi - TPageControl 选项卡区域 OnMouseEnter OnMouseLeave 事件

c++ - 在注入(inject)进程中从 DLL 调用函数