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解决了原始问题后,我建议为剩余问题创建一个新问题。