告急!!!!按钮图标问题(50)

  • 主题发起人 主题发起人 ruoxi_shuai
  • 开始时间 开始时间
R

ruoxi_shuai

Unregistered / Unconfirmed
GUEST, unregistred user!
已开发的项目,想把主界面改的漂亮些,在按钮上加好看的图标,网上大多是png格式的(也特别好看),可delphi按钮好像只能加载bmp图标(不知能不能加载其他格的??)。我下了png的,再转化成bmp的放到按钮上,可是图标有白边;怎么才能让好看的图标再按钮上无损的显示???我用的是Delphi7。不胜感激!!在线等!!!
 
如果是先有 TImageList 载入的话, 可以通过 TImageList(双击) 的 Transparent Color 及 Fill Color 值来调整!
 
liuls 是不是姓刘(调侃一下);delphi用的不是太熟,前辈能说详细一些吗?
 
用SpeedButton和BitButton测试装载图片后,没有发现白边问题,当然按钮大小不可大于图片大小。
 
to:znxia 是这样的,我再网上下的256*256的png图标,用ACDSEE转化成了48*48的bmp,加载到bitbtn上,就出现了白边了。能去掉吗?
 
如果是图片中的白边,那修改图片。否则就把按钮变小一些。
 
我建议主界面你不要用button用ToolBar ,通过ToolBar添加按钮,即美观,又整齐。呵呵,它的按钮还可以添加自带图片
 
用GDI+是不是有点大材小用啊。
 
我以前也碰到过。关键一点是图片的大小一定要小于按钮,比如说。48X48,您按钮一定要60X60.
 
这个问题我也研究过好久,png图片无损的转换成bmp好多软件都可以做得到,如果想把带透明信息的bmp无损的显示在窗口上那么必须用层次窗口函数UpdateLayeredWindow显示窗口,那么图片显示很完美,只是窗口不见了,图片又无法进行交互,给你一段代码,如果有兴趣研究一下,有了答案记得告诉我怎么做(小雨哥对这有研究网上搜看他最近有没有进展):unit Unit1;// 请勿删除代码来源声明 www.01cn.net// 请勿发到 playicq . . 小雨哥{ 借花献佛,小雨哥不会见怪吧! Modified by delcomp in 05/12/2005 Envirement: Win2k Sp4+ Delphi6.0 Enterprise The two images with alpha channel were transformed from png format source picture. }interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); private Bitmap:TBitmap; procedure LayeredWindow(wnd: THandle; Bmp: TBitmap; Alpha: Byte); public procedure WMNCHitTest(var Message: TWMNCHitTest);message WM_NCHitTest; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; end;var Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);begin inherited; Message.Result := htCaption; // 获得鼠标点击移动的效果end;procedure TForm1.WMPaint(var Message: TWMPaint);begin //这个函数不会被执行!因为调用了UpdateLayeredWindow inherited;end;procedure TForm1.LayeredWindow(wnd: THandle; Bmp: TBitmap; Alpha: Byte);var Pt: TPoint; //ARect: TRect; Size: TSize; bf: TBlendFunction;begin{MSDN: UpdateLayeredWindow always updates the entire window. To update part of a window, use the traditional WM_PAINT and set the blend value using SetLayeredWindowAttributes.BOOL UpdateLayeredWindow( HWND hwnd, // handle to layered window HDC hdcDst, // handle to screen DC,If hdcDst is NULL, the default palette will be used. POINT *pptDst, // new screen position SIZE *psize, // new size of the layered window HDC hdcSrc, // handle to surface DC POINT *pptSrc, // layer position (源 DC 的 TopLeft) COLORREF crKey, // color key (透明颜色值) BLENDFUNCTION *pblend, // blend function (Alpha 混合函数) DWORD dwFlags // options (一组标志位常量,ULW_ALPHA:Alpha透明,ULW_COLORKEY:颜色透明));} //set the parameter of BlendFunction , refer to the MSDN bf.BlendOp := AC_SRC_OVER; bf.BlendFlags := 0; // 必须是 0 bf.SourceConstantAlpha := Alpha; //透明度 bf.AlphaFormat := AC_SRC_ALPHA; //GetWindowRect(wnd, ARect); Pt:= Point(0, 0); Size.cx:= Bmp.Width; Size.cY:= Bmp.Height; //对窗口设置新的扩展风格标志 SetWindowLong(wnd, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED); //调用 UpdateLayeredWindow 获得需要的异型窗口 if not UpdateLayeredWindow( wnd, GetDC(0), nil,//@ARect.TopLeft, @Size, Bmp.Canvas.Handle, @Pt, 0, @bf, ULW_ALPHA) then ShowMessage('Call Failed!');end;procedure TForm1.FormCreate(Sender: TObject);var Alpha:Byte;begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('ball.bmp'); Alpha:= 255; // 图片 Alpha 值 LayeredWindow(Handle, Bitmap, Alpha);end;procedure TForm1.FormDestroy(Sender: TObject);begin Bitmap.Free;end;procedure TForm1.Button1Click(Sender: TObject);begin close;end;procedure TForm1.FormShow(Sender: TObject);begin //在另外窗口上显示本窗口的控件。因为 UpdateLayeredWindow覆盖本窗口所有内容 Button1.Parent:= Form2; Form2.show;end;end.
 
后退
顶部