Delphi中如何截获VC++传递的HBitmap,生成Bitmap文件。(300分)

  • 主题发起人 主题发起人 hxg
  • 开始时间 开始时间
H

hxg

Unregistered / Unconfirmed
GUEST, unregistred user!
VC++的截图生成HBitmap句柄,需要由Delphi(Dll)来处理,输出为Bitmap文件。
但在传递HBitmap时失败报错。
据跟踪:vc++中Hbitmap的值为“0x60051049”,好象是指针,
而Delphi中Hbitmap的值为“1208290785”,是整数,所以Delphi中的
bitmap.handle:=hbmp; (//hbmp为vc中的hbitmap。)发生报错。
如何解决。
Delphi如果句柄获得成功,如何生成Bitmap文件。下面的代码可行吗?

谢谢!!!!!!

我的Delphi代码:
type
pJpegInfo=^TJpegInfo;
TJpegInfo=record
hbmp:HBitmap;
FileName:array[0..255] of char;
ImgQuality:integer;
end;

function HBitmapToJpeg(var AJpegInfo:TJpegInfo):boolean;stdcall;

implementation

function HBitmapToJpeg(var AJpegInfo:TJpegInfo):boolean;
var
bm : TBitmap;
strFileName : string;
begin
result := True;
try
bm := TBitmap.Create;
try
bm.HandleType:=bmDIB;
bm.Handle :=AJpegInfo.hbmp; ////‘报错了’
//,AJpegInfo在VC++中初始化的参数。
strFileName :=StrPas(AJpegInfo.FileName);
showmessage(strFileName);
bm.SaveToFile(strFileName);
except
bm.Free;
result := False;
end
finally
bm.Free;
end;
 
我看了一下,好像挺复杂的,可能是我不得要领的缘故:)
var
ds: TDIBSection;
bih: TBitmapInfoHeader;
begin
GetObject(Bitmap, SizeOf(ds), @ds);
bih := ds.dsbmih;
bih.biBitCount := ds.dsbm.bmBitsPixel * ds.dsbm.bmPlanes;
bih.biPlanes := 1;
...// 不知道了:(
end;
 
呵呵,前几天看 DX 时找到点提示,你试一试:

function HBmpToTBmp(hbm: HBitMap): TBitmap;
var
hdcSrc: HDC;
bm: BITMAP;
Wd, Ht: Integer;
begin
GetObject(hbm, SizeOf(bm), @bm);
Wd := bm.bmWidth;
Ht := bm.bmHeight;
hdcSrc := CreateCompatibleDC(0);
SelectObject(hdcSrc, hbm);
Result := TBitmap.Create;

BitBlt(Result.Canvas.Handle, 0, 0, Wd, Ht,
hdcSrc, 0, 0, SRCCOPY);
end;
 
看看能不能通过剪切板传递数据
 
问题解决了,
改用参数HBitmapToJpeg(hbm:HBitmap;AFileName:PChar;AImageQuality:integer):boolean;stdcall
后bm.Handle:=hbm不报错了。
和原来的参数只有两个地方不同,不再传递结构和按引用传递就成功了,不知为什么。
不管怎么样,要谢谢大家了。
 
多人接受答案了。
 
后退
顶部