Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Иконка файла в SpeedButton


Автор: Alca 26.8.2008, 17:07
Иконка файла (Test.exe) в SpeedButton (размеры Glyph 16х16)?
Код

void __fastcall TfrmMain::vAssotiativeIconToXSBtn(TSpeedButton *pSBTN, const AnsiString &casFlePath) {
   //-------------------------------------
    //загружаем иконку файла exe-файла в pImageList
    TImageList *pImageList = new TImageList(NULL);

    //-------------------------------------
    //иконка
    TSHFileInfo sfInfo;
    ZeroMemory(&sfInfo, sizeof(sfInfo));
    DWORD dwImageHandle = SHGetFileInfo(casFlePath.c_str(),
                                        0,
                                        &sfInfo,
                                        sizeof(sfInfo),
                                        SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON);  //SHGFI_SMALLICON - 16x16

    if (dwImageHandle != 0) {
        pImageList->Handle      = dwImageHandle;
        pImageList->ShareImages = true;
    }
                                              
    TIcon *pIcon = new TIcon();
    pIcon->Handle      = sfInfo.hIcon;      //<<<<<<<<<<
    pIcon->Transparent = true;

    int iIconIndex = pImageList->AddIcon(pIcon);

    //-------------------------------------
    //иконка в exe
    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    pImageList->GetBitmap(iIconIndex, pBitmap);

    pSBTN->Glyph   = pBitmap;

    delete pIcon;      pIcon      = NULL;
    delete pBitmap;    pBitmap    = NULL;
    delete pImageList; pImageList = NULL;
}

Автор: THandle 26.8.2008, 18:16
Тоже самое что и тут:

http://forum.vingrad.ru/index.php?showtopic=221521&view=findpost&p=1587341 

только вместо:

Код

a.Handle := LoadImage(HInstance, 'ICON1', IMAGE_ICON, 8, 8, LR_COPYFROMRESOURCE);



вот это:

Код


 a.Handle := ExtractIcon(HInstance, 'Exename', 0);

Автор: Alca 26.8.2008, 20:17
Цитата

Код

a.Handle := ExtractIcon(HInstance, 'Exename', 0);


Если оконка большая(32x32), то грузит как есть. 
А надо чтоб грузилась маленькая (16x16).

Автор: THandle 26.8.2008, 20:41
Alca, на Delphi это выглядит так:

Код

var
  a : TIcon;
  b : TBitmap;
begin
  a := TICon.Create;
  b := TBitmap.Create;
  a.Handle := ExtractIcon(HInstance, 'D:\3\Project1.exe', 0);
  SpeedButton1.Glyph.Height := a.Height;
  SpeedButton1.Glyph.Width := a.Width;
  b.Height := a.Height;
  b.Width := a.Width;
  b.Canvas.Draw(0, 0, a);
  SpeedButton1.Glyph.Canvas.StretchDraw(Rect(0, 0, 16, 16), b);
  a.free;
  b.Free;
end;


Могу на билдер перевести, но у меня с ним проблемно smile))

Автор: Alca 26.8.2008, 22:24
THandle, спасибо. Буду знать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)