Форум » GUI » Чего мне не хватает в МиниГуи.... » Ответить

Чего мне не хватает в МиниГуи....

Andrey: Всех с праздниками !!! Предлагаю тем кто использует МиниГуи высказать свои предложения по улучшению данного продукта, да и в какую сторону двигаться дальше.... Вот то что мне не хватает (я имею в виду примеров): 1. Очень мало примеров для работы с DLL (хотя это и не относиться к МиниГуи, но как делать не знаю). 1.1 Как собирать свои ресурсы к программе в отдельную dll-ку. Как подключать её при запуске, показ картинок из dll (я может и догадываюсь, но пока не могу сделать этого) ? 1.2. Как сделать отдельный свой ехе-ник, а Харбор и Минигуи затолкать в отдельную dll-ку, ну и LetoDB в отдельную dll. Как подключать при запуске эти отдельные dll и пользоваться функциями из этих dll ? 1.3. Как использовать чужие dll (допустим на Дельфи) в своих программах на МиниГуи (хотя FastReport'ом пользуюсь, но он специально сделан под Харбор) ? Разные примеры из МиниГуи на эту тему смотрел, кое что понятно, кое что нет. 2. Полноценная работа с иконками 2.1. Сейчас приходиться каждый размер иконки (16х16, 32х32 и т.д.) хранить отдельно в ресурсном файле и выводить на кнопки по отдельности. Нужна функция вывода из ОДНОГО файла иконки (содержащий все размеры от 16х16 до 128х128) выбранного размера. 2.2. Как из shell32.dll (она содержит все размеры иконок) можно выбрать и показать иконку отличную от размера 32х32 ? 2.3. Как вывести на форму (не на кнопку) иконку заданного размера ? Вот пока часть чего хочется... Может на Рождество желания сбудутся ?

Ответов - 201, стр: 1 2 3 4 5 6 7 8 9 10 11 All

gfilatov2002: Andrey пишет: Иконку можно записать как .png и .bmp Уже есть такая возможность [pre]extern HBITMAP Icon2Bmp( HICON hIcon ); HB_FUNC( BMPFROMICON ) { HICON hIcon = ( HICON ) hb_parnl( 1 ); hb_retnl( ( LONG ) Icon2Bmp( hIcon ) ); } [/pre] Можно использовать так: Win_1.Image_1.hBitmap := BmpFromIcon( hIcon1 ) Кстати, этот код взят из твоего примера /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2023 Verchenko Andrey <verchenkoag@gmail.com> Dmitrov, Moscow region * Copyright 2023 Grigory Filatov <gfilatov@inbox.ru> * * Манипуляции с объектами на форме * Manipulating objects on a form */

Andrey: gfilatov2002 пишет: Кстати, этот код взят из твоего примера Так это только заготовка, недоделанная... И всего ОДНА операция - иконка в Bmp без прозрачности. А в png нет...

gfilatov2002: Andrey пишет: А в png нет... Есть такая функция И снова она взята из твоего примера [pre] // извлечь файл картинки из ресурсов программы FUNCTION myICO2PNG(cRes) LOCAl aImage, cFileLogo, aXY, cMsg, nResult, cFile Default cRes := "LogoMG" cFile := cRes + ".ico" aImage := {} // нет картинки ! файл для экспорта ! cFileLogo := GetTempFolder() + "\" + cFile If !hb_FileExists( cFileLogo ) nResult := RCDataToFile( cRes, cFileLogo ) If nResult > 0 Else cMsg := "cRes = '" + cRes + "'" + CRLF cMsg += "RCDataToFile() - Code: " + hb_NtoS( nResult ) + CRLF cMsg += cFileLogo + CRLF MsgStop( cMsg, "Checkout error" ) Endif Endif If hb_FileExists( cFileLogo ) cFile := hb_dirBase() + cRes + ".png" HMG_SaveImage( cFileLogo, cFile, "PNG" ) // Save to PNG FErase ( cFileLogo ) aXY := hb_GetImageSize( cFile ) cMsg := cFile + ": " + hb_NtoS( aXY[1] ) + " x " + hb_NtoS( aXY[2] ) + " Pixels" //AlertInfo(cMsg) aImage := { cFile, aXY[1], aXY[2] } Endif RETURN aImage [/pre]


Andrey: Тогда осталось запись хендла в иконку и оформить все в одном примере. Или лучше записать всё в хелпе. Что-то в примерах уже путаешься, искать нужный вариант сложно. И не понял как иконку с формы записать в png ? И ещё вопрос по иконкам. Как можно положить маску цвета на иконку ? Сейчас приходиться для кнопок вносить в ресурсы 2 кнопки: обычную и с наложенным цветом желтую иконку. Для смены иконки при наведении на кнопки мышкой. Если можно сделать как в редакторе иконок: Тогда бы ресурсы проги стали бы занимать в 2 раза меньше места. А у меня 20 мб картинок и иконок в ресурсах моей проги...

gfilatov2002: Andrey пишет: Как можно положить маску цвета Для этого надо использовать дополнительные библиотеки: 1) bostaurus, которая входит в состав Минигуи; 2) бесплатную мощную внешнюю DLL - freeimage (есть примеры использования в поставке Минигуи). Andrey пишет: Тогда бы ресурсы проги стали бы занимать 1) Обрати внимание на оптимизацию ресурсов по размеру и цветности; 2) можно с помощью дополнительной бесплатной библиотеки hbsvg создавать простые векторные рисунки. Ниже см. пример картинки, созданной с помощью этой библиотеки:

gfilatov2002: gfilatov2002 пишет: можно с помощью дополнительной бесплатной библиотеки hbsvg создавать простые векторные рисунки. Еще один пример использования этой библиотеки - вывод табличных данных из DBF файла на картинку Полный код этой программы см. ниже: [pre2] PROCEDURE Main() LOCAL hSvg, aCol FIELD CODE, NAME, RESIDENTS dbCreate( "country", { { "CODE", "C", 3, 0 }, { "NAME", "C", 30, 0 }, { "RESIDENTS", "N", 10, 0 } },, .T. ) dbAppend(); CODE := "LTU"; NAME := "Lithuania"; RESIDENTS := 3369600 dbAppend(); CODE := "USA"; NAME := "United States of America"; RESIDENTS := 305397000 dbAppend(); CODE := "POR"; NAME := "Portugal"; RESIDENTS := 10617600 dbAppend(); CODE := "POL"; NAME := "Poland"; RESIDENTS := 38115967 dbAppend(); CODE := "AUS"; NAME := "Australia"; RESIDENTS := 21446187 dbAppend(); CODE := "FRA"; NAME := "France"; RESIDENTS := 64473140 dbAppend(); CODE := "RUS"; NAME := "Russia"; RESIDENTS := 141900000 hSvg := svg_init( "table.svg", 566, 793 ) svg_text( hSvg, 50, 50, "Table of countries", "Arial", 16, 0xFF0000 ) aCol := { { "Code", "CODE", 60 }, { "Country", "NAME", 200 }, { "Residents", "RESIDENTS", 90 } } draw_table( hSvg, 50, 75, aCol ) svg_close( hSvg ) dbCloseAll() RETURN STATIC PROCEDURE draw_table( hSvg, nX, nY, aCol ) LOCAL nI, nDX, xValue, cValue, nTextWidth nDX := nX svg_line( hSvg, nX, nY + 5, nX + 350, nY + 5, 1, 0x000000 ) FOR nI := 1 TO Len( aCol ) xValue := aCol[ nI, 1 ] nTextWidth := Len( xValue ) * 6 svg_text( hSvg, nDX + ( aCol[ nI, 3 ] - nTextWidth ) / 2, nY, xValue, "Arial", 10, 0x000000 ) nDX += aCol[ nI, 3 ] IF nI < Len( aCol ) svg_line( hSvg, nDX, nY - 15, nDX, nY + 200, 1, 0x000000 ) ENDIF NEXT nY += 20 dbGoTop() DO WHILE ! Eof() nDX := nX FOR nI := 1 TO Len( aCol ) xValue := FieldGet( FieldPos( aCol[ nI, 2 ] ) ) IF ValType( xValue ) == "N" cValue := hb_NToS( xValue ) ELSE cValue := xValue ENDIF svg_text( hSvg, nDX + 10, nY + 10, cValue, "Arial", 10, 0x000000 ) nDX += aCol[ nI, 3 ] NEXT dbSkip() nY += 20 ENDDO RETURN [/pre2]

Andrey: Вот нашёл https://www.forums.fivetechsupport.com/viewtopic.php?f=3&t=35547&p=211638&hilit=ico+to+png&sid=f6a307bf435b0e6fa8ba4aa5a88388ac#p211638[pre2] FWH 18.03: FW_SaveImage() Postby nageswaragunupudi » Tue Apr 24, 2018 1:26 pm New functions in FWH 18.03 FW_SaveHBitmap( hBitmap, cBmpFile ) --> lSuccess // в Минигуи похоже HMG_SaveImage( Win_1.Image_1.hBitmap, cFile1, "PNG" ) FW_SaveHIContoIco( hIcon, cIconFile ) --> lSuccess // сделать для МиниГуи можно ? The above two functions are self explanatory. FW_SaveImage( [uSource], [cFile], [lJpgQuality] ) --> lSuccess[/pre2] Народ, кто работает на Fivewin'е поделитесь исходниками функцией FW_SaveHIContoIco( hIcon, cIconFile )

gfilatov2002: Andrey пишет: FW_SaveHIContoIco( hIcon, cIconFile ) --> lSuccess Такая функция уже есть в Минигуи: [pre2] FUNCTION SaveHIconToIco( hIcon, cIconName ) IF ".ICO" $ Upper( cIconName ) ELSE cIconName := Trim( cIconName ) + ".ICO" ENDIF RETURN C_SaveHIconToFile( cIconName, { hIcon } ) [/pre2] Она была использована в примере samples\Basic\Icons\demo2.prg

Andrey: А я не нашёл... Спасибо БОЛЬШОЕ ! Вот что значит хелпа нет по функциям... Что искать и не знаешь... Тогда в примере-3 нужно сделать как то наложение маски цвета и пример будет готов. Как это можно сделать ? P.S. Есть пример \MiniGUI\SAMPLES\Advanced\GrayBmp, там используется функция [pre2]GrayBmp( GetControlHandle( "Image_1", "Form_1" ), cImage, Form_1.Image_1.Width, Form_1.Image_1.Height )[/pre2] Вот наподобие надо для иконок.

Andrey: А сменить BackgroundColor картинки уже выведенной на форму можно ? Делаю сначала: [pre2] @ y, x + n IMAGE &cN OF Win_1 PICTURE '' WIDTH aSz HEIGHT aSz ; ;//TRANSPARENT BACKGROUNDCOLOR aBColor а потом пытаюсь сделать: Win_1.&(cN).BackgroundColor := aBColor [/pre2]и фон НЕ МЕНЯЕТСЯ !!!

gfilatov2002: Andrey пишет: сменить BackgroundColor картинки уже выведенной на форму Посмотри, как это сделано в примере Basic\IMAGE_2 - параметры картинки изменяются динамически.

Andrey: Использую выборку коллекций иконок из dll и сохранение этой коллекции в файл: [pre2] aIcons := ExtractIconEx( cIconDll, nItem ) // icon with number XX to write along the path lRet := C_SaveHIconToFile( cIconSave, aIcons )[/pre2] В файл записываются только иконки 16x16 и 32x32. А мне нужны все иконки и большие тоже. Как это сделать ? Можно модифицировать функцию ExtractIconEx() чтобы все иконки брались ?

gfilatov2002: Andrey пишет: мне нужны все иконки и большие тоже. Как это сделать ? Нужно вместо функции ExtractIconEx() использовать другую WINAPI функцию PrivateExtractIcons(), которая позволяет извлекать иконки больших размеров. Пример использования: [pre2] cIcon := 'IconVista.ico' hIcon1 := LoadIconByName( cIcon, 256, 256 ) hIcon2 := LoadIconByName( cIcon, 128, 128 ) hIcon3 := LoadIconByName( cIcon, 64, 64 ) cIcon := 'v:\rh.exe' msgdebug(PRIVATEEXTRACTICONS(cIcon, -1)) // return 9 a:=PRIVATEEXTRACTICONS(cIcon, 0, 256, 256) // icon 256x256 if ishicon(a[1]) hIcon1:=a[1] endif hIcon2:=PRIVATEEXTRACTICONS(cIcon, 8, 128, 128)[1] // icon 128x128 [/pre2] Результат ее работы при извлечении иконок из внешнего приложения см. на картинке: P.S. Другой пример извлекает большие иконки из DLL в папке minigui\samples\Basic\Icons . [pre] cIcon := 'myicons.dll' msgdebug(PRIVATEEXTRACTICONS(cIcon, -1)) // return 1 a:=PRIVATEEXTRACTICONS(cIcon, 0, 256, 256) IF ISHICON(a[1]) hIcon1:=a[1] ENDIF hIcon2:=PRIVATEEXTRACTICONS(cIcon, 0, 128, 128)[1] hIcon3:=PRIVATEEXTRACTICONS(cIcon, 0, 64, 64)[1] [/pre]

Andrey: Спасибо БОЛЬШОЕ ! gfilatov2002 пишет: Другой пример извлекает большие иконки из DLL в папке minigui\samples\Basic\Icons . Там в примере demo3.prg есть функция hb_BitOr( DST_ICON, DSS_MONO ) Я пропустил этот пример, только сейчас увидел. А можно наподобие такой функции сделать наложение маски цвета ?

Andrey: Можно ли на объекте ButtonEX отключить ВООБЩЕ окантовку кнопки ?

gfilatov2002: Andrey пишет: Можно ли на объекте ButtonEX отключить ВООБЩЕ окантовку Надеюсь, пример \SAMPLES\Advanced\ExpButton уже видел Вроде, там нет никакой окантовки у кнопок...

Andrey: Да, помню этот пример, красивые кнопки. Мне нужно допустим форма SILVER и сделать кнопку без окантовки тоже SILVER с иконкой. Т.е. чтобы не было видно что это кнопка. А при смене фокуса, меняю иконку. Как то можно окантовку отключить ?

SergKis: gfilatov2002 пишет Вроде, там нет никакой окантовки у кнопок... Что бы шире использовать Cargo кнопки, исправил код примера с использованием oHmgData() Тут пример https://TransFiles.ru/6i56x Andrey пишет Как то можно окантовку отключить ? В примере ф-я *-----------------------------------------------------------------------------* FUNCTION OwnButtonPaint( pdis ) *-----------------------------------------------------------------------------* заменяет родную из minigui.lib читай readme.txt, там режимы описаны Надо подстраивать под себя массив App.Cargo:aButStyles и в Cargo кнопки варианты для painting и image, т.е.[pre2] ON INIT {|o| This.Cargo := oHmgData(), o := ThisWindow.Cargo, ; This.Cargo:aButStyles := o:aButStyles, ; This.Cargo:cButMisc := '3,'+o:cResPath+'open.bmp' } [/pre2]

gfilatov2002: SergKis пишет: исправил код примера с использованием oHmgData() Большое спасибо за помощь

Andrey: Это большой пример. Попроще может быть пример ? Форма и одна кнопка без окантовки с иконкой ...



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