Форум » GUI » Динамическое изменение размеров иконки/картинки ? » Ответить

Динамическое изменение размеров иконки/картинки ?

Andrey: Всем привет. Столкнулся с проблемой изменения размеров иконки/картинки на кнопке. Имеется иконка + картинка одного размера в ресурсах проги. [pre2]iSanta128 ICON res\Santa128x128.ico Santa128 PNG res\santa128x128.png[/pre2] Как на базе этой иконки/картинки получить другой размер ? Есть ли какие функции в MiniGui или в FW ? В МиниГуи можно же загрузить из ресурса объект и получить его хендл: [pre2]M->hImg := LoadImage( "Santa128" )[/pre2] А хенд на кнопку как можно поместить ? И можно ли делать преобразования иконки/картинки по этому хендлу ? Я слабо разбираюсь в этой тематике, просветите пожалуйста меня.

Ответов - 28, стр: 1 2 All

Andrey: Смену иконки на кнопки в МиниГуи можно делать так: [pre2] SetProperty ( "wMain", "Btn_01" , "Icon" , cFilePath( hb_ProgName() ) + "\Res\HP.ico" ) [/pre2]А как можно сделать смену иконки через хендл загруженной иконки ? [pre2] hIcoNew := LoadImage( cFilePath( hb_ProgName() ) + "\Res\HP.ico" )[/pre2]

gfilatov2002: Andrey пишет: как можно сделать смену иконки через хендл загруженной иконки ? У меня получилось сделать таким образом в контрольном примере: [pre2]FUNCTION SetHBitmapFromhIcon( cIcon ) LOCAL hIcon, hWnd hIcon := LoadIcon( cIcon ) Form_1.Button_8.HBitmap := hIcon hWnd := GetControlHandle ( 'Button_8', 'Form_1' ) SendMessage ( hWnd, STM_SETIMAGE, IMAGE_ICON, hIcon ) RETURN NIL [/pre2]

SergKis: Есть рассогласование в выделенных местах[pre2] *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL hWnd LOCAL mVar LOCAL t, x x := _HMG_aControlFontHandle IF ISNUMERIC ( x ) .AND. !Empty ( x ) .AND. ; !( ( t := AScan ( _HMG_aControlHandles, x ) ) > 0 .AND. _HMG_aControlType [t] == "FONT" ) DeleteObject ( x ) ENDIF IF _HMG_aControlType $ "OBUTTON" .AND. !Empty( _HMG_aControlMiscData1 ) DestroyIcon ( _HMG_aControlBrushHandle ) ELSE DeleteObject ( _HMG_aControlBrushHandle ) ENDIF ... и *-----------------------------------------------------------------------------* STATIC FUNCTION _SetGetImageHBitmap ( ControlName , ParentForm , hBitmap ) *-----------------------------------------------------------------------------* LOCAL hWnd LOCAL RetVal LOCAL i IF ( i := GetControlIndex ( ControlName , ParentForm ) ) > 0 IF PCount() == 2 RetVal := _HMG_aControlBrushHandle ELSE IF _HMG_aControlBrushHandle <> 0 DeleteObject ( _HMG_aControlBrushHandle ) ENDIF _HMG_aControlBrushHandle := hBitmap hWnd := GetControlHandle ( ControlName, ParentForm ) SendMessage ( hWnd, STM_SETIMAGE, IMAGE_BITMAP, hBitmap ) ... [/pre2]


SergKis: Упс, [ i ] пролетело, но должно быть понятно

Andrey: На кнопках в меню всегда делаю примерно так: [pre2] // 1.text 2.ico 3.ico 4.font 5.backcolor 6.font 7.backcolor aBtn1 := { "Button 1", "iSantax1", "iSantax2", BLACK, {159,191,236}, YELLOW, {128,0,0} } @ nY, nX BUTTONEX Btn_01 WIDTH nBtnW HEIGHT nBtnH ; CAPTION aBtn1[1] ICON aBtn1[2] BOLD SIZE nFSBtn ; FLAT NOXPSTYLE HANDCURSOR NOTABSTOP ; FONTCOLOR aBtn1[4] BACKCOLOR aBtn1[5] ; ON MOUSEHOVER ( This.Fontcolor := This.Cargo[6], This.Backcolor := This.Cargo[7], This.Icon := This.Cargo[3] ) ; ON MOUSELEAVE ( This.Fontcolor := This.Cargo[4], This.Backcolor := This.Cargo[5], This.Icon := This.Cargo[2] ) ; ACTION _wPost( 1, This.Index ) ; ON INIT { || This.Cargo := aBtn1 }[/pre2] Сменить то на кнопке ОДНУ иконку получиться, а как тогда 2 иконки поменять можно будет ? Может вместо имен иконок в ресурсном файле задавать хендлы иконок ? А как можно изменить размер иконок ? Через какую функцию ? Вот мой пример - https://cloud.mail.ru/public/4eVv/LYoFJ8vbd А можно получить из иконки 128х128 программно другие размеры иконок ?

SergKis: Andrey пишет Сменить то на кнопке ОДНУ иконку получиться Нормально (будет освобождаться память) можно не иконки, см. текст вышеЕсть рассогласование в выделенных местах

Andrey: gfilatov2002 пишет: hIcon := LoadIcon( cIcon ) Form_1.Button_8.HBitmap := hIcon Т.е. можно будет использовать для иконок такой синтаксис: [pre2] // 1.text 2.ico 3.ico 4.font 5.backcolor 6.font 7.backcolor aBtn1 := { "Button 1", LoadIcon("iSantax1"), LoadIcon("iSantax2"), BLACK, {159,191,236}, YELLOW, {128,0,0} } @ nY, nX BUTTONEX Btn_01 WIDTH nBtnW HEIGHT nBtnH ; CAPTION aBtn1[1] ICON aBtn1[2] BOLD SIZE nFSBtn ; FLAT NOXPSTYLE HANDCURSOR NOTABSTOP ; FONTCOLOR aBtn1[4] BACKCOLOR aBtn1[5] ; ON MOUSEHOVER ( This.Fontcolor := This.Cargo[6], This.Backcolor := This.Cargo[7], This.HBitmap := This.Cargo[3] ) ; ON MOUSELEAVE ( This.Fontcolor := This.Cargo[4], This.Backcolor := This.Cargo[5], This.HBitmap := This.Cargo[2] ) ; ACTION _wPost( 1, This.Index ) ; ON INIT { || This.Cargo := aBtn1 }[/pre2]

gfilatov2002: SergKis пишет: Есть рассогласование в выделенных местах Прошу прощения, был не прав. Ниже привожу рабочий вариант этой функции: [pre2]FUNCTION SetBtnIconPicture( cIcon ) LOCAL hIcon, hWnd, idx := Form_1.Button_8.Index DestroyIcon( _HMG_aControlBrushHandle [idx] ) hIcon := LoadIconByName( cIcon ) hWnd := GetControlHandle ( 'Button_8', 'Form_1' ) SendMessage ( hWnd, STM_SETIMAGE, IMAGE_ICON, hIcon ) _HMG_aControlPicture [idx] := cIcon _HMG_aControlBrushHandle [idx] := hIcon RedrawWindow ( hWnd ) RETURN NIL [/pre2] Но, конечно, проще будет написать так: Form_1.Button_8.Picture := 'button5.ICO' вместо вызова этой дополнительной функции SetBtnIconPicture('button5.ICO')

Andrey: Вообще то идея была немного другая. Имя одну иконку 128х128 в ресурсах - динамически изменять размер иконки при изменении размера кнопки. Т.е. из иконки 128х128 меняем размер и передаём изменённые хендлы двух иконок в массив This.Cargo := aBtn1 aBtn1[2] := новый хендл иконки aBtn1[3] := новый хендл иконки Тогда смена иконок будет идти автоматом, если сделать This.HBitmap := This.Cargo[3] и This.HBitmap := This.Cargo[2] Если начать использовать LoadIconByName( cIcon ), т.е. контейнер иконок в ресурсах, то с BCC 5.51 ничего не выйдет. Чаще всего ошибка сборки: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Fatal: Access violation. Link terminated. hbmk2[Icons_All]: Error: Running linker. 2 Не понимает линковщик контейнеров иконок. Как это обойти, не знаю. Есть муторный вариант создать каждую иконку для каждого размера и помещать в отдельные папки[pre2] Exit16 ICON res\16\Exit.ico Exit32 ICON res\32\Exit.ico Exit64 ICON res\64\Exit.ico Exit72 ICON res\72\Exit.ico Exit96 ICON res\96\Exit.ico Exit128 ICON res\128\Exit.ico [/pre2] Но тогда работы будет огого... Вот и хотелось бы иметь одну иконку в ресурсах, а из неё получать "на лету" другие размеры и передавать на кнопку для событий: [pre2]ON MOUSEHOVER ( This.Fontcolor := This.Cargo[6], This.Backcolor := This.Cargo[7], This.HBitmap := This.Cargo[3] ) ; ON MOUSELEAVE ( This.Fontcolor := This.Cargo[4], This.Backcolor := This.Cargo[5], This.HBitmap := This.Cargo[2] ) ; [/pre2] Возможно ли добавить новый синтаксис для кнопки ? This.HBitmap := hIcon

SergKis: Andrey В ButtonEx на входе image или icon имена, т.е. load... делается внутри и destroy тоже делается внутри по разному для image и icon. Для Load... image\icon вне ButtonEx надо решить вопрос, кто будет делать Destroy... image\icon ? Скорее всего, destroy надо выносить на разработчика, т.е. сделал Load... делай и Destroy ... . Не уверен, что это надо и надо ломать существующую схему.

SergKis: PS Изменять размер icon \ image есть параметры IMAGESIZE nImgSize, nImgSize, ты знаешь. Вот и играй ими, да есть небольшое искажение при этом, если не 128х128 использовать а 64x64, то искажения меньше

Andrey: SergKis пишет: Изменять размер icon \ image есть параметры IMAGESIZE nImgSize, nImgSize, ты знаешь. Размеры иконок изменить нельзя. Можно изменить размеры image. А мне нужно пока для icon. SergKis пишет: Не уверен, что это надо и надо ломать существующую схему. Можно и не ломать. Тогда нужно бы сделать новый объект кнопки BUTTON2EX или BUTTON2H или BUTTONICO чисто под хендл иконки. В С же есть хендл иконки, почему в МиниГуи нельзя ? И - destroy надо выносить на разработчика, можно и на разработчика.

Andrey: Вот получился пример с изменение размеров иконок. Правда меняются только иконки на форме, для событий ON MOUSEHOVER и ON MOUSELEAVE не знаю как делать. Вот пример - https://cloud.mail.ru/public/8kjH%2F3N39UouCy

gfilatov2002: Andrey пишет: получился пример с изменение размеров иконок Благодарю за Ваш пример! Добавил эту возможность в ядро библиотеки. Теперь функция изменения размера иконок выглядит так: [pre2]// вызвать изменение размера иконок FUNCTION ChangeIcons(aIcoName) LOCAL hIcoNew, cResourceName, aBtn LOCAL w := wMain.Spinner_1.Value LOCAL h := wMain.Spinner_1.Value //cResourceName := "iSantax1" //GetStartUpFolder() + "\Res\Santa.ico" aBtn := This.Btn_01.Cargo cResourceName := aBtn[2] hIcoNew := LoadIconByName( cResourceName, w, h ) wMain.Btn_01.Icon := hIcoNew // SetBtnIconPicture(wMain.Btn_01.Handle, wMain.Btn_01.Index, hIcoNew) //cResourceName := "iFolder1" //GetStartUpFolder() + "\Res\Folder.ico" aBtn := This.Btn_02.Cargo cResourceName := aBtn[2] hIcoNew := LoadIconByName( cResourceName, w, h ) wMain.Btn_02.Icon := hIcoNew // SetBtnIconPicture(wMain.Btn_02.Handle, wMain.Btn_02.Index, hIcoNew) //cResourceName := "iHMGx1" //GetStartUpFolder() + "\Res\HP.ico" aBtn := This.Btn_03.Cargo cResourceName := aBtn[2] hIcoNew := LoadIconByName( cResourceName, w, h ) wMain.Btn_03.Icon := hIcoNew // SetBtnIconPicture(wMain.Btn_03.Handle, wMain.Btn_03.Index, hIcoNew) //cResourceName := "iExitx1" //GetStartUpFolder() + "\Res\Exit.ico" aBtn := This.Btn_04.Cargo cResourceName := aBtn[2] hIcoNew := LoadIconByName( cResourceName, w, h ) wMain.Btn_04.Icon := hIcoNew // SetBtnIconPicture(wMain.Btn_04.Handle, wMain.Btn_04.Index, hIcoNew) RETURN NIL [/pre2] Andrey пишет: есть хендл иконки, почему в МиниГуи нельзя ? Теперь будет возможно работать с указателем иконки Благодарю за помощь

gfilatov2002: Andrey пишет: для событий ON MOUSEHOVER и ON MOUSELEAVE не знаю как делать Теперь можно записать определение кнопки для событий ON MOUSEHOVER и ON MOUSELEAVE таким образом: [pre2] aBtn1 := { "Button 1", "iSantax1", "iSantax2", BLACK, {159,191,236}, YELLOW, {128,0,0} } @ nY, nX BUTTONEX Btn_01 WIDTH nBtnW HEIGHT nBtnH ; CAPTION aBtn1[1] ICON aBtn1[2] BOLD SIZE nFSBtn ; FLAT NOXPSTYLE HANDCURSOR NOTABSTOP ; FONTCOLOR aBtn1[4] BACKCOLOR aBtn1[5] ; ON MOUSEHOVER ( This.Fontcolor := This.Cargo[6], This.Backcolor := This.Cargo[7], This.Icon := LoadIconByName( This.Cargo[3], nIcoSize, nIcoSize ) ) ; ON MOUSELEAVE ( This.Fontcolor := This.Cargo[4], This.Backcolor := This.Cargo[5], This.Icon := LoadIconByName( This.Cargo[2], nIcoSize, nIcoSize ) ) ; ACTION _wPost( 1, This.Index ) ; ON INIT { || This.Cargo := aBtn1 } [/pre2]Работает

SergKis: gfilatov2002 В продолжении надо использовать _HMG_aControlHeadClick [k] := { imagewidth, imageheight } т.е. This.IconWidth, This.IconSize или для image и icon одинаково This.ImageWidth This.ImageHeight This.Btn_01.ImageWidth This.Btn_01.ImageHeight wMain.Btn_01.ImageWidth wMain.Btn_01.ImageHeight тогда заданные размеры в #xcommand @ <row>,<col> BUTTONEX <name> ; ... [ PICTURE <bitmap> ] ; [ IMAGESIZE <imagewidth> , <imageheight> ] ; [ ICON <icon> ] ; ... можно использовать в то же This.Icon := LoadIconByName( This.Cargo[3], This.ImageWidth, This.ImageHeight )

gfilatov2002: SergKis пишет: для image и icon одинаково This.ImageWidth This.ImageHeight Принято. Благодарю за дельное предложение

Andrey: Ура ! Теперь можно в ресурсах держать только одну иконку. До этого столько времени уходило на рисовку и написание ресурсов.... Осталось разобраться с PNG-картинками. Вот проект - https://cloud.mail.ru/public/JX9a%2FjkeCeJ9cX

gfilatov2002: Andrey пишет: Осталось разобраться с PNG-картинками Легко: для этого даже не надо ничего изменять в исходниках библиотеки. Ниже дополненный код Вашего примера: [pre2]// вызвать изменение размера картинок FUNCTION ChangePicture() LOCAL hIcoNew, cResourceName, aBtn LOCAL w := wMain.Spinner_1.Value LOCAL h := wMain.Spinner_1.Value aBtn := This.Btn_01.Cargo cResourceName := aBtn[2] SetBtnPicture(wMain.Btn_01.Index, 'Btn_01', cResourceName, w, h) aBtn := This.Btn_02.Cargo cResourceName := aBtn[2] SetBtnPicture(wMain.Btn_02.Index, 'Btn_02', cResourceName, w, h) aBtn := This.Btn_03.Cargo cResourceName := aBtn[2] SetBtnPicture(wMain.Btn_03.Index, 'Btn_03', cResourceName, w, h) aBtn := This.Btn_04.Cargo cResourceName := aBtn[2] SetBtnPicture(wMain.Btn_04.Index, 'Btn_04', cResourceName, w, h) RETURN NIL //////////////////////////////////////////////////////////////////////////// FUNCTION SetBtnPicture( idx, cBtnName, cResourceName, w, h ) _HMG_aControlHeadClick [idx][1] := w _HMG_aControlHeadClick [idx][2] := h wMain.&(cBtnName).Picture := cResourceName RETURN NIL [/pre2]

Andrey: gfilatov2002 пишет: Легко: для этого даже не надо ничего изменять в исходниках библиотеки. Спасибо БОЛЬШОЕ ! А с иконками когда пример будет работать ?



полная версия страницы