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

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

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

Ответов - 27, стр: 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 пишет: Легко: для этого даже не надо ничего изменять в исходниках библиотеки. Спасибо БОЛЬШОЕ ! А с иконками когда пример будет работать ?

gfilatov2002: Andrey пишет: с иконками когда пример будет работать ? После выхода новой сборки 19.10

Andrey: gfilatov2002 пишет: После выхода новой сборки 19.10 Ждем с нетерпеньем ! На сайте http://www.hmgextended.com/download.html : Harbour MiniGUI Extended Edition 19.08 setup. Includes MiniGUI libraries, include files, development tools, source code, sample applications, documentation, Harbour compiled libraries, Harbour include files and Harbour compiler binaries. Libraries are compiled for Borland C++. Borland C++ Compiler version 5.8 Borland C++ Compiler version 5.8 - это сейчас Open Source лицензия ? Не хотелось бы попадать под всякие разборки...

Andrey: Всем привет ! В догонку к исправлениям для иконок. Имеем сейчас в МиниГуи такую команду: [pre2] DRAW ICON IN WINDOW Form_1 AT 0, 0 PICTURE cIco WIDTH 96 HEIGHT 96 COLOR aBackColor[/pre2] Можно ли сделать/добавить вот такой новый синтаксис: [pre2] nImgSize := 48 hIco := LoadIconByName( cIco, nImgSize, nImgSize ) DRAW ICON IN WINDOW Form_1 AT 0, 0 PICTURE hIco WIDTH nImgSize HEIGHT nImgSize COLOR aBackColor или DRAW ICON IN WINDOW Form_1 AT 0, 0 HPICTURE hIco WIDTH nImgSize HEIGHT nImgSize COLOR aBackColor[/pre2] Т.е. показ иконки через загруженный хендл иконки ?

gfilatov2002: Andrey пишет: добавить вот такой новый синтаксис Такая возможность уже существует в этой команде Попробуй DRAW ICON IN WINDOW Form_1 AT 0, 0 HICON hIco WIDTH nImgSize HEIGHT nImgSize COLOR aBackColor

Andrey: gfilatov2002 пишет: Попробуй Отлично, Работает. Спасибо ! А в доку эти команды попадут ?

Andrey: Всем привет ! Надо бы пример исправить \MiniGUI\SAMPLES\BASIC\ButtonEx_DynamicMenu\demo.prg, вот так: [pre2] // Расчет фонтов кнопок STOP ------------------------------ // получить размер иконки кнопки в зависимости от высоты кнопки nIcoSize := INT(nBtnH - 10) // размер иконки nIcoSize := IIF( nIcoSize > 128, 128, nIcoSize) FOR nI := 1 TO Len(aBtn) cN := aBtn[nI][1] @ nY, nX BUTTONEX &cN WIDTH nBtnW HEIGHT nBtnH ; CAPTION aBtn[nI][2] ICON aBtn[nI][4] BOLD SIZE aBtn[nI][9] ; FLAT NOXPSTYLE HANDCURSOR NOTABSTOP ; BACKCOLOR aBtn[nI][6] GRADIENTFILL aBtn[nI][7] ; ON MOUSEHOVER ( This.Fontcolor := aFC2Btn, This.GradientFill := This.Cargo[2][7] ,; This.Icon := LoadIconByName( This.Cargo[2][5], This.ImageWidth, This.ImageHeight ) ) ; ON MOUSELEAVE ( This.Fontcolor := aFC1Btn, This.GradientOver := This.Cargo[2][6] ,; This.Icon := LoadIconByName( This.Cargo[2][4], This.ImageWidth, This.ImageHeight ) ) ; ACTION _wPost( 1, This.Index ) ; ON INIT { || This.Cargo := { nI, aBtn[ nI ] } } This.&(cN).ImageWidth := nIcoSize This.&(cN).ImageHeight := nIcoSize This.&(cN).Icon := LoadIconByName( aBtn[nI,4], nIcoSize, nIcoSize ) aN := aBtn[ nI ][8] // HotKey array[/pre2] А то в некоторых случаях пролёт получается, пока придумал как сделать все мозги себе вынес...

gfilatov2002: Andrey пишет: пример исправить Поправлю, конечно. Благодарю за помощь



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