2

popupmenu に表示するには、48x48 の .ico を好みます。

BkColor を clNone に設定すると、アイコンの見栄えが悪くなります。ImageList_GetIcon も醜いエッジを取得します。

ここに画像の説明を入力

BkColor が ClMenu に設定されている場合、アイコンはきれいですが、ハイライトするとアイコンの背景が灰色になります。

ここに画像の説明を入力

ImageList_LoadImage は .bmp に対してのみ機能するため、使用できません。

ImageList1.BkColor := clMenu;
if FileExists(filename) then
begin
    //h := ImageList_LoadImage(0, PChar(filename), 48, 48, CLR_NONE, IMAGE_ICON, LR_LOADFROMFILE);
    h := LoadImage(0, PChar(filename), IMAGE_ICON, 48, 48, LR_LOADFROMFILE);
end
else
begin
    h := ImageList_GetIcon(ImageList1.Handle, 0, ILD_NORMAL);
end;
ImageList_AddIcon(ImageList1.Handle, h);
DeleteObject(h);
4

1 に答える 1

3

今情報を見つけました。

A) 32x32 より大きいアイコンを使用するには、LoadImage 関数を使用する必要があります。

B)醜い黒縁を避けるために、実行時に ImageList_Create 関数を使用して 32 ビットの ImageList を使用します。

C)醜い白いエッジを避けるために、デザイン時の ImageList の代わりにリソースから LoadIcon 関数を使用します。

procedure TForm1.LoadICO;
var
   i: Integer;
   h: HIcon;
   folder: string;
   filename: string;
begin
   folder := GetCurrentDir + '\icon\';

   {To support alpha transparency, you need to create the ImageList and populate it at runtime}
   ImageList1.Handle := ImageList_Create(48, 48, ILC_COLOR32 or ILC_MASK, 0, ImageList1.AllocBy);

   /////////////////////////////////////////////////////////////

   filename := folder + ParamStr(i);

   if FileExists(filename) then
   begin
            //h := ImageList_LoadImage(0, PChar(filename), 48, 48, CLR_NONE, IMAGE_ICON, LR_LOADFROMFILE);   
            {ImageList_LoadImage function work only IMAGE_BITMAP}
            h := LoadImage(0, PChar(filename), IMAGE_ICON, 48, 48, LR_LOADFROMFILE);                       
            {LoadImage function work with icon bigger than 32x32}
   end
   else
   begin
            //h := ImageList_GetIcon(ImageList3.Handle, 1, ILD_NORMAL);                                    
            {Ugly when get icon from designtime ImageList}
            h := LoadIcon(hInstance, 'ICO1');                                                              
            {Pretty when load icon from resources}
   end;

   /////////////////////////////////////////////////////////////

   ImageList_AddIcon(ImageList1.Handle, h);
   DeleteObject(h);
end; 

D)醜い黒いエッジを避けるために、comctl32.dll v6 も使用して、visualstyle の滑らかなエッジを有効にします。以下の内容で xxx.exe.manifest ファイルを作成します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

E)コマンドを割り当てると、白いエッジも醜くなります。For ループと ImageList_ReplaceIcon 関数を使用する方が優れています。

//ImageList3.Assign(ImageList1);  {Assign command make ugly white edge}
h := ImageList_GetIcon(ImageList1.Handle, i, ILD_NORMAL);
ImageList_ReplaceIcon(ImageList3.Handle, i, h);
DeleteObject(h);
于 2013-09-17T11:24:15.570 に答える