【问题标题】:How to get a image of a panel with a combobox如何获取带有组合框的面板图像
【发布时间】:2012-01-11 23:45:34
【问题描述】:

我需要捕捉面板的图像。

我遇到的问题是,如果面板包含 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 Next 两个吧。然后我添加一个按钮来调用上面 代码。

结果如下:

有没有更好的方法来捕捉面板的真实图像。

【问题讨论】:

  • ComboBoxes 是由 Windows 绘制的,因此您的重定向技术(Panel.PaintTo,它告诉控件将自己绘制到另一个位置)将不起作用。您可以将整个 FORM 作为位图获取,但我不知道单个面板的可行技术。也许这有帮助:bitwisemag.com/copy/delphi/delphi1.html
  • TForm.GetFormImage 遇到了同样的问题,它几乎是相同的代码。如果我捕获整个屏幕然后复制出所需的矩形,它确实有效,但这似乎太多开销。截屏代码在这里:code.google.com/p/robstechcorner/source/browse/trunk/Delphi/…

标签: delphi delphi-xe image-capture


【解决方案1】:

如何使用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;

【讨论】:

  • 您的功能有效,但在我的上下文中无法正常工作,但我有一个方向,谢谢。
猜你喜欢
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多