2012-01-11 2 views
4

Мне нужно захватить изображение панели.Как получить изображение панели с combobox

Проблема, с которой я сталкиваюсь, заключается в том, что если панель содержит TCombobox, текст не отображается.

Используя этот код, я бросаю на него панель с TCombobox. Затем введите значение в текстовое свойство. Я также бросаю TImage. Затем я добавляю кнопку для вызова вышеуказанного кода .

Вот результат:

Imaging of Panel Painting Problem

Есть ли лучший способ, чтобы захватить истинное изображение панели.

+0

ComboBoxes окрашены Windows, и поэтому ваша техника перенаправления (Panel.PaintTo, которая сообщает элементам управления, чтобы рисовать себя в другом месте) не будет работать. Вы можете захватить всю ФОРМУ как растровое изображение, но я не знаю пригодного метода для одной панели. Возможно, это помогает: http://www.bitwisemag.com/copy/delphi/delphi1.html –

+0

TForm.GetFormImage сталкивается с той же проблемой, это почти тот же код. Он работает, если я захватил весь экран, а затем скопировал нужный прямоугольник, но это похоже на слишком много накладных расходов. Код захвата экрана находится здесь: http://code.google.com/p/robstechcorner/source/browse/trunk/Delphi/utils/SCapture.pas –

ответ

10

Как насчет использования функций GetDC и BitBlt?

procedure AssignPanelImageToPicture(Panel : TPanel;Image : TImage); 
var 
B : TBitmap; 
SrcDC: HDC; 
begin 
B := TBitmap.Create; 
try 
    B.Width := Panel.Width; 
    B.Height := Panel.Height; 
    SrcDC := GetDC(Panel.Handle); 
    try 
    BitBlt(B.Canvas.Handle, 0, 0, Panel.ClientWidth, Panel.ClientHeight, SrcDC, 0, 0, SRCCOPY); 
    finally 
     ReleaseDC(Panel.Handle, SrcDC); 
    end; 
    Image.Picture.Assign(B); 
finally 
    B.Free; 
    end; 
end; 
+0

Ваша функция работает, имея проблемы с ее работой в моем контексте, но У меня есть направление, спасибо. –