如何将位图句柄转化为位图对象(100分)

  • 主题发起人 主题发起人 Zephyr
  • 开始时间 开始时间
Z

Zephyr

Unregistered / Unconfirmed
GUEST, unregistred user!
我得到了位图句柄(hBitmap),却不能将它转化为位图对象(TBitmap),用
Bitmap.Handle := Handle 这样的方法不行。

有谁知道怎么做?
 
肯定可以,你什么地方写错了吧。
 
我是这样做的:我在程序中用TImageList.GetImageBitmap获得一个HBITMAP,然后
Image1.Picture.Bitmap.Handle := hBmp; //Image1是TImage
但Image1怎么也不能正确显示出该位图,只有在Image1左上方出现一个象素,
而Image1.Picture.Bitmap.Width和Height属性却又正常。
不知这样有没有搞错呢?
 
最好用 Bitblt 把hbitmap 画到你自己的Bitmap上去,保证万无一失.
具体参照win32 的Help
 
你把Image1的AutoSize/Stretch/Center/Transparent等属性调整一下看看?
我从来都是直接将HBITMAP赋值给Image->Picture->Bitmap->Handle。当然
我用的是BCB4。不过没有试过从ImageList得到的HBITMAP。
 
to GGCAT:用Bitblt?那Palette怎么办?用谁的呢?(我先试试看吧,谢谢)
to lhz:我想和这些属性没什么关系吧(我试过了)。从ImageList得到的HBITMAP有什么
不同吗?
 
bitbit 将采用目的方的调色板,如果两边都是TrueColor,保证没问题,如果
源是True Color ,目标是Index ,则会自动化匹配. 反之更没问题了。

什么? Index to Index ,sorry ,没试过...
 
这些属性在某些情况下是有关系的. 比如Image->Width=1,Image->Height=1时,
Image->AutoSize==false, 则它总是只能显示一个象素.

我不知道从ImageList中得到的HBITMAP有什么不同, 我从来没有用过从
ImageList中得到的HBITMAP. 我用的HBITMAP都是调用系统函数从内存块
或BMP文件生成的.
 
看样子大家对我的问题不太感兴趣啊。
我把问题说清楚些吧。

我其实是想在程序中提供这样一个功能:用户可以自行定义工具条按钮图标和菜单上的图标,
并能在退出程序时保存下来。由于工具条按钮和菜单上的图标都是用ImageList提供的,而
TImageList又没有LoadFromFile/SaveToFile或LoadFromStream/SaveToStream之类的方法,
我只好自己写代码来保存了。我原本以为用TImageList.GetImageBitmap获得一个HBITMAP,
然后把它赋给一个TBitmap对象,然后用TBitmap.SaveToStream的方法保存即可,但没想到
却遇到了上面所说的问题,被卡住了。希望各位能继续提供一点提示。若分数不够的话还
可以再加。
 
var
mybitmap: tbitmap;

begin
mybitmap:=tbitmap.create;
try
imagelist1.GetBitmap(1,mybitmap);
image1.picture.bitmap.assign(mybitmap);
image1.refresh;
finally
mybitmap.free;
end;
end;

如果是为了实现你所说的功能,
我建议你使用多个 imagelist ,
每个 imagelist 中包含有一组
你所需要的图标,到时你只要更换
工具条的 imagelist 就可以了
 
pengyt的方法可以。
 
vary simple !


b:=Tbitmap.Create;
b.handle:=AimageList.GetImageBitmap;
b.handletype:=bmDIB; //就靠它了
b.savetostream(.....

来分
 
?!
就这么简单?
Sorry,我先试试看再说。
 
>> Sorry,我先试试看再说。
Zephyr:试好没有?
 
Sorry,很久没来大富翁了。
GGCAT的方法可行,但我最后决定还是用另一种方法来解决。
 
多人接受答案了。
 
后退
顶部