2014-11-18 3 views
0

У меня есть приложение C#, но работа с картинкой выполняется в рамках проекта C++ (вот как это имеет).Как кэшировать изображение элемента управления?

Итак, я добавил в свое окно PictureBox и передал ручку функции рисования. Он работает нормально.

Однако, когда элемент управления недействителен (я перемещаю окно за пределы экрана, а затем перемещаю его), я получаю в результате частично пустое окно. AFAIK для этого есть два подхода: перерисовка или кеширование изображения.

Перекрашивание может быть дорогостоящим процессом (изображение не меняется часто, но обработка занимает много времени, подумайте о 3D-рендерере), поэтому я хотел бы просто кэшировать изображение.

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

+0

Если вы хотите отобразить изображение в PictureBox, почему бы не установить его свойство Image вместо его рисования на его поверхности? Это будет сохраняться и на самом деле предназначено для Picturebox! Вы можете кэшировать suface в bmp с помощью PicteureBox.DrawToBitmap() .. – TaW

+0

@TaW, потому что основная функция чертежа ничего не знает о WinForms. Это необработанный код Win32, который работает с ручками (HWND). – greenoldman

+1

Жаль, что я ошибся, а не об общей идее, но о том, как ее достичь. Поскольку пиксели сидят на поверхности, вы не можете их захватить с помощью DrawToBitmap. Вам нужно использовать 'CopyFromScreen', чтобы захватить только нужную область, а затем установить растровое изображение rsulting как изображение PB. – TaW

ответ

1

Это поможет:

Bitmap getControlSurface(Control ctl) 
{ 
    bitmap = new Bitmap(ctl.Width, ctl.Height); 

    using (Graphics g = Graphics.FromImage(bitmap)) 
    { 
     Point pScreen = PointToScreen(ctl.Location); 
     g.CopyFromScreen(pScreen, Point.Empty, ctl.Size); 
    } 
    return bitmap; 
} 

Если вы знаете, когда поверхность была обновлена ​​вы можете использовать его как это:

if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); 
pictureBox1.Image = getControlSurface(pictureBox1); 

Единственная загвоздка в том, что PictureBox на самом деле должен быть полностью видимый на экране!

+0

Большое спасибо, это действительно полезно. Я буду держать этот вопрос немного дольше открытым, если какой-то ниндзя W32 с единственным флагом :-) Надеюсь, с тобой все в порядке. – greenoldman

+0

Меня ниндзя, я не проблема ;-) – TaW

Смежные вопросы