Как получить изображение панели с помощью выпадающего списка - PullRequest
5 голосов
/ 12 января 2012

Мне нужно сделать снимок панели.

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

procedure AssignPanelImageToPicture(Panel : TPanel;Image : TImage);
var
 B : TBitmap;
begin
 B := TBitmap.Create;
 try
   B.Width := Panel.Width;
   B.Height := Panel.Height;
   B.Canvas.Lock;
   Panel.PaintTo(B.Canvas.Handle,0,0);
   B.Canvas.Unlock;
   Image1.Picture.Assign(B);
  finally
    B.Free;
  end;
end;

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

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

Imaging of Panel Painting Problem

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

1 Ответ

11 голосов
/ 12 января 2012

Как насчет использования функций 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;
...