滚动子窗口“溢出”到父窗口

Posted

技术标签:

【中文标题】滚动子窗口“溢出”到父窗口【英文标题】:Scrolling a child window "overflows" to the parent window 【发布时间】:2017-05-19 14:03:11 【问题描述】:

我有一个父窗口和一个子窗口,例如:

class CChildDlg : public CDialog

    ...


class CParentDlg : public CDialog

    CChildDlg m_cChildDlg;
    ...

在父级的OnInitDialog函数中,我创建了子窗口:

m_cChildDlg.CreateEx(0,
                     WC_STATIC,
                     NULL,
                     WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|SS_NOTIFY,
                     0,0,width,height,
                     this,
                     0);

我可以使用m_cChildDlg.ScrollWindow(xAmount, yAmount)轻松滚动子窗口。

问题是我在子窗口正上方的父窗口中有一些其他控件(工具栏等),向上滚动时子窗口会“覆盖”这些控件。

我尝试调用SetWindowPos 以将子窗口设置在其他控件之后,但这似乎没有任何区别。

这是 MSDN 关于这两个功能的说法:

ScrollWindow SetWindowPos

但我无法找到与此问题相关的任何内容,所以我猜这里可能还缺少其他内容。

谢谢。

【问题讨论】:

请贴出调用ScrollWindow()的代码,我猜你没有或错误地使用了参数lpClipRect @zett42:完成。我只传递xAmountyAmount,而将其他两个参数保留为默认值(两者都是NULL)。谢谢。 【参考方案1】:

您没有将剪辑矩形(参数lpClipRect)传递给ScrollWindow()。来自reference:

如果 lpClipRect 为 NULL,则不会对滚动执行剪辑 矩形。

这就是你得到溢出的原因。

你可以这样修复它:

CRect rc; 
m_cChildDlg.GetClientRect(rc);
m_cChildDlg.ScrollWindow(xAmount, yAmount, nullptr, rc);

【讨论】:

太好了,这部分解决了我的问题。子窗口确实不会“覆盖”任何父窗口内容。不幸的是,我仍然遇到子窗口内容全部涂抹的问题。就像,刚刚滚动出来的部分仍然是画的。你能猜出这可能是什么原因吗?谢谢!!! @goodvibration 来自参考:应用程序最终将收到一条 WM_PAINT 消息,通知它该区域需要重新绘制。要在滚动完成的同时重新绘制未覆盖区域,请在调用 ScrollWindow 后立即调用 UpdateWindow 成员函数。 是的,我已经阅读并在询问之前尝试过。这里没有运气。 @goodvibration 你有用于子窗口的自定义 WM_PAINT 或 WM_ERASEBKNGD 处理程序吗? @goodvibration 解决了原始问题后,我建议为剩余问题创建一个新问题。

以上是关于滚动子窗口“溢出”到父窗口的主要内容,如果未能解决你的问题,请参考以下文章

将子窗口停靠到父窗口

SetFocus 到父窗口,然后回到子窗口

Qt 子窗口内嵌到父窗口中

MFC怎么把子窗口嵌入到父窗口中

在不关闭子窗口的情况下从子窗口返回焦点到父窗口(在mfc visual studio中)

QT开发_弹出窗口禁用父窗口并移动到父窗口中心位置