//protected override Size MeasureOverride(Size availableSize) //{ // bool bNeedUpdate = false; // if (m_bufferedBmp != null && m_ptOffset.X + (int)ActualWidth > ExtentWidth) // { // bNeedUpdate = true; // m_ptOffset.X = ExtentWidth - (int)ActualWidth; // if (m_ptOffset.X < 0) // m_ptOffset.X = 0; // } // if (bNeedUpdate) // { // paintArea(new GDI.Rectangle(0, 0, m_bufferedBmp.PixelWidth, m_bufferedBmp.PixelHeight)); // Invalidate(); // } // return base.MeasureOverride(availableSize); //} internal void SetHorizontalOffset(double offset) { offset = (int)offset; // 这里产生了水平滚动,识别哪些数据可以使用就只需copy一下就可以了 int OffsetX = (int)Math.Abs(m_ptOffset.X - offset); if (OffsetX < ActualWidth - 20) // 说明是可以使用部分数据的, -20是如果只有20象素宽可用的话,那也没意义了,直接刷新效率更好 { if (m_ptOffset.X < offset) { GB_GridView.Bitblt(m_bufferedBmp, new GDI.Rectangle(OffsetX, 0, (int)ActualWidth - OffsetX, (int)ActualHeight), new GDI.Rectangle(0, 0, (int)ActualWidth - OffsetX, (int)ActualHeight)); m_ptOffset.X = offset; paintArea(new GDI.Rectangle((int)ActualWidth - OffsetX, 0, OffsetX, (int)ActualHeight)); } else { GB_GridView.Bitblt(m_bufferedBmp, new GDI.Rectangle(0, 0, (int)m_bufferedBmp.PixelWidth - OffsetX, (int)m_bufferedBmp.PixelHeight), new GDI.Rectangle(OffsetX, 0, (int)m_bufferedBmp.PixelWidth - OffsetX, (int)m_bufferedBmp.PixelHeight)); m_ptOffset.X = offset; paintArea(new GDI.Rectangle(0, 0, OffsetX, (int)m_bufferedBmp.PixelHeight)); } } else { m_ptOffset.X = offset; paintArea(new GDI.Rectangle(0, 0, (int)m_bufferedBmp.PixelWidth, (int)m_bufferedBmp.PixelHeight)); } m_bufferedBmp.Lock(); m_bufferedBmp.AddDirtyRect(new Int32Rect(0, 0, m_bufferedBmp.PixelWidth, m_bufferedBmp.PixelHeight)); m_bufferedBmp.Unlock(); }
public void BitBlt(GDI.Rectangle rectSrc, GDI.Rectangle rectDest) { GB_GridView.Bitblt(m_bufferedBmp, rectSrc, rectDest); }