Нарисуйте изображение с функциями GDI - PullRequest
0 голосов
/ 27 января 2010

У меня есть загруженное приложение для мобильных устройств. Каждый раз, когда изображение успешно загружается, оно автоматически рисует временное растровое изображение, а затем метод onPaint рисует все временное растровое изображение. Это вызвало много мерцаний.

Мой инструктор посоветовал мне использовать функции GDI для рисования временного растрового изображения на экране каждый раз, когда загружается одно изображение. Но его предложение настолько общее с двумя методами.

    [DllImport("coredll.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("coredll.dll")]
    static extern void ReleaseDC(IntPtr dc);

Значит, есть более четкий совет для меня в этой ситуации в том, что он предложил? Заранее спасибо.

UPDATE

    //This is my buffer bitmap
    private Graphics offGraph;
    private Bitmap offBitmap;

    //everytime an image is loaded, it raise an event and then I draw it on buffer.
    private void ImageLoadDone(object sender, EventArgs e)
    {
        ImageObj LoadedImg = (ImageObj)sender;
        LoadedImg.Render(offGraph);
        this.BeginInvoke(new EventHandler(ImageUpdate));
    }

    private void ImageUpdate(object sender, EventArgs myE)
    {
        this.Render();
    }

    //and then onPaint draw the offbitmap.
     private void Render()
    {
       CtrlGraph.DrawImage(offBitmap,0,0);
    }

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Да - вам нужно сделать двойную буферизацию, чтобы предотвратить проблему мерцания, но вы можете сделать это в GDI +, не прибегая к API.Вот что вам нужно сделать:

private Bitmap backgroundBitmap;
private Graphics backgroundGraphics;
private Rectangle rect;
private Rectangle srcRect;

// create background bitmap the same size as your screen
backgroundBitmap = new Bitmap(this.Width, this.Height);
// create background buffer
backgroundGraphics = Graphics.FromImage(backgroundBitmap);
// get current screen graphics
g = this.CreateGraphics();

rect = new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);
srcRect = new Rectangle(0, 0, bmp.Width, bmp.Height);


Then when you receive your event and need to update the screen, call your own method:

Render();

private void Render()
    {            
        // draw your image onto the background buffer
        backgroundGraphics.DrawImage(bmp, rect, srcRect, GraphicsUnit.Pixel);
        // draw whatever you need to on the background graphics
    backgroundGraphics.DrawImage(.....)


        // after all images are drawn onto the background surface
        // blit back buffer to on the screen in one go
        g.DrawImage(backgroundBitmap, this.ClientRectangle,
            new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height), GraphicsUnit.Pixel);

    }

НЕ вызывайте this.Refresh () или событие рисования, когда вы пытаетесь обновить экран, так как именно это вызывает мерцание, просто вызовМетод Render () напрямую, когда вам нужно обновить экран.Вы просто вызываете метод Paint, когда экран впервые отображается, когда приложение загружается

. Я взял этот код из своей компактной фреймворковой игры

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

IIRC, и если ваши теги верны, если вы используете C #, то вы можете использовать GDI +. GDI происходит от Win32 и по сути является наследием WinForms.

Проверьте это для получения информации о GDI + .

И, кстати, мерцание, которое вы описываете, звучит как продукт отсутствия двойной буферизации. Прочитайте здесь , чтобы узнать, как создать двойной буфер для ваших форм.

...