怎样在TImage控件中显示16X16大小的ICON?(100分)

  • 主题发起人 主题发起人 阿权
  • 开始时间 开始时间

阿权

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ExtractIcon函数可以取到32X32的ICON,但不知
怎样得到16X16的ICON。是不是有这方面的API函数?
如果要自己转换,算法如何?
 
你的标题是怎样在TImage中显示ICON, 但是实质内容是如何ExtractIcon
对于在TImage中显示Icon是很简单, 只要用 LoadFromFile 就行了, 至于
ExtractIcon 可以试试用 ExtractIconEx 代替 ExtractIcon, 可以同时
得到大小两个 Icon

function ExtractIconEx( lpszFile: PChar;
nIconIndex: Integer;
var phiconLarge, phiconSmall: HICON;
nIcons: UINT): UINT; stdcall;
 
好象不行,Delphi说找不到ExtractIconEx函数,Win32.hlp
中也找不到?
 
ExtractIconEx 函数在 delphi 的 source/vcl/win/ShellApi.pas 文件中
(Delphi 2.0, 3.0, 4.0)
如果 不想引用 ShellApi 可以直接在你的 Unit 的 Interface 段加入:

function ExtractIconEx(lpszFile: PChar; nIconIndex: Integer;
var phiconLarge, phiconSmall: HICON; nIcons: UINT): UINT; stdcall;

在 Implementation 段中加入:

function ExtractIconEx; external shell32 name 'ExtractIconEx';
 
ExtractIconEx 在 Delphi(2.0, 3.0, 4.0) 的 source/vcl/win/ShellApi.pas
中声明, 若不想引用 ShellApi.pas 可以直接写入你的 Unit 中:

Interface
...
function ExtractIconEx(lpszFile: PChar; nIconIndex: Integer;
var phiconLarge, phiconSmall: HICON; nIcons: UINT): UINT; stdcall;
...

Implementation

function ExtractIconEx; external shell32 name 'ExtractIconExA';
 
我用下面程序试了:

procedure TForm1.FormActivate(Sender: TObject);
var
t1,t2:HIcon;
begin
ExtractIconEx('c:/pwin95/notepad.exe',0,t1,t2,2);
Image1.Picture.Icon.Handle := t1 ;
Image2.Picture.Icon.Handle := t2 ;
end;

Image2和Image1显示内容明显有区别,但大小却
一样,都是32X32,怎么将Image2显示成16X16?
 
可以试一试 Windows.pas 中的API函数:
function DrawIconEx(hdc: HDC; xLeft, yTop: Integer; hIcon: HICON;
cxWidth, cyWidth: Integer; istepIfAniCur: UINT;
hbrFlickerFreeDraw: HBRUSH; diFlags: UINT): BOOL; stdcall;
hdc

参数为:
hdc -- 可以是某个 Canvas.handle
xLeft,yTop -- Icon 的左上角
hIcon -- Icon 的指针
cxWidth,cyWidth -- Icon的大小, 如果此值为0且diFlags参数为
DI_DEFAULTSIZE 则用 SM_CYICON or SM_CYCURSOR 系统矩阵值去设置width,
如果此值为0且没用DI_DEFAULTSIZE, 则该函数使用Icon的实际大小
istepIfAniCur -- 动画光标的帧索引, 对于非动画光标此参数被忽略
hbrFlickerFreeDraw -- 背景画笔, 如果以非空的 hbrBkgnd 为画笔则系统使用
屏幕背景作为画笔, 如果 hbrBkgnd 指针为 nil 则直接将icon画到设备上
diFlags -- drawing flags 可以是下列值之一:
Value Meaning
DI_COMPAT -- using the system default image
DI_DEFAULTSIZE -- width and height by system metric
DI_IMAGE -- raster operation by ropImage
DI_MASK -- raster operation by ropMask
DI_NORMAL -- 混合DI_IMAGE and DI_MASK

返回值 =0 失败 <>0 成功

详细资料参见 MS SDK
 
现在可以显示16X16大小图标了,但好象不是所有的Canvas
都可以显示,比如:

ExtractIconExA('E:/PROGRAM FILES/BORLAND/DELPHI 3/BIN/DELPHI32.EXE',0,t1,t2,2);
DrawIconEx(Image2.Canvas.Handle,0,0,t2,16,16,0,0,DI_NORMAL);
Image2可以正常显示。
DrawIconEx(SpeedButton1.Glyph.Canvas.Handle,0,0,t2,16,16,0,0,DI_NORMAL);
SpeedButton的Glyph.Canvas中显示不出来。

另外,Image2显示的图标背景色怎样指定?
 
这个问题怎么还在这?

啊哈, 想把Icon画到 Speedbutton 上去, 那就不那么简单了, 因为 SpeedButton
的 Canvas 是不能够随便使用的, Delphi 绘制 SpeedButton 有一套单独的机制,
实在要自己画的话你可以定义自己的控件, 从 TDpeedButton 继承过来, 然后重写
它的 paint 方法。

Icon 是没有背景色的,它只有透明色,显示 Icon 时你可以控制用什么来替换透明
色(屏幕背景,brush 中的图像),如果要用一个特定的色彩来替代透明色,可以
将画笔设置成该颜色。
 
看在你老兄这么早来回答的份上,就把积分给你吧,不过问题还没彻底解决。
 
后退
顶部