如何处理WM_NCCALCSIZE并制作类似chrome的界面?

时间:2011-01-28 01:19:14

标签: c++ winapi visual-c++ user-interface google-chrome

我目前正在使用谷歌浏览器作为我的主浏览器。我想知道开发人员如何放置自定义标题栏,因为我想将其合并到我自己的应用程序中。

如果你们不知道我在说什么,这是一张图片:

Screenshot

我发现了一篇关于界面的文章,其中包括:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/33870516-9868-48d3-ab53-6269d9979598

但是,我不知道该怎么做。我目前正在使用VC ++ Express。任何人都可以给我一步一步的指示,以及如何获得这样的界面?除了我不希望标签在顶部。

我在Win32中写这个。

2 个答案:

答案 0 :(得分:3)

如果内存服务,你需要处理的事件不是WM_NCCALCSIZE,而是WM_NCHITTEST和WM_NCPAINT。

当光标位于标题栏上时,WM_NCHITTEST告诉系统,因此您需要取一个光标位置并确定它是否在您认为“标题栏”的区域上方。特别是,如果用户在此区域中单击并拖动光标,则会拖动整个窗口。

WM_NCPAINT就像WM_PAINT一样,除了非客户区域 - 也就是说,当你需要为标题栏(和窗口边框,如果内存服务)实际绘制任何内容时。

我应该补充一点,我很久没有玩过这个了。我现在几乎肯定不记得了。

答案 1 :(得分:3)

好的,答案很简单:

Chomre根本不使用Windows内置功能来绘制框架边框,标题栏,标题栏按钮等。

当您调用GetWindowRect(hChromeWindow)和GetClientRect(hChromeWindow)时,您会注意到矩形是相同的。这意味着Chrome会关闭所有用于绘制边框的Windows功能(只需在WM_NCCALSIZE中返回0而不执行任何其他操作)然后将所有内容绘制到客户端区域。

因此,在WM_PAINT中,他们一起绘制标题栏和窗口的上半部分(URL栏,标签等)。在WM_NCPAINT中,他们什么都不做。

这不是常用的方法,但最简单,而且是防弹。

顺便说一句:Java应用程序也是如此。