一个小程序大体是这么个样,移动时闪的很厉害 Graphics backGraph (dc.GetSafeHdc());//要传给函数的参数的构造方法void DrawBackMap(Graphics* pGraph)
{
Image* pImage=Image::FromFile(文件名);
pGraph->DrawImage(pImage,*******);
//这里画很多很多}
怎么改成双缓冲的呢
{
Image* pImage=Image::FromFile(文件名);
pGraph->DrawImage(pImage,*******);
//这里画很多很多}
怎么改成双缓冲的呢
Graphics backGraph (dc.GetSafeHdc());//要传给函数的参数的构造方法
backGraph->DrawImage(m_pCahceBmp ,.....);m_pCahceBmp 和 m_pCacheGS 最好作为类成员,但要注意尺寸调整
还是双缓存,双缓存的主要用意,一次性输出用户想看的东西,从而达到不闪的目的。你首先要得到你每次MOVE后的图象的坐标位置,然后你在内存的dc里先画好你每次拖拽后图片的样子,最后用TEXTOUT文字画在DC上,然后stretchblt或者bitblt一次性输出,这样就不闪了,而且每次都能看到固定的文字。
看到背景色出来的样子void CPicShowDlg::OnPaint()
{
CPaintDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rc;
GetClientRect(&rc); bmp.CreateCompatibleBitmap(&dc, 1000,1000);
memdc.SelectObject(&bmp);
// 创建GDI+画图对象
Graphics backGraph(memdc);
// Graphics backGraph (dc.GetSafeHdc());
if (NULL!=m_pMainDlg)
{
m_pMainDlg->DrawBackMap(&backGraph,m_paintDc);
m_pMainDlg->DrawChild(&backGraph);
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);
}
}
m_pMainDlg->DrawChild(&backGraph);
这两句如果里面有画图的动作,必定闪,你记住,画图动作执行一次才能不闪。所以你要在内存里都画完才到屏幕上画
Bitmap* pImage = new Bitmap(L"ddd.jpg");Graphic* pGraph = Graphic::FromHandle(dc.GetSafeHdc());// dc为ClientDC,非PaintDC
pGraph->DrawImage(pImage,几个另外的参数);// 目的:将原图像的指定区域的图像绘制到窗口的指定区域中, Status DrawImage(IN Image* image,
IN const Rect& destRect,
IN INT srcx,
IN INT srcy,
IN INT srcwidth,
IN INT srcheight,
IN Unit srcUnit,
IN const ImageAttributes* imageAttributes = NULL,
IN DrawImageAbort callback = NULL,
IN VOID* callbackData = NULL)
这个是函数原形之一,你看他的定义应该就明白了。
你需要做的就是在MouseMove的时候将新的红色部分计算出来,供OnPaint使用
HDC hdc = ::CreateCompatibleDC(dc);
HBITMAP hNewBitmap = ::CreateCompatibleBitmap(dc, rc.right-rc.left, rc.bottom-rc.top);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hdc, hNewBitmap);// 在hdc上绘图
Gdiplus::Graphics graphics(hdc);
只是因为窗口大小造成的重画调用么 另外楼上 JF什么意思啊
1.局部刷新。
2.重写onerasebkgnd函数
BOOL OnEraseBkgnd(CDC* pDC)
{
//AfxMessageBox("55");
if (m_bErase)
{
return CDialog::OnEraseBkgnd(pDC);
}
else
{
return TRUE;
}
}
3.初始化m_bErase为true,我的动态库有两个对话框类,其中一个是关于背景图片的,在这个OnPaint
的末尾 m_bErase重新为false.
4.因为每次加载的地图的大小不同,在从一副背景图片进入另一幅的时候,m_bErase为false,
然后再Invalidate();