On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост 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" )

А хенд на кнопку как можно поместить ?
И можно ли делать преобразования иконки/картинки по этому хендлу ?
Я слабо разбираюсь в этой тематике, просветите пожалуйста меня.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 27 , стр: 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" )


Спасибо: 0 
ПрофильЦитата Ответить
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


Спасибо: 0 
ПрофильЦитата Ответить



Пост 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 )
...


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2936
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.19 22:10. Заголовок: Упс, пролетело, но ..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 программно другие размеры иконок ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2937
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.19 10:56. Заголовок: Andrey пишет Сменить..


Andrey пишет
 цитата:
Сменить то на кнопке ОДНУ иконку получиться


Нормально (будет освобождаться память) можно не иконки, см. текст выше
 цитата:
Есть рассогласование в выделенных местах



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 }



Спасибо: 0 
ПрофильЦитата Ответить
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')



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить



Пост 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 ... . Не уверен, что это надо и надо ломать существующую схему.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2939
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.19 16:37. Заголовок: PS Изменять размер i..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6467
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.10.19 18:28. Заголовок: SergKis пишет: Изме..


SergKis пишет:

 цитата:
Изменять размер icon \ image есть параметры IMAGESIZE nImgSize, nImgSize, ты знаешь.


Размеры иконок изменить нельзя. Можно изменить размеры image. А мне нужно пока для icon.

SergKis пишет:

 цитата:
Не уверен, что это надо и надо ломать существующую схему.


Можно и не ломать.
Тогда нужно бы сделать новый объект кнопки BUTTON2EX или BUTTON2H или BUTTONICO чисто под хендл иконки.
В С же есть хендл иконки, почему в МиниГуи нельзя ?
И - destroy надо выносить на разработчика, можно и на разработчика.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6468
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.10.19 21:42. Заголовок: Вот получился пример..


Вот получился пример с изменение размеров иконок.
Правда меняются только иконки на форме, для событий ON MOUSEHOVER и ON MOUSELEAVE не знаю как делать.

Вот пример - https://cloud.mail.ru/public/8kjH%2F3N39UouCy

Спасибо: 0 
ПрофильЦитата Ответить
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 пишет:

 цитата:
есть хендл иконки, почему в МиниГуи нельзя ?


Теперь будет возможно работать с указателем иконки
Благодарю за помощь

Спасибо: 0 
ПрофильЦитата Ответить
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 }

Работает

Спасибо: 0 
ПрофильЦитата Ответить



Пост 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 )

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1602
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.10.19 12:02. Заголовок: SergKis пишет: для ..


SergKis пишет:

 цитата:
для image и icon одинаково
This.ImageWidth
This.ImageHeight


Принято.
Благодарю за дельное предложение

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6469
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.10.19 13:30. Заголовок: Ура ! :sm178: Тепе..


Ура !
Теперь можно в ресурсах держать только одну иконку.
До этого столько времени уходило на рисовку и написание ресурсов....

Осталось разобраться с PNG-картинками.
Вот проект - https://cloud.mail.ru/public/JX9a%2FjkeCeJ9cX

Спасибо: 0 
ПрофильЦитата Ответить
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



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6470
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.10.19 15:56. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Легко: для этого даже не надо ничего изменять в исходниках библиотеки.


Спасибо БОЛЬШОЕ !
А с иконками когда пример будет работать ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 27 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 90
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет