Автор | Сообщение |
|
| постоянный участник
|
Пост N: 6462
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.10.19 13:47. Заголовок: Динамическое изменение размеров иконки/картинки ?
Всем привет. Столкнулся с проблемой изменения размеров иконки/картинки на кнопке. Имеется иконка + картинка одного размера в ресурсах проги. iSanta128 ICON res\Santa128x128.ico Santa128 PNG res\santa128x128.png Как на базе этой иконки/картинки получить другой размер ? Есть ли какие функции в MiniGui или в FW ? В МиниГуи можно же загрузить из ресурса объект и получить его хендл: M->hImg := LoadImage( "Santa128" ) А хенд на кнопку как можно поместить ? И можно ли делать преобразования иконки/картинки по этому хендлу ? Я слабо разбираюсь в этой тематике, просветите пожалуйста меня.
|
|
|
Ответов - 28
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 6463
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.10.19 19:13. Заголовок: Смену иконки на кноп..
Смену иконки на кнопки в МиниГуи можно делать так: SetProperty ( "wMain", "Btn_01" , "Icon" , cFilePath( hb_ProgName() ) + "\Res\HP.ico" ) А как можно сделать смену иконки через хендл загруженной иконки ? hIcoNew := LoadImage( cFilePath( hb_ProgName() ) + "\Res\HP.ico" )
|
|
|
|
| moderator
|
Пост N: 1598
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.10.19 21:29. Заголовок: Andrey пишет: как ..
Andrey пишет: цитата: | как можно сделать смену иконки через хендл загруженной иконки ? |
| У меня получилось сделать таким образом в контрольном примере: 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
|
|
|
|
| постоянный участник
|
Пост N: 2935
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.10.19 22:08. Заголовок: Есть рассогласование..
Есть рассогласование в выделенных местах *-----------------------------------------------------------------------------* 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 ) ...
|
|
|
|
| постоянный участник
|
Пост N: 2936
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.10.19 22:10. Заголовок: Упс, пролетело, но ..
Упс, [ i ] пролетело, но должно быть понятно
|
|
|
|
| постоянный участник
|
Пост N: 6464
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.10.19 22:55. Заголовок: На кнопках в меню вс..
На кнопках в меню всегда делаю примерно так: // 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 } Сменить то на кнопке ОДНУ иконку получиться, а как тогда 2 иконки поменять можно будет ? Может вместо имен иконок в ресурсном файле задавать хендлы иконок ? А как можно изменить размер иконок ? Через какую функцию ? Вот мой пример - https://cloud.mail.ru/public/4eVv/LYoFJ8vbd А можно получить из иконки 128х128 программно другие размеры иконок ?
|
|
|
|
| постоянный участник
|
Пост N: 2937
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.19 10:56. Заголовок: Andrey пишет Сменить..
Andrey пишет цитата: | Сменить то на кнопке ОДНУ иконку получиться |
| Нормально (будет освобождаться память) можно не иконки, см. текст выше цитата: | Есть рассогласование в выделенных местах |
|
|
|
|
|
| постоянный участник
|
Пост N: 6465
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.10.19 12:36. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | hIcon := LoadIcon( cIcon ) Form_1.Button_8.HBitmap := hIcon |
| Т.е. можно будет использовать для иконок такой синтаксис: // 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 }
|
|
|
|
| moderator
|
Пост N: 1599
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.10.19 15:23. Заголовок: SergKis пишет: Есть..
SergKis пишет: цитата: | Есть рассогласование в выделенных местах |
| Прошу прощения, был не прав. Ниже привожу рабочий вариант этой функции: цитата: | 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 |
| Но, конечно, проще будет написать так: цитата: | Form_1.Button_8.Picture := 'button5.ICO' |
| вместо вызова этой дополнительной функции цитата: | SetBtnIconPicture('button5.ICO') |
|
|
|
|
|
| постоянный участник
|
Пост N: 6466
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.10.19 16:14. Заголовок: Вообще то идея была ..
Вообще то идея была немного другая. Имя одну иконку 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 Не понимает линковщик контейнеров иконок. Как это обойти, не знаю. Есть муторный вариант создать каждую иконку для каждого размера и помещать в отдельные папки 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 Но тогда работы будет огого... Вот и хотелось бы иметь одну иконку в ресурсах, а из неё получать "на лету" другие размеры и передавать на кнопку для событий: 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] ) ; Возможно ли добавить новый синтаксис для кнопки ? This. HBitmap := hIcon
|
|
|
|
| постоянный участник
|
Пост N: 2938
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.19 16:28. Заголовок: Andrey В ButtonEx н..
Andrey В ButtonEx на входе image или icon имена, т.е. load... делается внутри и destroy тоже делается внутри по разному для image и icon. Для Load... image\icon вне ButtonEx надо решить вопрос, кто будет делать Destroy... image\icon ? Скорее всего, destroy надо выносить на разработчика, т.е. сделал Load... делай и Destroy ... . Не уверен, что это надо и надо ломать существующую схему.
|
|
|
|
| постоянный участник
|
Пост N: 2939
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.19 16:37. Заголовок: PS Изменять размер i..
PS Изменять размер icon \ image есть параметры IMAGESIZE nImgSize, nImgSize, ты знаешь. Вот и играй ими, да есть небольшое искажение при этом, если не 128х128 использовать а 64x64, то искажения меньше
|
|
|
|
|
| постоянный участник
|
Пост N: 6467
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.10.19 18:28. Заголовок: SergKis пишет: Изме..
SergKis пишет: цитата: | Изменять размер icon \ image есть параметры IMAGESIZE nImgSize, nImgSize, ты знаешь. |
| Размеры иконок изменить нельзя. Можно изменить размеры image. А мне нужно пока для icon. SergKis пишет: цитата: | Не уверен, что это надо и надо ломать существующую схему. |
| Можно и не ломать. Тогда нужно бы сделать новый объект кнопки BUTTON2EX или BUTTON2H или BUTTONICO чисто под хендл иконки. В С же есть хендл иконки, почему в МиниГуи нельзя ? И - destroy надо выносить на разработчика, можно и на разработчика.
|
|
|
|
| постоянный участник
|
Пост N: 6468
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.10.19 21:42. Заголовок: Вот получился пример..
|
|
|
|
| moderator
|
Пост N: 1600
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.19 10:36. Заголовок: Andrey пишет: получ..
Andrey пишет: цитата: | получился пример с изменение размеров иконок |
| Благодарю за Ваш пример! Добавил эту возможность в ядро библиотеки. Теперь функция изменения размера иконок выглядит так: цитата: | // вызвать изменение размера иконок 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 |
| Andrey пишет: цитата: | есть хендл иконки, почему в МиниГуи нельзя ? |
| Теперь будет возможно работать с указателем иконки Благодарю за помощь
|
|
|
|
| moderator
|
Пост N: 1601
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.19 10:51. Заголовок: Andrey пишет: для с..
Andrey пишет: цитата: | для событий ON MOUSEHOVER и ON MOUSELEAVE не знаю как делать |
| Теперь можно записать определение кнопки для событий ON MOUSEHOVER и ON MOUSELEAVE таким образом: цитата: | 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 } |
|
Работает
|
|
|
|
| постоянный участник
|
Пост N: 2940
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.10.19 11:30. Заголовок: gfilatov2002 В прод..
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 )
|
|
|
|
| moderator
|
Пост N: 1602
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.19 12:02. Заголовок: SergKis пишет: для ..
SergKis пишет: цитата: | для image и icon одинаково This.ImageWidth This.ImageHeight |
| Принято. Благодарю за дельное предложение
|
|
|
|
| постоянный участник
|
Пост N: 6469
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.10.19 13:30. Заголовок: Ура ! :sm178: Тепе..
|
|
|
|
| moderator
|
Пост N: 1603
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.19 14:27. Заголовок: Andrey пишет: Остал..
Andrey пишет: цитата: | Осталось разобраться с PNG-картинками |
| Легко: для этого даже не надо ничего изменять в исходниках библиотеки. Ниже дополненный код Вашего примера: цитата: | // вызвать изменение размера картинок 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 |
|
|
|
|
|
| постоянный участник
|
Пост N: 6470
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.10.19 15:56. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Легко: для этого даже не надо ничего изменять в исходниках библиотеки. |
| Спасибо БОЛЬШОЕ ! А с иконками когда пример будет работать ?
|
|
|
Ответов - 28
, стр:
1
2
All
[только новые]
|
|