2012-03-04 54 views
2

我正在使用普通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); 
+0

我认为这篇文章正在做类似于你在做什么:http://www.codeproject.com/Articles/3728/C-does-Shell-Part-3 – gideon 2012-03-04 04:25:23

+0

它看起来如此,但它不是C++源码。它仍然适用?我对C#不熟悉。 – 2012-03-04 06:44:48

回答

1

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

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

+0

这就是我正在做的,但正如你所说,HTMAX/HTMIN/HTCLOSE不会导致窗口反应。我需要一个解决方案。 – 2012-07-15 15:43:19

0

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

1. WM_NCHITTEST

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

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

对我来说,我的窗体上创建多个领域。 左上,上,TopRight,标题,左,右,BOTTOMLEFT,底部,BottomRight,MinButton,MAXBUTTON,CloseButton

他们每个人都为长方形定义了我的窗体的区域。我只是检查鼠标光标是否位于其中一个区域并返回正确的HT-CODE。

2. WM_NCLBUTTONDOWN

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

但在这里,我只是在结果中返回IntPtr.Zero。这表明我处理了这个信息。

3. WM_NCLBUTTONUP

之后订阅WM_NCLBUTTONUP。检查WPARAM是否符合您的目标NCHITTEST值,并在此处执行您想要的操作。

我会稍后上传我的信息!

相关问题