Winapi “滚动子窗口”;“溢出”;转到父窗口

Winapi “滚动子窗口”;“溢出”;转到父窗口,winapi,mfc,Winapi,Mfc,我有一个父窗口和一个子窗口,类似于: class CChildDlg : public CDialog { ... } class CParentDlg : public CDialog { CChildDlg m_cChildDlg; ... } 在父级的OnInitDialog函数中,我创建了子窗口: m_cChildDlg.CreateEx(0, WC_STATIC, NULL,

我有一个父窗口和一个子窗口,类似于:

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\cchildlg.ScrollWindow(xAmount,yAmount)
轻松滚动子窗口

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

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

以下是MSDN对这两个功能的说明:

但是我还没有找到任何与这个问题相关的东西,所以我猜这里可能还遗漏了一些东西


谢谢。

您没有将剪辑矩形(参数
lpClipRect
)传递到
滚动窗口()。从:

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

这就是为什么你会得到溢出

您可以这样修复它:

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

请发布调用
ScrollWindow()
的代码,我猜您没有或没有正确使用参数
lpClipRect
@zett42:Done。我只传递
xAmount
yAmount
,而将其他两个参数保留在它们的默认值中(它们都是
NULL
)。谢谢。太好了,这部分解决了我的问题。子窗口确实不会“覆盖”任何父窗口内容。不幸的是,我仍然有一个问题,孩子的窗口内容都被弄脏了。就像,刚才滚动出来的部分仍然是油漆的。你能猜出原因是什么吗?谢谢你@来自引用的goodvibration:应用程序最终将收到一条WM_PAINT消息,通知它该区域需要重新绘制。要在完成滚动的同时重新绘制未覆盖的区域,请在调用ScrollWindow后立即调用UpdateWindow成员函数。是的,我已经读过了,并在询问之前尝试过。这里运气不佳。@goodvibration是否有自定义的WM_PAINT或WM_Erasebkgd处理程序用于子窗口?@goodvibration解决了原始问题后,我建议为剩余问题创建一个新问题。