c++ - 带有 Aero 主题(阴影)的窗口定位 - 0,0 处的窗口隐藏了一些边框

标签 c++ windows winapi mfc

我在 0,0 打开一个窗口。当 Aero 和窗口阴影被禁用时,这工作得很好。如果启用了窗口阴影,则窗口的部分边框(和标题)会隐藏在桌面左边缘的上/左上方。

有没有办法检测阴影是否打开以及我需要调整窗口位置多少像素?

我已经尝试了几乎所有 GetSystemMetrics() 可用的方法,但没有一个有意义。

最佳答案

Aero 位于窗口位置。这是一个重型应用程序兼容功能,窗口边框在很长一段时间内都具有相同的宽度。这是不可持续的,在 Vista 时代,不要将窗口边框设置为一个像素宽变得越来越重要。显示器技术不断发展,拥有 1600 x 900 分辨率的显示器(我的笔记本电脑)并不特别。将鼠标光标移动到我的垫子上以击中那个像素可以使窗口变宽。

因此,Vista 中的一个重要设计目标是创建具有漂亮宽边框的窗口。很容易敲打我的鼠标垫。

虽然这造成了一个令人讨厌的应用程序兼容性问题,但有很多软件使用 CreateWindows/Ex() 创建窗口,指定窗口的外部大小。客户区加上边框。宽边框现在是个问题,它不会使窗口变大,只会使客户区变小。不好,当您用内容和/或控件填充窗口时,客户区才是最重要的。有无数的程序期望从给定的外部窗口大小获得一定大小的客户区。截断的控件和滚动条(如果你幸运的话)将会猖獗。

Vista 程序员可以做的唯一合理的事情就是保持客户端大小并将窗口扩展到其请求的边界之外。没有应用程序要求它。当应用确实请求它时,必须伪造它,调用 GetClientRect()。

修复此行为是可能的,您必须告诉 Vista 您知道它的行为。不幸的是,这在 C++ 项目设置中不可用。你必须运行 editbin.exe/subsystem 来告诉你在后期构建事件中与 6,0 兼容。副作用是它不会再在 XP 和更早版本上运行。它不是一个明显的选项是非常非常草率的。

关于c++ - 带有 Aero 主题(阴影)的窗口定位 - 0,0 处的窗口隐藏了一些边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7004005/

相关文章:

c++ - 为什么在 Windows 上读取文件到 std::string 的长度错误?

c++ - 替代 gethostbyname

winapi - Win32 API 特有的功能?

c++ - 现代 Windows 输入 API/用户交互 API

python - IE8 自动化和 https

c++ - 当 DLL 需要比主 exe 应用程序更大的堆栈大小时怎么办?

c++ - 英特尔 TBB - Eclipse 报告多个构建错误

c++ - 向下转型和虚函数

c++ - 在 C++ 中列出目录中的所有文本文件

c++ - 内存在单行函数调用中损坏?