自定义非客户区域,调整大小似乎缓慢而奇怪

时间:2018-10-20 21:40:34

标签: winapi window nonclient-area

我正在尝试通过处理WM_NCPAINTWM_NCACTIVATE在窗口上绘制自己的非客户区域。问题是当我调整窗口大小时,底部和右侧边缘花费的时间太长,无法“赶上”并适应新的窗口大小。这不是慢速或效率低下的渲染代码的结果,因为即使在WM_NCPAINT处理程序完全为空的情况下也会发生。

如果我在处理程序中调用DefWindowProc,或者根本不处理NCPAINT,这种奇怪的行为就会停止,并且在调整窗口大小时,右下角完全不会移动。 / p>

我尝试在NCPAINT处理程序中强制执行窗口更新,但是问题并没有消失。

Here,您可以看到我在说什么。只需忽略由于缺少窗框而造成的丑陋外观。在演示中,WM_NCPAINT处理程序中没有绘图代码,它只是向WndProc回调返回0。

我的问题是,在绘制自己的窗框后如何保持底部和右侧边缘固定,同时调整大小与普通窗口一样?

编辑

这是处理Windows消息的代码。还没有渲染代码,因为首先我要在调整大小时摆脱怪异的行为。

LRESULT CALLBACK wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_NCACTIVATE:
        case WM_NCPAINT:
        {
            // DefWindowProc(hWnd, uMsg, wParam, lParam);

            // Custom frame rendering will be done here
            return 0;
        }
    }
    return CallWindowProc(prevWmdProc, hWnd, uMsg, wParam, lParam);;
}

请注意,如果我取消注释DefWindowProc调用,则窗口在调整大小期间将开始正常运行。显然,此方法可以在大小改变时不断地更新窗口的工作区。我无权访问此方法的源代码,所以我不知道它是如何工作的。

0 个答案:

没有答案