Visual c++ 如何在子窗口中重新绘制UI?

Visual c++ 如何在子窗口中重新绘制UI?,visual-c++,mfc,Visual C++,Mfc,我正在创建一个子窗口,通过滚动条移动UI。 UI引用滚动条的位置并运行MoveWindow() 我希望在运行UpdateWindow()时重新绘制UI,但会留下后像。 重画的正确方法应该是什么 父窗口 BOOL CScrollWindowDlg::OnInitDialog() { CDialogEx::OnInitDialog(); InnerWindow* inwin = new InnerWindow(); inwin->Create(NULL, NULL, W

我正在创建一个子窗口,通过滚动条移动UI。 UI引用滚动条的位置并运行MoveWindow()

我希望在运行UpdateWindow()时重新绘制UI,但会留下后像。 重画的正确方法应该是什么

父窗口

BOOL CScrollWindowDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    InnerWindow* inwin = new InnerWindow();
    inwin->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, CRect(50, 50, 600, 450), this, NULL);
    inwin->Init();

    return TRUE;
}
子窗口

#pragma once
#include <afxwin.h>
#include <memory>

class InnerWindow : public CWnd
{
public:
    InnerWindow();
    ~InnerWindow();

    void Init();

protected:
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    DECLARE_MESSAGE_MAP()

private:
    std::unique_ptr<CStatic> m_label;
    SCROLLINFO m_scrollinfo;
};

#pragma一次

#包括您没有在此处为
InnerWindow
指定窗口类:

inwin->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, CRect(50, 50, 600, 450), this, NULL);
没有人画那个窗口,也没有人擦去它的背景

如果您对该窗口没有任何特殊需求,我将只使用
静态

inwin->Create(L"STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, CRect(50, 50, 600, 450), this, NULL);

为什么要在
pScrollBar
中检查null ptr?添加此选项是为了区分其他CScrollBar控件(非null)和窗口滚动条(null)。此示例不是必需的。@Evan.Titer-我的建议仍然有效-对窗口类使用
STATIC
当我将其设置为STATIC时,滚动条停止工作。我想用滚动条移动UI。@Evan.Titer-右,“静态”会阻止一切。如果您使用L“BUTTON”类,您可以看到它是如何工作的,但您确实应该定义自己的。成功!我将WNDCLASS设置为创建方法。
inwin->Create(L"STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, CRect(50, 50, 600, 450), this, NULL);