我正在尝试在CF.NET中编写一个面板,允许我在内部滚动内容而不会闪烁。我以为我会尝试使用包含实际内容的另一个面板的WrapperPanel类。然后我根据滚动位置将内部面板的内容添加到包装器中。
但是bitblt对我不起作用。它只是离开目的地表面,没有明显的变化。
以下是相关代码:
protected override void OnPaint(PaintEventArgs e)
{
//Generate a proper-sized bitmap
using (Bitmap bmp = new Bitmap(ClientSize.Width, ClientSize.Height))
{
using (Graphics bgr = Graphics.FromImage(bmp))
{
//bitblt from interior panel to that bitmap
var srcDC = GetDC(_interiorPanel.Handle);
var bmDC = bgr.GetHdc();
var res = BitBlt(bmDC, 0, YOffSet, Width, Height, srcDC, 0, 0, 0x00CC0020);
System.Diagnostics.Debug.WriteLine(res);
ReleaseDC(_interiorPanel.Handle, srcDC);
bgr.ReleaseHdc(bmDC);
}
//Draw that bitmap to this panel
e.Graphics.DrawImage(bmp, 0, 0);
}
base.OnPaint(e);
}
GetDC()和GetHdc()调用都返回一个值,所以至少它们没有失败。但这与我对GDI +的故障排除知识的程度有关。有人能看出我做错了吗?
答案 0 :(得分:0)
内饰板是否隐形?屏幕外?或者是什么?从HDC获取相关数据的唯一方法是通过正常的消息泵绘制它,如果它被隐藏或屏幕外,或者你手动绘制它,你显然不会这样做。
这是了解无闪烁Win32的绝佳资源:http://www.catch22.net/tuts/flicker