如何解决如何在子窗口中重绘UI?
我正在创建一个子窗口,该子窗口使用滚动条移动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;
};
void InnerWindow::Init()
{
m_label = std::unique_ptr<CStatic>(new CStatic());
m_label->Create(L"Sample My Label",WS_CHILD | WS_VISIBLE,CRect(10,10,300,30),0x1010);
m_label->ShowWindow(TRUE);
ZeroMemory(&m_scrollinfo,sizeof(m_scrollinfo));
m_scrollinfo.fMask = SIF_DISABLENOSCROLL | SIF_ALL;
m_scrollinfo.nMin = 0;
m_scrollinfo.nMax = 400 * 2;
m_scrollinfo.nPage = 400;
m_scrollinfo.nPos = 0;
SetScrollInfo(SB_VERT,&m_scrollinfo);
}
void InnerWindow::OnVScroll(UINT nSBCode,CScrollBar* pScrollBar)
{
if (pScrollBar == nullptr)
{
switch (nSBCode)
{
case SB_THUMBTRACK:
m_label->MoveWindow(10,10 + nPos,290,20);
m_scrollinfo.nPos = nPos;
SetScrollInfo(SB_VERT,&m_scrollinfo);
Invalidate();
UpdateWindow();
break;
default:
break;
}
}
CWnd::OnVScroll(nSBCode,nPos,pScrollBar);
}
解决方法
您未在此处为InnerWindow
指定窗口类:
inwin->Create(NULL,NULL,WS_CHILD | WS_VISIBLE | WS_VSCROLL,CRect(50,50,600,450),this,NULL);
没有人绘制该窗口或擦除其背景。
如果您对该窗口没有任何特殊需要,我将使用STATIC
:
inwin->Create(L"STATIC",NULL);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。