Панель плавной прокрутки CF.NET - битблт выходит пустым - PullRequest
1 голос
/ 10 января 2010

Я пытаюсь написать панель в CF.NET, которая позволяет мне прокручивать содержимое без мерцания. Я подумал, что попробую иметь класс WrapperPanel, который содержит другую панель с фактическим содержимым. Затем я добавлял содержимое внутренней панели в обертку в зависимости от положения прокрутки.

Но битблт не работает для меня. Он просто оставляет поверхность назначения такой, какой она была, без видимых изменений.

Вот соответствующий код:

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 +. Может кто-то видит, что я делаю не так?

1 Ответ

0 голосов
/ 10 января 2010

Внутренняя панель невидима? вне экрана? или что? Единственный способ получить релевантные данные из его HDC - это когда их раскрашивают с помощью обычного насоса сообщений, что не произойдет, если оно скрыто или за пределами экрана, или если вы вручную его раскрасите, чего вы явно не делаете.

Это отличный ресурс для изучения Win32 без мерцания: http://www.catch22.net/tuts/flicker

...