只刷新一个控件,用RedrawWindow很不划算啊,而且闪得厉害。请问如何只刷新一个控件?或是一个区域?
解决方案 »
- VC CPP文件与工作区类文件是一一对应的吗???
- ftp断点续传的资料哪里有。。。用wininet可以吗?
- 知道这里大牛多,提个比较偏门的问题 :-) 关于html表单提交方面的。
- 高分求解,VC封装OCX为DLL的问题!!!
- 怎样用程序检查代理服务器设置是否正常?
- 当鼠标移到CEdit上右击时,如何响应我自定义的事件?
- DAMAGE:After normal block(#****) 的原因?
- 如何能最快速的在VC中调用Fortran的库中的函数呢?(急用!!!)
- 请问那里可以下载TreeListView 控件?就像outlook中的那样
- 请问各位大虾,如何在CEDIT控件中实现输入时让那条竖线消失的效果?
- 为什么会导致 键盘 失灵
- 如何打开VC++工程中对话框??
To mengde007:似乎还是要刷新整个窗口。
To xsc2001:谢谢,很详细。不过这里不绘制自己的图形,不需要双缓冲绘图吧?另外BOOL CPDlg::OnEraseBkgnd(CDC* pDC)
{
if(m_bmp.GetSafeHandle() && m_nType)
{
CRect rect;
GetClientRect(rect); CDC bgDC;
bgDC.CreateCompatibleDC(NULL);
bgDC.SelectObject(&m_bmp); BITMAP bmp;
m_bmp.GetBitmap(&bmp);
int nWidth = bmp.bmWidth;
int nHeight = bmp.bmHeight; switch(m_nType)
{
case BITMAP_CENTER:
CPDlg5::OnEraseBkgnd(pDC);
BITMAP bmp;
m_bmp.GetBitmap (&bmp);
pDC->BitBlt ((rect.Width() - bmp.bmWidth) / 2, (rect.Height() - bmp.bmHeight) / 2, bmp.bmWidth, bmp.bmHeight, &bgDC, 0, 0, SRCCOPY);
return TRUE;
case BITMAP_STRETCH:
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &bgDC, 0, 0, nWidth, nHeight, SRCCOPY);
return TRUE;
default:
CBrush bgBrush(&m_bmp);
pDC->FillRect(rect,&bgBrush);
return TRUE;
}
}
else
CPDlg::OnEraseBkgnd(pDC); return TRUE;
}这里没有return CWnd::OnEraseBkgnd(pDC),可是依然闪烁啊。
概括一下就是不重叠,不刷新整个对话框(闪烁尽量不明显,CPU开销也小)
)。
void CPDlg::Refresh()
{
RECT r;
SetRect(&r , 0 , 0 , 40 , 40 );
InvalidateRect(&r,TRUE);
UpdateWindow();
}用SPY++可以接收到WM_PAINT消息,那么OnPaint函数中应该做些什么呢?
SetRect( &r, 20, 80, 150, 90 );
RedrawWindow(&r);
这样可以刷新指定区域了,可是这个坐标很难准确获得。
MSDN上说void SetRect(int x1,int y1,int x2,int y2 )x1
Specifies the x-coordinate of the upper-left corner.
y1
Specifies the y-coordinate of the upper-left corner.
x2
Specifies the x-coordinate of the lower-right corner.
y2
Specifies the y-coordinate of the lower-right corner. 我这里Static控件左上角坐标是(20,80),长130,高10
按照VC里头显示的控件的坐标刷新,发现该刷新的没刷新,不该刷新的在刷新(闪烁)。
这个坐标究竟如何确定?