滚动子窗口“溢出”到父窗口
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:完成。我只传递xAmount
和yAmount
,而将其他两个参数保留为默认值(两者都是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 解决了原始问题后,我建议为剩余问题创建一个新问题。以上是关于滚动子窗口“溢出”到父窗口的主要内容,如果未能解决你的问题,请参考以下文章