我想用MFC自绘一个窗口的标题栏。所以我重写了CMainFrame的OnNcPaint()方法。一切似乎都没问题,直到我点击控制菜单中的项目使其最小化或最大化。在缩小或最大化过程中,我可以看到原始标题栏出现。我不知道为什么会这样。也许有一些我在这个过程中没有处理过的消息?需要你的帮助。非常感谢!
答案 0 :(得分:2)
在最小化/最大化过程中?听起来像是最小/最大动画。您可以通过“我的电脑”禁用动画来验证这一点>属性>高级> (性能)设置。
至于标题问题,您将获得WM_SIZE。请查看CWnd::OnSize的文档。
CMyDialog::OnSize(UINT nType, int cx, int cy)
{
switch (nType)
{
case SIZE_MAXIMIZED:
// window was maximized
break;
case SIZE_MINIMIZED:
// window was minimized
break;
case SIZE_RESTORED:
// misleading - this occurs when restored from minimized/maximized AND
// for normal size operations when already restored
break;
default:
// you could also deal with SIZE_MAXHIDE and SIZE_MAXSHOW
// but rarely need to
break;
}
}
答案 1 :(得分:0)
您可以使用Spy ++查看窗口收到的消息。我对OnSize的模糊记忆比我预期的一些消息要早。
答案 2 :(得分:0)
之前调用OnShow。 OnSize是在...之后调用的
我认为值为SW_MAXIMIZE
和SW_MINIMIZE
..
还有一种方法可以让你的应用程序不关心Windows中的动画设置。
有一种关于在最小化时将应用程序添加到系统托盘的技巧,这将令人惊讶地覆盖了绘图。我用它已经好几年了,但是如果你能找到它,你就会变得金黄。
答案 3 :(得分:0)
你在谈论窗口动画,对吧?窗口显示从其当前大小和位置“增长”或“缩小”到最大化大小或任务栏。
该动画的执行与窗口的外观无关。您可以调用DrawAnimatedRects
API function自行触发动画。它只是根据当前显示设置绘制一个正常的标题栏。
请注意,具有自定义标题栏的其他窗口的行为方式相同。例如,查看各种版本的Office。在最小化或最大化时,会绘制Windows标题栏,而不是客户标题栏。在调整不占用全屏的窗口时,您还可以看到异常。例如,当最大化Hearts游戏时,动画会显示窗口扩展到屏幕的整个宽度,但是当动画结束时,窗口会变窄(但仍会最大化)。
因此,要回答您的问题,不会发送任何消息。调整大小动画由窗口管理器执行,无需任何协助或来自调整大小的窗口的参与。就您的程序而言,窗口直接从原始大小变为新大小。