gpt4 book ai didi

c++ - 如何避免 CScrollView 移动时出现闪烁?

转载 作者:行者123 更新时间:2023-11-28 05:22:18 28 4
gpt4 key购买 nike

我试图让 CScrollView 移动

虽然移动成功了,但是我发现了一个问题……

CScrollView 移动时随机闪烁。

下面是我的项目的全部代码:

#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

class MyView : public CScrollView
{
public:
void OnDraw(CDC *aDC){
CRect rc;
GetClientRect(&rc);

aDC->FillSolidRect(&rc, RGB(0,0,255));
}

BOOL PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_BORDER;
return CScrollView::PreCreateWindow(cs);
}

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
CSize DCSize(200, 800);

SetScrollSizes(MM_TEXT, DCSize);
return 0;
}


DECLARE_DYNCREATE(MyView)
DECLARE_MESSAGE_MAP()
};

IMPLEMENT_DYNCREATE(MyView, CScrollView)

BEGIN_MESSAGE_MAP(MyView, CScrollView)
ON_WM_CREATE()
END_MESSAGE_MAP()

class CMainDlg : public CDialog
{
public:
CMainDlg(CWnd* pParent = NULL);

enum { IDD = IDD_MAIN_DIALOG };

CWnd* pFrameWnd;
CCreateContext context;
MyView* pView;
int time;

virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT_PTR timer);

void OnPaint(){
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
dc.FillSolidRect(&rc,RGB(255,187,187));
}


DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
ON_WM_TIMER()
ON_WM_PAINT()
END_MESSAGE_MAP()


CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMainDlg::IDD, pParent)
{
}


BOOL CMainDlg::OnInitDialog()
{
CDialog::OnInitDialog();

pFrameWnd = this;
context.m_pCurrentDoc = NULL;
context.m_pNewViewClass = RUNTIME_CLASS(MyView);

pView = (MyView*)((CFrameWnd*)pFrameWnd)->CreateView(&context);
pView->ShowWindow(SW_SHOW);

time = 0;
SetTimer(1, 1, 0);
return TRUE;
}

void CMainDlg::OnTimer(UINT_PTR timer)
{
if(timer == 1){
if(time > 300){
KillTimer(1);
return;
}
pView->MoveWindow(CRect(time,10,time+300,200),FALSE);
}
time+=1;
Invalidate(FALSE);
}
class MyApp : public CWinApp
{
public:
BOOL InitInstance()
{
CWinApp::InitInstance();

CMainDlg Frame;

Frame.DoModal();

return true;
}
} a_app;

不知道为什么CScrollView在移动的时候会闪烁。谁能解决这个问题?

最佳答案

它闪烁是因为您要使整个窗口无效。这会导致一个 WM_ERASE,它使窗口空白,然后是一个 WM_PAINT,它重绘整个窗口。您将 FALSE 作为 bRepaint(最后一个)参数传递给 MoveWindow,这样它就不会在窗口之后重绘任何必要的窗口区域已移动。

通常,当窗口移动时,内容也会随之移动,唯一需要重绘的部分是屏幕外或另一个窗口下的位。传递 TRUE 作为最后一个参数将导致仅重绘窗口的这些区域,这将避免闪烁。

关于c++ - 如何避免 CScrollView 移动时出现闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41231287/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com