自定义最小最大closuresbutton实现

我正在使用普通的C ++(没有MFC)来实现一个应用程序。 我想添加自定义的最小/最大/closuresbutton

下面的代码是我用过的。 对于HTCAPTION和其他边界相关的定义工程就像一个魅力,但我无法获得HTMINBUTTON,HTMINBUTTON,HTCLOSE以相同的方式工作。 还有什么需要执行的NCHITTEST生效?

// Defining min/max/close if ((px > rt.right - 130) && (px < rt.right - 104) && (py > 41) && (py < 67)) return HTMINBUTTON; else if ((px > rt.right - 100) && (px < rt.right - 74) && (py > 41) && (py < 67)) return HTMAXBUTTON; else if ((px > rt.right - 70) && (px < rt.right - 44) && (py > 41) && (py < 67)) return HTCLOSE; // Defining window border and caption else if ((px > EDGE) && (px < rt.right-EDGE) && (py > EDGE) && (py < rt.bottom-EDGE)) return HTCAPTION; else if (px <= EDGE && py <= EDGE) return HTTOPLEFT; else if (px <= EDGE && py >= rt.bottom - EDGE) return HTBOTTOMLEFT; else if (px >= rt.right - EDGE && py <= EDGE) return HTTOPRIGHT; else if (px >= rt.right - EDGE && py >= rt.bottom - EDGE) return HTBOTTOMRIGHT; else if (px <= EDGE) return HTLEFT; else if (px >= rt.right - EDGE) return HTRIGHT; else if (py <= EDGE) return HTTOP; else if (py >= rt.top - EDGE) return HTBOTTOM; else return DefWindowProc(hWnd, message, wParam, lParam); 

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

编辑:我忘了补充说,返回HTMAX / HTMIN / HTCLOSE不会导致窗口反应。 从WM_NCHITTEST返回的值在其他消息的WPARAM中发送,特别是WM_NCLBUTTONDOWN和WM_NCLBUTTONUP。 不幸的是,WM_NCLBUTTONUP消息没有得到正确的发送,因为当你点击标题栏时,它会捕获鼠标。

我有一个适合我的解决方案。 这是我的重现步骤

1. WM_NCHITTEST

订阅WM_NCHITTEST。 现在你必须处理消息并返回你的测试结果。

这可以帮助你: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx

对我来说,我在表单上创建了几个区域。 TopLeft,Top,TopRight,Caption,Left,Right,BottomLeft,Bottom,BottomRight,MinButton,MaxButton,CloseButton

他们每个人都是一个矩形在我的形式定义一个区域。 我只是检查鼠标光标是否在这些区域之一,并返回正确的HT-CODE。

2. WM_NCLBUTTONDOWN

现在订阅WM_NCLBUTTONDOWN。 检查WPARAM是否要处理一个NCHITTEST值。 为了最小化按钮检查HTMINBUTTON(0x0008)

但在这里,我只是返回IntPtr.Zero的结果。 这表明我已经处理了这个消息。

3. WM_NCLBUTTONUP

之后订阅WM_NCLBUTTONUP。 检查WPARAM的目标NCHITTEST值,并在这里做你想做的事情。

我会稍后上传我的源代码!