Форум » 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

Vlad04: Мечты, мечты ..... Я хотел -бы чтобы работа в Ide МиниГуи была похожа на работу в дизайнере Делфи или V.Basic, чтобы поддерживались основные необходимые компоненты и их свойства( позиционирование, контейнера и т.д.). а программирование поддерживало все приемы ОПП, без псевдо GetProperty, SetProperty..

gfilatov2002: Vlad04 пишет: чтобы работа в Ide МиниГуи была похожа на работу в дизайнере Делфи или V.Basic Ide МиниГуи имеет открытые исходники - Вы можете добавлять недостающий функционал самостоятельно Vlad04 пишет: программирование поддерживало все приемы ОПП Существует незавершенный открытый проект от автора Minigui, датированный 2010 годом, под названием HMG OBJECTS, который поддерживает полноценное ОПП Пример использования: [pre2]/* HMG Nice OOP! Demo(Full OOP syntax) (c) 2010 Roberto Lopez <mail.box.hmg@gmail.com> - HMG OBJECTS is designed to give to the programmers a similar experience as one using Clipper's predefined classes - Windows and its controls are created at window activation unless 'Create()' method is invoked. - Create() method is available for windows and controls. - Control's 'Parent' property is optional. If not specified, the last window defined is its default value. - xBase and alternate syntax can be used. - Control's 'Name' property (optional): At control creation, an instance variable is dynamically added to its parent window object. The name of this instance variable, is the control's name and its content is the control object. So, you could access a particular control (ie) in the following way: oWindow:Frame_1:Caption := 'New Caption' MsgInfo ( oWindow:Frame_1:Caption ) Look at \samples\button for working samples. */ #include "..\..\include\objects.ch" Set Procedure To ..\..\source\objects Function Main Local oWindow , oButton1 With Object oWindow := Window():New() :Row := 10 :Col := 10 :Width := 400 :Height := 400 :Title := 'Nice OOP Demo!!!' :Type := WND_MAIN :OnInit := { || oWindow:Center() } With Object oButton1 := Button():New() :Row := 40 :Col := 40 :Caption := 'OOP Button!!!' :OnClick := { || Button1Click() } End With End With oWindow:Activate() Return Procedure Button1Click() Local oStandard With Object oStandard := Window():New() :Row := 10 :Col := 10 :Width := 600 :Height := 300 :Title := 'Nice OOP Standard Window!!!' :Type := WND_STANDARD :OnInit := { || ( oStandard:Center() ) } End With oStandard:Activate() Return [/pre2]

SergKis: Andrey пишет: Как собирать свои ресурсы к программе в отдельную dll-ку пример создания dll: http://tempfile.ru/file/3102753


SergKis: Vlad04 пишет:программирование поддерживало все приемы ОПП сам напиши классы, обвесив функции окон, контролов MiniGui - не так и сложно

Dima: Andrey пишет: 2.2. Как из shell32.dll (она содержит все размеры иконок) можно выбрать и показать иконку отличную от размера 32х32 ? Вероятно надо глянуть пример MiniGUI\SAMPLES\BASIC\ExtractIcon\demo2.prg + MiniGUI\SAMPLES\Advanced\IconView\IcoView.prg а в нем параметры передаваемые функции EXTRACTICONEX (EXTRACTICON) PS Если есть непонятки спросить у gfilatov

Dima: Dima пишет: EXTRACTICONEX возможно вместо нее нужно использовать SHGetFileInfo , так как у EXTRACTICONEX только 2 варианта или маленькая иконка или большая. PS Просто погуглил

Andrey: Dima пишет: возможно вместо нее нужно использовать SHGetFileInfo Вот я и об этом и пишу, что нет функций в МиниГуи для работы с иконками... Если была, то я бы закатал все ресурсы в отдельную DLL (уж больно большим мой ехе-ник стал) и выводил на кнопку или форму нужные мне/ВСЕМ иконки (заданного размера). Вот единственный пример с функцией SHGetFileInfo который помог мне сделать Григорий. А SergKis переделал под универсальную форму просмотра. Прикольный получился пример. Жалко, что нет его в библиотеке... Но эта функция используется для других целей. Вот пример IconAssociatedFile_4.7z - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample

XVar: В принципе можно строить отличный интерфейс, но возможнось таскать панели и невозможность указать минимальный (максимальный) размер удручает.

Andrey: Как в Минигуи сделать МойПроект.hbp для сборки нескольких .prg в МояБиблиотека.lib, чтобы потом прилинковывать к своему проекту ?

SergKis: Andrey пишет:Как в Минигуи сделать МойПроект.hbp для сборки нескольких .prg в МояБиблиотека.lib, чтобы потом прилинковывать к своему проекту ? Ты уверен, что при каждой компиляции, надо собирать lib ? Проект еще не отлажен, lib для работы не годится. Когда довел до ума, тогда и собирай ((пополняй lib), т.е. запустил bat\cmd и собрал new версию lib : [pre2] SET HB_INS_BCC=<путь к BCC> SET HBMK2_OBJ=<путь к объектникам проекта, создаваемых hbmk2> SET MYLIB_OUT=<путь и имя своей библиотеки> if not exist %MYLIB_OUT% goto Crt :Upd for %%i in ( %HBMK2_OBJ%\*.obj ) Do %HB_INS_BCC%\bin\tlib.exe %MYLIB_OUT -+%%i > nul goto e :Crt for %%i in ( %HBMK2_OBJ%\*.obj ) Do %HB_INS_BCC%\bin\tlib.exe %MYLIB_OUT %%i > nul :e [/pre2]

Andrey: SergKis пишет: Ты уверен, что при каждой компиляции, надо собирать lib ? Проект еще не отлажен, lib для работы не годится. Да я понимаю, что не нужно при каждой компиляции собирать свою lib. Просто хочу собрать уже свои отлаженные модули в lib. Вот и вопрос возник: Как в Минигуи сделать МойПроект.hbp для сборки нескольких .prg в МояБиблиотека.lib ?

gfilatov2002: Andrey пишет: Как в Минигуи сделать МойПроект.hbp для сборки нескольких .prg в МояБиблиотека.lib ? Посмотри мой проект, которым я сейчас собираю библиотеку: [pre2] # # hmg.hbp # -hblib -inc -o../lib/minigui -I../include -w3 -es2 -ko -q0 -hbx=../include/hmg.hbx -cflag=-DWIN32_LEAN_AND_MEAN c_bitmap.c c_browse.c c_btntextbox.c c_button.c c_checkbox.c c_chklabel.c c_chklistbox.c c_combo.c c_controlmisc.c c_crypt.c c_cursor.c c_datepicker.c c_dialog.c c_dialogs.c c_editbox.c c_folder.c c_font.c c_frame.c c_getbox.c c_graph.c c_grid.c c_help.c c_hotkey.c c_hotkeybox.c c_image.c c_imagelist.c c_ini.c c_ipaddress.c c_label.c c_listbox.c c_media.c c_menu.c c_monthcal.c c_msgbox.c c_pager.c c_progressbar.c c_radio.c c_registry.c c_resource.c c_richeditbox.c c_scrsaver.c c_slider.c c_spinner.c c_status.c c_tab.c c_textbox.c c_timer.c c_toolbar.c c_tree.c c_winapimisc.c c_windows.c c_windowsMDI.c c_winprop.c c_winxp.c ErrorSys.prg h_activex.prg h_browse.prg h_btntextbox.prg h_button.prg h_checkbox.prg h_chklabel.prg h_chklistbox.prg h_combo.prg h_controlmisc.prg h_crypt.prg h_datepicker.prg h_dialog.prg h_dialogs.prg h_draw.prg h_edit.prg h_edit_ex.prg h_editbox.prg h_error.prg h_events.prg h_folder.prg h_font.prg h_frame.prg h_getbox.prg h_gradient.prg h_graph.prg h_grid.prg h_help.prg h_hotkey.prg h_hotkeybox.prg h_hyperlink.prg h_image.prg h_imagelist.prg h_ini.prg h_init.prg h_ipaddress.prg h_label.prg h_listbox.prg h_media.prg h_menu.prg h_monthcal.prg h_mru.prg h_msgbox.prg h_pager.prg h_progressbar.prg h_radio.prg h_registry.prg h_report.prg h_richeditbox.prg h_scrsaver.prg h_slider.prg h_socket.prg h_spinner.prg h_status.prg h_tab.prg h_textbox.prg h_timer.prg h_toolbar.prg h_tree.prg h_wbrush.prg h_winapimisc.prg h_windows.prg h_windowsMDI.prg h_winprop.prg [/pre2]

Andrey: gfilatov2002 пишет: Посмотри мой проект, которым я сейчас собираю библиотеку: Спасибо БОЛЬШОЕ ! И поясни пожалуйста вот про эти 2 флага: -hbx=../include/hmg.hbx -cflag=-DWIN32_LEAN_AND_MEAN

Andrey: Поиск в гугле по: hmg.hbx выдаёт: HBX- бризантные высоковзрывчатые вещества. HE- фугасный снаряд. ... головной частью. HMG- тяжелый(станковый крупнокалиберный) пулемет.

gfilatov2002: Andrey пишет: поясни пожалуйста вот про эти 2 флага: -hbx=../include/hmg.hbx -cflag=-DWIN32_LEAN_AND_MEAN Ключ -hbx указывает утилите hbmk2 путь к файлу .HBX, который нужен для декларации всех функций библиотеки как EXTERNAL. Примечание. Используется в заголовке minigui\include\mgextern.ch Ключ -cflag указывает Си-компилятору дополнительный пользовательский переключатель. В данном случае это позволяет генерировать .OBJ модули меньшего размера. Если в твоей библиотеке НЕТ сишных модулей, то он НЕ нужен

Andrey: Спасибо !

Vlad04: gfilatov2002 цитата: программирование поддерживало все приемы ОПП Существует незавершенный открытый проект от автора Minigui, датированный 2010 годом, под названием HMG OBJECTS, который поддерживает полноценное ОПП Это , наверно было очень давно. В версиях hmg.3.4.1 и предыдущих нет следов HMG OBJECTS. Или я плохо искал ?

Vlad04: SergKis цитата: программирование поддерживало все приемы ОПП сам напиши классы, обвесив функции окон, контролов MiniGui - не так и сложно А примерчик небольшой можно? Окно с Бровсом и кнопочками

Dima: Vlad04 Да вот оно вроде http://sourceforge.net/projects/oohg/

SergKis: Vlad04 лови test

Vlad04: Да....Совсем не просто!

SergKis: Vlad04 пишет:Совсем не просто! В чем затруднения ? Знать классы в рамках описания от А. Кресина надо, понимания MiniGui тоже, это минимум от которого плясать. В примере еще много мусора (пробы разные), а так до PVN*.PRG - это базовые (абстрактные) заготовки классов, а PVN*.PRG - уже наследование и сама задача, там 2-окна (mdi main и mdi child) и 3-и browse в child, отображаемые по одному в зависимости от режима.

digikv: есть ли onKeyDown в TSBrowse?

Haz: digikv пишет: есть ли onKeyDown в TSBrowse в исходнике ... METHOD KeyChar( nKey, nFlags ) METHOD KeyDown( nKey, nFlags ) METHOD KeyUp( nKey, nFlags )

digikv: Я ищу event onKeyDown в TSBrowse нет Method

Haz: digikv пишет: Я ищу event onKeyDown в TSBrowse В TSBrowse есть method KeyDown , в этом методе есть обработка ::bUserKeys. event onKeyDown можно отловить через ::bUserKeys. Использование ::bUserKeys есть в примерах по TSBrowse Примерно так : где xRet - это или код клавиши которую обработает метод ::KeyDown() или логическое значение ( см обработку в исходнике ::KeyDown() ) [pre2] oBrw:bUserKeys := { || onKeyDown(nKey, nFlag, oBrw) } FUNCTION onKeyDown( nKey, nFlag, oBrw ) local xRet DO CASE CASE nKey == ... END RETURN xRet [/pre2]

digikv: благодарю вас

digikv: Почему nRecNo всегда 0 в LOCAL nRecNo := GetProperty( "oDlg", 'oBrw', 'VALUE' ) #include "minigui.ch" #include "tsbrowse.ch" STATIC oDlg, oFind, nOrd, nRet FUNCTION dbChoice( cAlias, bBlock, cTitle, bWork, cOrder ) Local oFont nOrd := (cAlias)->( ordSetFocus( cOrder ) ) DEFINE WINDOW oDlg AT 0,0 WIDTH 410 HEIGHT 510 TITLE cTitle ICON "KASA" CHILD DEFINE LABEL oFind ROW 0 COL 0 WIDTH 410 HEIGHT 24 FONTNAME 'Times New Roman' FONTSIZE 14 VALUE "" END LABEL @ 25,0 TBROWSE oBrw ALIAS cAlias; OF oDlg ; WIDTH 380; HEIGHT 400 ; HEADERS "" ; WIDTHS 400; FIELDS (cAlias)->Naziv; FONT 'Times New Roman' SIZE 12 oBrw:bUserKeys := { |nKey, nFlag| onKeyDown(nKey, nFlag, cAlias ) } END WINDOW oDlg.Center ACTIVATE WINDOW oDlg RETURN nRet FUNCTION onKeyDown( nKey, nFlag, cAlias ) LOCAL cFind := GetProperty( "oDlg", 'oFind', 'VALUE' ) LOCAL nRecNo := GetProperty( "oDlg", 'oBrw', 'VALUE' ) IF nKey==VK_RETURN (cAlias)->(dbGoTo(nRecNo)) nRet := (cAlias)->Sifra msginfo('nRet='+STR(nRet)+' RecNo()='+STR(nRecNo) ) (cAlias)->(ordScope( 0, )) (cAlias)->(ordScope( 1, )) (cAlias)->( ordSetFocus( nOrd ) ) RELEASE WINDOW oDlg ELSEIF nKey==VK_ESCAPE nRet:=0 (cAlias)->(ordScope( 0, )) (cAlias)->(ordScope( 1, )) (cAlias)->( ordSetFocus( nOrd ) ) RELEASE WINDOW oDlg ELSEIF nKey == VK_UP ELSEIF nKey == VK_LEFT ELSEIF nKey == VK_RIGHT ELSEIF nKey == VK_DOWN ELSEIF nKey == VK_NEXT ELSEIF nKey == VK_PRIOR ELSEIF nKey == VK_END ELSEIF nKey == VK_HOME ELSEIF nKey == VK_INSERT ELSEIF nKey == VK_BACK SetProperty( "oDlg", 'oFind', 'VALUE', LEFT( cFind, LEN( cFind ) - 1) ) oDlg.oFind.REFRESH() cFind := GetProperty( "oDlg", 'oFind', 'VALUE' ) (cAlias)->(ordScope( 0, cFind )) (cAlias)->(ordScope( 1, cFind )) oDlg.oBrw.REFRESH() ELSEIF nKey >= 32 .AND. nKey <= 255 SetProperty( "oDlg", 'oFind', 'VALUE', cFind+UPPER(CHR( nKey )) ) oDlg.oFind.REFRESH() cFind := GetProperty( "oDlg", 'oFind', 'VALUE' ) (cAlias)->(ordScope( 0, cFind )) (cAlias)->(ordScope( 1, cFind )) oDlg.oBrw.REFRESH() ENDIF RETURN .T.

Haz: digikv пишет: Почему nRecNo всегда 0 в TS нет Value == Recno() Попробуйте так nRecNo := (oBrw:cAlias)->(RecNo()) PS dbGoTo(nRecNo) - не приведет к установке бровса на нужную запись, для этого там есть метод :GotoRecNo()

digikv: Я читал в MiniGui.chm PROPERTIES: · Value Set / Gets browse value - selected record number Теперь все работает правильно. Еще раз спасибо за вашу помощь.

Haz: digikv пишет: Я читал в MiniGui.chm PROPERTIES: · Value Set / Gets browse value - selected record number Это правильно для BROWSE , а не для TSBROWSE

Andrey: Григорий ! Возвращаюсь к вопросу по иконкам. Будут ли какие то улучшения в библиотеке для иконок ? Можно примерно так: Для любой иконки содержащиеся в своих ресурсах @ 10,10 ICON Icon_1 PICTURE "Calc64x1" WIDTH 64 HEIGHT 64 RESTYPE INTERNAL Для любой иконки содержащиеся в чужих ресурсах cFile := System.SystemFolder + "\shell32.dll" @ 10,10 ICON Icon_1 PICTURE "Icon_164" WIDTH 128 HEIGHT 128 RESTYPE EXTERNAL FILE cFile Можно и короче (WIDTH 128 HEIGHT 128) -> (SIZE 128) Народ, кто что думает по этому вопросу ? Кому не хватает простого вывода иконки на ЦВЕТНУЮ форму ?

krutoff: SergKis пишет: лови test Тоже хотел посмотреть, но ссылка битая. Файлообменник уже удалил... Andrey пишет: Кому не хватает простого вывода иконки на ЦВЕТНУЮ форму ? Я бы от такого тоже не отказался, поддерживаю.

SergKis: krutoff пишет: Тоже хотел посмотреть тут click here

gfilatov2002: Andrey пишет: Будут ли какие то улучшения в библиотеке для иконок ? Мечты сбываются Прямо сейчас прорабатываю новую команду с таким синтаксисом #xcommand DRAW ICON IN WINDOW <windowname> AT <row>,<col> ; PICTURE <filename> ; [ WIDTH <w> ] ; [ HEIGHT <h> ] ; [ COLOR <rgb> ] ; [ <transparent: TRANSPARENT> ] ; => ; drawicon(<"windowname">,<filename>,<row>,<col>,[<w>],[<h>],[<rgb>],<.transparent.>) где filename - это имя файла на диске или внутреннего ресурса программы Примечание. Вскрытие показало, что WinAPI-функция ExtractIcon() возвращает иконки только стандартного размера 32х32

Andrey: gfilatov2002 пишет: Прямо сейчас прорабатываю новую команду с таким синтаксисом Ура !

Andrey: gfilatov2002 пишет: DRAW ICON IN WINDOW <windowname> AT <row>,<col> ; PICTURE <filename> ; [ WIDTH <w> ] ; [ HEIGHT <h> ] ; [ COLOR <rgb> ] ; [ <transparent: TRANSPARENT> ] ; Что то не пашет, если на форме лежит ещё цветной LABEL ! Пример отправил на почту... И ещё одно - синтаксис урезать можно ? Сделать без "IN WINDOW Forma_1" и с ним ?

Vlad04: Похоже MiniGui достиг своего Эльбруса (вершины). Идет неспешное причесывание небольшой лохматости.

gfilatov2002: Vlad04 пишет: MiniGui достиг своего Эльбруса Это невозможно, поскольку WinAPI продолжает развиваться (особенно, с выходом Win10) Например, в библиотеке напрочь отсутствует поддержка toast-сообщений, основанных на вызове WinRT методов

Andrey: gfilatov2002 пишет: оддержка toast-сообщений, основанных на вызове WinRT методов Это для чего ? Нам инструмент нужен для создания полноценных приложений для бухов и т.д. Чего не хватает: 1) Редактора форм (то что есть уж очень негибкие), посмотрет тот же хХарбор - там редактор форм получше. 2) Работа с Png - чтобы картинки на форме не выглядели обгрызано !!! И можно тогда отказаться от иконок (.ico) 3) Работа с Png в Tsbrowse. Там вообще с png-непонятно... 4) Раздела (доки или примеров) работы с DLL. 4) Ну наверное в хелпер нужно дать короткое описание примеров, кто зачем и почему.

Петр: Andrey пишет: Чего не хватает: И что вы можете предложить из указанного списка?

Andrey: Петр пишет: И что вы можете предложить из указанного списка? Так я и написал, с чем не могу разобраться. Уже давно. А с чем я разбираюсь, то примеры посылаю Григорию. Чем могу, отвечаю на форуме. Но всё равно - первоисточник это библиотека Григория.

ММК: Andrey пишет: 1) Редактора форм (то что есть уж очень негибкие), посмотрет тот же хХарбор - там редактор форм получше. Извините , не понял. Что это за редактор форм для Харбора?

Vlad04: ММК Что это за редактор форм для Харбора? Прикалываешься? Дизайнер форм. В FW вас и таким не балуют? Сразу Ms Студию подавай.

Andrey: Петр пишет: И что вы можете предложить из указанного списка? Из списка не могу, но с чем разобрался, то отдаю в общую копилку. Вот для новичков и другим - http://hmgextended.com/applications.html

ММК: Vlad04 пишет: Прикалываешься? Дизайнер форм. Нет. Не знал ,что такое есть Vlad04 пишет: В FW вас и таким не балуют? Да о чем Вы говорите!Так. По мелочи ... Для народа с традиционной направленностью - Ms студия,UEStudio. Любителям легкого экстрима VISUAL или http://forums.fivetechsupport.com/viewtopic.php?f=3&t=29991&start=240

ZAlex: ММК пишет: Да о чем Вы говорите!Так. По мелочи ... Ну да. Вот для заготовок: https://bitbucket.org/fivetech/fivewin-contributions/downloads/design.zip

Vlad04: UEStudio Это что продукт ?

Dima: Vlad04 Тут

ММК: ZAlex пишет: Ну да. Вот для заготовок: https://bitbucket.org/fivetech/fivewin-contributions/downloads/design.zip Ну что Вы :)) Это просто примерчик работы с design. А "по жизни" все ,что есть на экране делает любой ресурс редактор. Например WorkShop или ResHacker

ММК: Dima пишет: Vlad04 Тут Да, это универсальное IDE . В FW под него сделан файл настроек. Вы можете сделать такой же и для минигуи :)

Andrey: ММК пишет: А "по жизни" все ,что есть на экране делает любой ресурс редактор. Например WorkShop или ResHacker А обвязки для МиниГуи нет !

Dima: Andrey пишет: А обвязки для МиниГуи нет ! ММК Михаил дай Андрею обвязку :)

Andrey: Dima пишет: Михаил дай Андрею обвязку :) Ага... Вокруг шеи... Можно заодно обвалку, обсыпку, и т.д.

Andrey: Всем привет ! Вот из ранее описанных "хотелок", Григорий добавил пример в свою библиотеку MiniGUI\SAMPLES\BASIC\Icons\demo2.prg Пример показа иконок из внешней myicons.dll А как самому собрать свою DLL-ку с иконками и картинками ? Раньше пытался это сделать, но так и не смог... Сейчас проект вообще раздулся и очень много пересекающихся ресурсов, наверное их лучше держать в отдельной dll-ке. И еще как показывать картинки из своих/чужих внешних DLL ?

Петр: Andrey пишет: Вот из ранее описанных "хотелок", Григорий добавил пример в свою библиотеку MiniGUI\SAMPLES\BASIC\Icons\demo2.prg Пример показа иконок из внешней myicons.dll А как самому собрать свою DLL-ку с иконками и картинками ? В папку MyIcons глянуть не судьба? Сборка myicons.dll с помощью hbmk2 и ResourceHacker.

Andrey: Петр пишет: В папку MyIcons глянуть не судьба? Глянул. Хороший пример ! Уже сделал сборку своей dll-ки. Обошёлся без внешних утилит, один BCC. Собирать можно только на нём, только с ключами сборки помучился... Свой пример передам Григорию, пускай включает для всех ! И ещё один вопрос по примеру SAMPLES\BASIC\Icons\demo.prg Там считывание иконки по размеру иконки: [pre2] hIcon := LoadIconByName( cIcon, 128, 128 ) [/pre2] А как считать иконки по порядку следования в директории/контейнере иконок ?

Петр: Andrey пишет: Уже сделал сборку своей dll-ки. Обошёлся без внешних утилит, один BCC. Собирать можно только на нём, только с ключами сборки помучился... Свой пример передам Григорию, пускай включает для всех ! И шо с этим примером будут делать пользователи mingw? А как считать иконки по порядку следования в директории/контейнере иконок ? А это вам зачем, стесняюсь спросить?

Andrey: Петр пишет: И шо с этим примером будут делать пользователи mingw? Ну пускай переделывают скрип сборки под mingw. У Григория же сборка под BCC, а там нормально батник отрабатывает. Петр пишет: А это вам зачем, стесняюсь спросить? Есть ряд иконок одного размера. Собираю в один файл иконок (директорию/контейнер). А как их выводить ? Размер же одинаков. Функцией hIcon := LoadIconByName( cIcon, 128, 128 ) обойтись же нельзя ! Есть функция по считыванию иконки по номеру иконки в контейнере иконок ? Для использования показа иконок как в примерах SAMPLES\BASIC\WAIT_WINDOW_2

Петр: Andrey пишет: Ну пускай переделывают скрип сборки под mingw. У Григория же сборка под BCC, а там нормально батник отрабатывает. аргумент железный.. Есть функция по считыванию иконки по номеру иконки в контейнере иконок ? Нет. Но не трудно, наверное, написать. Просто никому не приходила в голову такая фигня Есть ряд иконок одного размера. Собираю в один файл иконок (директорию/контейнер) Ну раз вы стали первопроходцем, то можете "переделать" исхоДники MiniGUI (хотя бы для BCC )

Andrey: Петр пишет: Нет. Но не трудно, наверное, написать. Мне трудно... Я в С вообще никак... Петр пишет: Ну раз вы стали первопроходцем, то можете "переделать" исхоники MiniGUI (хотя бы для BCC ) А в чём я стал первопроходцем ?

Петр: Andrey пишет: А в чём я стал первопроходцем ? Петр пишет: Просто никому не приходила в голову такая фигня: "Есть ряд иконок одного размера. Собираю в один файл иконок (директорию/контейнер)" Автор примеров Basic\Icons советует время от времени что-то читать, даже ссылки дает * A Quick & Easy guide to Microsoft Windows Icon Size * https://www.creativefreedom.co.uk/icon-designers-blog/windows-7-icon-sizes/ конечно - это не документация от MS, но какое элементарное понятие получить можно "about by the flexibility of the ICO format and its ability to ‘contain’ many image sizes and colour depths"

Andrey: В англоязычной документации встречал понятие директория иконок. Дима где то здесь на форуме мне указывал, что не иконка а контейнер иконок. Из за этого и так написал - (директорию/контейнер). ссылка = h t t p s ://en.m.wikipedia.org/wiki/ICO_(file_format) Icon resource structure An ICO or CUR file is made up of an ICONDIR ("Icon directory") structure, containing an ICONDIRENTRY structure for each image in the file, followed by a contiguous block of all image bitmap data (which may be in either Windows BMP format, .... и т.д.....[/pre2] Не важно как назовешь - лишь бы в печку не поставили !

Петр: Andrey пишет: Не важно как назовешь - лишь бы в печку не поставили ! Как правило, в ICO содержится картинка одного и того же обьекта разных (тем не менее стандарных) размеров и с разными разрешениями. То, что вы пытаетесь сделать - более свойственно для формата ICL, а поскольку этот формат устарел, более естественно для Windows хранить ресурсы в dll (насколько я припоминаю - icl файл по своей сути 16 битная dll). Не умеете хранить в dll, храните в dbf. Я уже писал - делайте так как умеете, желательно используя стандартные решения.

Andrey: Всем привет ! Очень хочется иметь 2 функции для работы с окнами, типа: 1) aObjColor := FormColorSave(aBackColor,aFontColor) - сохранение фона и цвета ВСЕХ объектов на форме и изменение их на новые - (aBackColor,aFontColor) . 2) FormColorRestore(aObjColor) - восстановить первоначальные цвета/фон для ВСЕХ объектов на форме. Хочется затенять форму, когда делаешь выбор на ней, чтобы юзер видел только ТЕКУЩИЙ выбор - активную форму.

SergKis: Andrey пишет Очень хочется иметь 2 функции для работы с окнами, типа: Что мешает сделать их. Обход всех контролов окна ты знаешь как делать Функции такие тоже :[pre2] RetVal := GetProperty(cForm, 'BACKCOLOR') SetProperty(cForm, 'BACKCOLOR', Value) RetVal := GetProperty(cForm, cControl, 'BACKCOLOR') SetProperty(cForm, cControl, 'BACKCOLOR', Value) RetVal := GetProperty(cForm, cControl, 'FONTCOLOR') SetProperty(cForm, cControl, 'FONTCOLOR', Value) [/pre2] Бери руки в ноги и вперед

SergKis: PS сделанным можешь поделиться

alex_II: Было бы полезно иметь на ToolBar элемент Label аналогичный Button, для более наглядного показа важной информации. StatusBar для этого не подходит из-за своего ограниченного размера.

Dima: Andrey пишет: Хочется затенять форму, когда делаешь выбор на ней уже обсуждали да и решение есть

SergKis: alex_II пишет Было бы полезно иметь на ToolBar элемент Label аналогичный Button, для более наглядного показа важной информации. Поиск в MiniGui\Include по *.ch key = SPLITBOX VERSION дал результат i_combobox.ch i_editbox.ch i_grid.ch i_listbox.ch i_richeditbox.ch i_tree.ch ToolBar на SplitBox + выше указанные контролы должны работать.

Andrey: Dima пишет: уже обсуждали да и решение есть Пропустил это. Какое решение уже есть ?

Dima: Andrey в этой теме копай

SergKis: alex_II BASIC\TOOLBAR_1\demo.prg правим чуток [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2002-2008 Roberto Lopez <harbourminigui@gmail.com> * http://harbourminigui.googlepages.com/ */ #include "minigui.ch" Function Main Local aRows := {} AEval({ ; {'Simpson','Homer','555-5555'} , ; {'Mulder','Fox','324-6432'} , ; {'Smart','Max','432-5892'} , ; {'Grillo','Pepe','894-2332'} , ; {'Kirk','James','346-9873'} , ; {'Barriga','Carlos','394-9654'} , ; {'Flanders','Ned','435-3211'} , ; {'Smith','John','123-1234'} , ; {'Pedemonti','Flavio','000-0000'} , ; {'Gomez','Juan','583-4832'} , ; {'Fernandez','Raul','321-4332'} , ; {'Borges','Javier','326-9430'} , ; {'Alvarez','Alberto','543-7898'} , ; {'Gonzalez','Ambo','437-8473'} , ; {'Batistuta','Gol','485-2843'} , ; {'Vinazzi','Amigo','394-5983'} , ; {'Pedemonti','Flavio','534-7984'} , ; {'Samarbide','Armando','854-7873'} , ; {'Pradon','Alejandra','???-????'} , ; {'Reyes','Monica','432-5836'} ; } , {|a| AAdd(aRows, { a[1], a[2] }) }) DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI ToolBar Demo' ; ICON 'DEMO.ICO' ; MAIN ; FONT 'Arial' SIZE 10 DEFINE STATUSBAR STATUSITEM 'HMG Power Ready!' END STATUSBAR DEFINE MAIN MENU POPUP '&File' ITEM 'Get ToolBar_3 Button_1' ACTION MsgInfo ( if ( Form_1.Button_1c.Value , '.T.' , '.F.' ) , 'Button_1c' ) ITEM 'Get ToolBar_3 Button_2' ACTION MsgInfo ( if ( Form_1.Button_2c.Value , '.T.' , '.F.' ) , 'Button_2c' ) ITEM 'Get ToolBar_3 Button_3' ACTION MsgInfo ( if ( Form_1.Button_3c.Value , '.T.' , '.F.' ) , 'Button_3c' ) ITEM 'Get ToolBar_3 Button_4' ACTION MsgInfo ( if ( Form_1.Button_4c.Value , '.T.' , '.F.' ) , 'Button_4c' ) SEPARATOR ITEM 'Set ToolBar_3 Button_1' ACTION Form_1.Button_1c.Value := .T. ITEM 'Set ToolBar_3 Button_2' ACTION Form_1.Button_2c.Value := .T. ITEM 'Set ToolBar_3 Button_3' ACTION Form_1.Button_3c.Value := .T. ITEM 'Set ToolBar_3 Button_4' ACTION Form_1.Button_4c.Value := .T. SEPARATOR ITEM '&Exit' ACTION Form_1.Release END POPUP POPUP '&Help' ITEM '&About' ACTION MsgInfo ("MiniGUI ToolBar demo") END POPUP END MENU DEFINE SPLITBOX GRID Grid_2 ; WIDTH 400 ; HEIGHT 70 ; HEADERS {'Last Name','First Name'} ; WIDTHS { 90, 90}; ITEMS aRows ; VALUE 1 ; JUSTIFY { BROWSE_JTFY_LEFT,BROWSE_JTFY_CENTER } DEFINE TOOLBAR ToolBar_a BUTTONSIZE 45,40 FONT 'Arial' SIZE 8 FLAT BUTTON Button_1a ; CAPTION '&Undo' ; PICTURE 'button4.bmp' ; ACTION MsgInfo('Click! 1') BUTTON Button_2a ; CAPTION '&Save' ; PICTURE 'button5.bmp' ; WHOLEDROPDOWN DEFINE DROPDOWN MENU BUTTON Button_2a ITEM 'Exit' ACTION Form_1.Release POPUP 'More' ITEM 'Disable ToolBar 1 Button 1' ACTION Form_1.Button_1a.Enabled := .F. ITEM 'Enable ToolBar 1 Button 1' ACTION Form_1.Button_1a.Enabled := .T. END POPUP ITEM 'About' ACTION MsgInfo ("MiniGUI ToolBar Demo") END MENU BUTTON Button_3a ; CAPTION '&Close' ; PICTURE 'button6.bmp' ; ACTION MsgInfo('Click! 3') ; DROPDOWN DEFINE DROPDOWN MENU BUTTON Button_3a ITEM 'Disable ToolBar 1 Button 1' ACTION Form_1.Button_1a.Enabled := .F. ITEM 'Enable ToolBar 1 Button 1' ACTION Form_1.Button_1a.Enabled := .T. END MENU END TOOLBAR DEFINE TOOLBAR ToolBar_b BUTTONSIZE 45,40 FONT 'ARIAL' SIZE 8 FLAT BUTTON Button_1b ; CAPTION 'More ToolBars...' ; PICTURE 'button7.bmp' ; ACTION MsgInfo('Click! 1'); BUTTON Button_2b ; CAPTION 'Button 2' ; PICTURE 'button8.bmp' ; ACTION MsgInfo('Click! 2'); SEPARATOR BUTTON Button_3b ; CAPTION 'Button 3' ; PICTURE 'button7.bmp' ; ACTION MsgInfo('Click! 3') END TOOLBAR DEFINE TOOLBAR ToolBar_c BUTTONSIZE 45,40 FONT 'Arial' SIZE 8 CAPTION 'ToolBar 3' FLAT BUTTON Button_1c ; CAPTION 'Check 1' ; PICTURE 'button4.bmp' ; ACTION MsgInfo('Hey!'); CHECK GROUP BUTTON Button_2c ; CAPTION 'Check 2' ; PICTURE 'button5.bmp' ; ACTION MsgInfo('Hey!') ; CHECK GROUP BUTTON Button_3c ; CAPTION 'Check 3' ; PICTURE 'button6.bmp' ; ACTION MsgInfo('Hey!') ; SEPARATOR; CHECK GROUP BUTTON Button_4c ; CAPTION 'Help Check' ; PICTURE 'button9.bmp' ; ACTION MsgInfo('Hey!') ; CHECK END TOOLBAR COMBOBOX Combo_1 ; WIDTH 100 ; ITEMS { '1 | Uno' , '2 | Dos' , '3 | tres' } ; VALUE 1 ; ON ENTER MsgInfo ( Form_1.Combo_1.ITEMHEIGHT ) ; UPPERCASE ; ITEMHEIGHT 21 ; FONT 'Courier' SIZE 12 EDITBOX Edit_1 ; WIDTH 100 ; HEIGHT 40 ; VALUE '12345'+CRLF+'67890' ; READONLY ; NOVSCROLL NOHSCROLL END SPLITBOX END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil [/pre2] работает

Andrey: SergKis пишет: сделанным можешь поделиться Делаю. Потом поделюсь.

alex_II: SergKis пишет: Поиск в MiniGui\Include по *.ch key = SPLITBOX VERSION дал результат i_combobox.ch i_editbox.ch i_grid.ch i_listbox.ch i_richeditbox.ch i_tree.ch ToolBar на SplitBox + выше указанные контролы должны работать. Прошу прощения, но я писал про Label

SergKis: alex_II пишет Прошу прощения, но я писал про Label Любой из использованных в примере контролов прекрасно заменяет label: - grid убираем header и оставляем одну строку - editbox - многострочный вариант или одна строка + readonly - combobox однострочный идет

Andrey: SergKis пишет: сделанным можешь поделиться Сделал (СПАСИБО за помощь !), опять непонятки.... Я сделал задание цветов универсальным, можно любой цвет задать... Вот так выглядит под Win 8.1 При нажатие на кнопке, меню лист и в бровсе: После закрытия MsgDebug() все цвета возвращаются в норму ! Отлично, то что хотелось. Вот так выглядит под Win 7 Поелозим MsgDebug() на форме и все цвета бровса возвращаются.... После закрытия MsgDebug() выглядит так: Стрелки кто-то отгрыз ! Если мышкой поелозить по скролингу, стрелки появляются... Для блокировки таблицы делаю вот так:[pre2] ELSEIF cCtrlType == "TBROWSE" oBrw := TsbObj( cCtrlName, cFormName ) oBrw:lEnabled := .F. // блокировать область таблицы (Строки не отображаются)[/pre2] Для разблокировки делаю так: [pre2] ELSEIF cCtrlType == "TBROWSE" oBrw := TsbObj( cCtrlName, cFormName ) oBrw:lEnabled := .T. // разблокировать область таблицы (Строки отображаются) // обязательно перечитать состояние вертикального скролинга oBrw:ResetVScroll( .T. ) oBrw:oHScroll:SetRange( 0, 0 ) oBrw:Refresh(.T., .T.) [/pre2] Что сделать ещё нужно, для одинаковой работы ?

rvu: А есть ли в Минигуи свой браузер? Хочется открыть в окошке файл .html и управлять параметрами этого окошка. А если бы можно было туда добавлять свои кнопки, типа печати, было бы совсем здорово. Может быть такое уже есть? Я сейчас копаюсь в примерах, пока ничего не нашел.

Dima: rvu Поиск по примерам shell.explorer

rvu: Dima Огромное спасибо!

Dima: rvu Для IE не забываем oActiveX:Silent := 1

rvu: В html есть несколько фреймов. А как программным путем сделать конкретный фрейм активным? Хочу сделать кнопки печати сверху браузера, но чтобы они с разными фреймами работали. Или как вариант - узнать имя файла открытого именно в этом фрейме в данный момент времени. Это можно?

SergKis: rvu пишет А как программным путем сделать конкретный фрейм активным? на hb это не делал, пробовал на AoutoIt, думается суть работы должна быть похожа [pre2] 1. #include <IE.au3>; подключаем библиотеку $oIE=_IECreate("http://10.3.30.103:9080/Main/login.html") _IELoadWait($oIE) $oFrame=_IEFrameGetCollection($oIE) $oObj=_IEGetObjById($oFrame,'j_username'); здесь поле ввода логина _IEAction($oObj,'focus'); фокус на поле логина _IEAction($oObj,'CLICK'); клик на логине 2. $oInputs=_IETagNameGetCollection($oIE,'input') ;Наводим фокус на поле логина For $oInput In $oInputs If $oInput.type=='text' and $oInput.name=='j_username' Then _IEAction($oInput,"focus") ExitLoop EndIf Next [/pre2]

rvu: Засада оказалось в другом месте. Печать работает только для всех фреймов сразу. Как ее сделать для одного фрейма не понял. Пока что повесил кнопку прямо во фрейме, в html, хотя мне это и не нравится.

SergKis: rvu Может якорь белый текст на белом фоне вместо кнопки и его исполнять

Andrey: Чем отличается работа МиниГуи в Win7 от Win8.1 ? Сам пишу программу под Win8.1, ошибок нет, всё прекрасно работает. Под Win7 при показе вылетает и всё тут. Пытаюсь повторить эту ошибку у себя - нет ошибки. Совсем нет. Пример: Как поймать эти ошибки ? Сделать запись в текстовый лог всех нажатий мышки на формах ? А как ?

Haz: Andrey пишет: Чем отличается работа МиниГуи в Win7 от Win8.1 ? Как минимум разные версии виндовс могут в разном порядке обрабатывать события. Сталкивался на W7 и Server2003 Как поймать эти ошибки ? Установить себе W7

Dima: Andrey пишет: Сам пишу программу под Win8.1 А на ней кто то работает еще ? Народ в основном юзает XP(почти уходит на нет) ,7(как правило эту ось юзают) или 10(таких не много)

Andrey: Dima пишет: А на ней кто то работает еще ? Да нет, под Win8.1 мало кто сидит. В основном народ уже уходит на 10-ку. Просто Win8.1 как и 10-ка меньше проблем, МиниГуи - рулит ! На них прога работает отлично, под Windows Server 2008/2012 тоже проблем нет, а вот под 7-кой начинает вылетать моя прога. В самых неожиданных местах. Принудительно клиента перевести не могу. Видно придётся ждать, пока клиент созреет сам перейти на 10-ку.

Haz: Andrey пишет: вот под 7-кой начинает вылетать моя прога На работе 7ка и server2003 дома 10ка… Нигде ни чего не вылетает. Вернее все вылеты устранены.

Vlad04: Уважаемые коллеги! Пора двигаться вперед с Харбором, подтягивать программу к интернету. А то точно останемся на обочине. Всё чиним, чиним, деревянные колеса в своей телеге, когда все уже давно пересели на машины.

Andrey: Vlad04 пишет: Пора двигаться вперед с Харбором, подтягивать программу к интернету. А то точно останемся на обочине. Не понятное предложение, очень расплывчатое. Более подробнее опишите что нужно.

Andrey: Григорий давал такой код для показа иконок на форме: [pre2] DEFINE WINDOW Form_Main ... .... ON GOTFOCUS RefreshWin( ThisWindow.Handle ) ; .... DRAW ICON IN WINDOW Form_Main AT .... ...[/pre2] и функцию эту [pre2]// перересовка объектов на форме #define WM_PAINT 15 *--------------------------------------------------------* Static Procedure RefreshWin( hWnd ) *--------------------------------------------------------* SendMessage( hWnd, WM_PAINT, 0, 0 ) Do Events Return[/pre2] Надоело таскать это из проекта в другие проекты. Можно вставить эту функцию в МиниГуи ? Или можно по другому уже делать ?

Andrey: SergKis пишет: А RefreshWnd(hWnd), попробуй сделать в свой ch или prg #xtranslate RefreshWnd( <hWnd> ) => SendMessage( <hWnd> , 15 , 0 , 0 ) ; DoEvents() // WM_PAINT 15 Нет, не компилируется... Вот такая ошибка: [pre2]Harbour 3.2.0dev (r2104281802) Copyright (c) 1999-2021, https://harbour.github.io/ test-tsbview.prg(51) Error E0030 Syntax error "syntax error at 'ON'" 1 error No code generated.[/pre2] Исходник такой: [pre2] DEFINE WINDOW Form_Main WIDTH nW HEIGHT nH TITLE cTtl ; MAIN NOMAXIMIZE NOSIZE TOPMOST BACKCOLOR aBClr ; ON GOTFOCUS RefreshWin( ThisWindow.Handle ) ; ON INIT {|| This.TopMost := .F., This.Minimize ,; DoEvents(), _wPost(nEvent) /*, _wPost(99)*/ } [/pre2]

SergKis: Andrey пишет Нет, не компилируется... Вот такая ошибка Ты подумал , что получилось после подстановки или посмотрел файл после препроцессора, параметр -p... ? добавь скобки тут #xtranslate RefreshWnd( <hWnd> ) => ( SendMessage( <hWnd> , 15 , 0 , 0 ) ; DoEvents() ) или в ON GOTFOCUS ( ... ) или {|| ... }

Andrey: SergKis пишет: Ты подумал , что получилось после подстановки или посмотрел файл после препроцессора, параметр -p... ? добавь скобки тут Да я думал, что уже готовое решение ...

Andrey: [pre2]DRAW ICON IN WINDOW ....[/pre2] Можно ли добавить к этой программе возможности смены курсора на этом объекте и обработку клика мышки на этой иконке ?

gfilatov2002: Andrey пишет: возможности смены курсора на этом объекте и обработку клика мышки Да, это можно сделать Посмотри, как это работает в примере ниже (доработан пример из папки samples\Basic\Icons): [pre2]/* * Author: P.Chornyj <myorg63@mail.ru> * * A Quick & Easy guide to Microsoft Windows Icon Size * https://www.creativefreedom.co.uk/icon-designers-blog/windows-7-icon-sizes/ */ ANNOUNCE RDDSYS #include "hmg.ch" /////////////////////////////////////////////////////////////////////////////// procedure main() local cIcon := 'IconVista.ico', hIcon local aInfo PUBLIC w, h if IsVistaOrLater() hIcon := LoadIconByName( cIcon, 256, 256 ) elseif IsWinXPorLater() hIcon := LoadIconByName( cIcon, 128, 128 ) endif if Empty( hIcon ) quit endif aInfo := GetIconSize( hIcon ) w := aInfo[ 1 ] h := aInfo[ 2 ] define window Form_Main ; clientarea w, h + GetMenuBarHeight() ; title 'Icons Demo' ; main ; nomaximize nosize ; on release ; ( ; DestroyIcon( hIcon ) ; ) define main menu define popup "&File" menuitem "E&xit" action ThisWindow.Release end popup end menu CREATE EVENT ProcName _IconMouseClick() end window draw icon in window Form_Main at 0, 0 hicon hIcon width w height h on key Escape of Form_Main action ThisWindow.Release Form_Main.Center() Form_Main.Activate() return function _IconMouseClick( hWnd, nMsg, wParam, lParam ) LOCAL Flag := _IconMouseCursor() LOCAL RetVal := NIL #define WM_LBUTTONDOWN 513 IF nMsg == WM_LBUTTONDOWN .AND. Flag == .T. IF hWnd == GetFormHandle( "Form_Main" ) // Click in show page to print RetVal := 0 MsgInfo("Mouse Click!") ENDIF ENDIF RETURN RetVal function _IconMouseCursor() LOCAL hWnd, aPos, IsPoint, aCoords := { h/2-10, w/2-10, h/2+10, w/2+10 } STATIC s_Flag := .F. IF _IsWindowDefined ( "Form_Main" ) .AND. ValType( aCoords ) == 'A' hWnd := GetFormHandle( "Form_Main" ) aPos := GetCursorPos( hWnd ) IsPoint := PtInRect( aPos, aCoords ) IF IsPoint == .T. .AND. s_Flag == .F. s_Flag := .T. SetWindowCursor( hWnd, IDC_HAND ) ELSEIF IsPoint == .F. .AND. s_Flag == .T. s_Flag := .F. SetWindowCursor( hWnd, IDC_ARROW ) ENDIF ENDIF RETURN s_Flag [/pre2] В этом примере мышка меняет форму курсора и выполняет действие только в центре иконки

Andrey: gfilatov2002 пишет: Посмотри, как это работает в примере ниже Спасибо БОЛЬШОЕ !

Andrey: В 1С используют стандартный/системный бегунок копирования файлов. А на МиниГуи можно сделать так же ?

gfilatov2002: Andrey пишет: А на МиниГуи можно сделать так же ? Да, это возможно с использованием моей библиотеки shell32, которая есть в дистрибутиве Минигуи вместе с исходниками. См. пример в папке \samples\Basic\Shell32 Сначала запусти тест 1, а затем тест 2, и увидишь на мгновение этот системный диалог.

SergKis: Andrey пишет В 1С используют стандартный/системный бегунок копирования файлов Для пользователя это "распальцовка" программиста, т.к. нужная инф. только в первых 2-х строках и возможно, в бегунке, если есть %, то и струя не обязательна. Время и скорость это не постоянная величина и может прыгать в процессе как в +, так и в - (особенно во внешней сети и плавающего объема инф.). Для пользователя важнее понимать (если он, как привязанный, вылупив глазки, следит за окном) сколько док-тов скопировано (приход\реализация\перемещения\... например в индикации), справочники (названия и кол-во строк\объектов в них в индикации). Соответственно протокол (возможно dbf), что бы с этого протокола что то вытащить, подав как список для выбора (не как из файла с именем blabla.dbf, а как логической структуры: документ, карточка, справочник, ..., могут располагаться в разных, связанных dbf). Копии можно делать в темную (без индикации), например, перед получением отчетной формы, которую клиент делает с подходящей периодичностью.

Andrey: SergKis пишет: Для пользователя это "распальцовка" программиста, т.к. нужная инф. только в первых 2-х строках Согласен на 100% Но пускай будет.... gfilatov2002 пишет: Да, это возможно с использованием моей библиотеки shell32 СПАСИБО БОЛЬШОЕ !

Andrey: Опять возвращаюсь к большим курсорам. Можно ли сделать курсор мышки 128х128 (типа движения по кругу, загрузка) ? Это нужно для ожидания, т.е. пока прога "прочухается", чтобы юзер видел что программа работает. Видел примеры SAMPLES\BASIC\CURSOR_2 и SAMPLES\BASIC\WindowBackground_2 - но они маленькие... Помогите пожалуйста ! Или нельзя в своей программе увеличить курсор мышки ? Пробовал через Настройку - размер увеличивается на все программы.

Andrey: А как ресурс (иконка - ассоциация файла) можно записать в поле базы в формате png или bmp ?

Andrey: А иконку в контекстное меню можно сразу выводить ? gfilatov2002 пишет: Уже можно... Посмотрел. Классно ! Только иконка на белом фоне. Можно его (фон иконки) как исправить, чтобы сливался с фоном меню ?

gfilatov2002: Andrey пишет: ак исправить, чтобы сливался с фоном меню ? Сделал, чтобы убрать белый фон, как было максимально возможно.

Andrey: Достаточно ! Спасибо ! А почему у формы программы МиниГуи углы закруглены ? Это как можно сделать ? Хочу такие же скруглённые формы у себя в программе....

Andrey: MENUITEM 'Menu-1' FONT hFont IMAGE "bDel.bmp" ACTION.... MENUITEM "Exit" FONT hFont ICON "iExit32.ico" ACTION... Имею уже готовые хендлы иконок для ТСБ и отображаю их. [pre2] aContMenu := {} // хендл картинки AADD( aContMenu, { 1 , "Menu-XXX", GETICONFROMRES("iRun32not") } ) AADD( aContMenu, { 2 , "Menu-XXX", GETICONFROMRES("iRun32intr") } ) [/pre2] Нужно делать контекстное меню по колонке ТСБ с этими хендлами Можно это сделать, или нужны только имена для контекстного меню ?

Andrey: Можно ли как то сделать кнопку - мигающей, или gif-ку туда за бабахать ? Юзера просто тупо не замечают красную кнопку появившуюся на форме. Блин и как с ними бороться...

SergKis: Andrey пишет Блин и как с ними бороться... Если смена BackColor не устраивает, то делаешь мамнадцать кнопок в одних координатах (разные цвета, image ...), только одна видимая, остальные hide и крути их в цикле по очереди hide\show, можешь и Label с кликом так же делать Юзера просто тупо не замечают красную кнопку появившуюся на форме А ты оставь только красную кнопку , остальные контролы убери в hide может заметят !? PS Windows update, если не делать, отказываться, через какое то время выключает мышку, клавиатуру ... и пока не начнешь делать перезагрузку (сразу цепляется update) ничего делать не получается.

Andrey: SergKis пишет: А ты оставь только красную кнопку , остальные контролы убери в hide Да это лучшее решение, не подумал об этом. Спасибо !

Andrey: Возвращаюсь к функциям AlertInfo() AlertStop() и т.д. Хотелось бы ещё добавить возможность к этим функциям, навести окончательную красоту для них. Хочется гибкости настроек для них и кнопки сделать с градиентом. Вот примерно так: Вот примерно код который бы хотелось добавить в СТАНДАРТНУЮ поставку МиниГуи. [pre2] ON KEY F2 ACTION {|| // тест кнопки LOCAL aBtnClr := { {189, 30, 73} } // светло-красный LOCAL aFntClr := MAROON LOCAL aBckClr := { 255, 178, 178 } LOCAL cMsg := HB_ValToExp(aTest)+REPL('#;',7) LOCAL cIco := "iStop64" LOCAL cTitle := "Ошибка" LOCAL bInit := Nil, lNoSound := Nil LOCAL aColors := _SetMsgAlertColors( aBackColor ) LOCAL nOldLine := HMG_Alert_MaxLines(5) SET MSGALERT FONTCOLOR TO aFntClr // не ставятся числовые цвета - CLR_HRED SET MSGALERT BACKCOLOR TO aBckClr AlertStop( cMsg, cTitle, cIco, 64, aBtnClr, .T., bInit, lNoSound ) // это текущий синтаксис SET MSGALERT BACKCOLOR TO aColors HMG_Alert_MaxLines(nOldLine) // ------ добавочные переменные -------- //LOCAL aBtnText := {" &Продолжить "} //, aBtnText := {" &Да "," &Нет "} //LOCAL aBtnFntClr := BLUE //SET MSGALERT BTNFONTCOLOR TO BLUE //SET MSGALERT BTNFONTBOLD TO .T. //aGrFill := { { 0.5, CLR_HRED , CLR_WHITE }, { 0.5, CLR_WHITE , CLR_HRED } } //aGrOver := { { 0.5, CLR_RED , CLR_HRED }, { 0.5, CLR_HRED , CLR_RED } } //SET MSGALERT BTNGradientFill TO aGrFill //SET MSGALERT BTNGradientOver TO aGrOver // или новый синтаксис // aBtnGrClr := { aGrFill, aGrOver } // lBtnBold := .T. // AlertStop( cMsg, cTitle, cIco, 64, aBtnGrClr, lTopMost, bInit, lNoSound, aBtnText, aBtnFntClr, lBtnBold ) Return Nil } // AlertStop ( Message, Title, Icon, nSize, aColors, lTopMost, bInit, lNoSound , aBtnFntClr )[/pre2] Григорий, можно это сделать ? Очень хочется... Синтаксис можно поменять, это просто моё видение синтаксиса.

SergKis: Andrey У тебя есть bInit во всех ф-ях AlertStop ( Message, Title, Icon, nSize, aColors, lTopMost, bInit, lNoSound , aBtnFntClr ) вызывается практически последней командой перед END WINDOW, выглядит [pre2] IF HB_ISBLOCK( bBlock ) Do_WindowEventProcedure( bBlock, This.Index, 'WINDOW_INIT' ) ENDIF [/pre2] т.е. блок кода выполняется со средой окна, возьми и замени не устраивающий контрол на свой, которой нравится, можно в тех же координатах, а можно все контролы переставить, поменяв координаты и добавить новые PS. Блок кода, как в событиях :Event(..., {|| ... }) без параметра. Можешь сделать в блоке, т.е. bInit := {|| my01() } STAT FUNCT my01() Local ow := This.Object, aControl Local cWnd := This.Name, aType Local hWnd := This.Handle ... aControl := HMG_GetFormControls (cWnd) aType := ow:GetListType() ... Draw_BtnEx( y, x, oBtn, nWBtn, nHBtn, nGBtn, lRow ) ... This.Width := ... This.Height := ... RETURN Nil

Andrey: SergKis пишет: У тебя есть bInit во всех ф-ях Хочется ГОТОВУЮ и практичную функцию в составе МиниГуи (из коробки), а не заниматься дописыванием уже имеющих функций. И самое ГЛАВНОЕ, я отказался ВЕЗДЕ от правки bInit в своих функциях. Большая прога тупо вылетает на них !!! Я тебе давал логи вылета и так не смог победить эти вылеты. Убрал код в bInit и вылеты прекратились. Так что этим bInit - нельзя пользоваться в БОЛЬШИХ программах, в маленьких работают.

SergKis: Andrey пишет Я тебе давал логи вылета и так не смог победить эти вылеты. Так стиль написания такой, что проще заменить, причем весь код, я тебе про это говорил и писал. Так что этим bInit - нельзя пользоваться в БОЛЬШИХ программах, в маленьких работают Вся hmg на блоках кода, события окон, контролов и ... А bInit простой код в теле окна и заменить BUTTON, на BUTTONEX в тех же или немного др. координатах + изменить размер окна снизу - это оч. простые действия, ты их постоянно делаешь добавляя ф-ии (список целый) после DEFINE TBROWSE ... до END TBROWSE и все это находится в блоке кода события окна\кнопки ...

SergKis: Andrey пишет Хочется ГОТОВУЮ и практичную функцию Можно попробовать вариант задания aBtnColors, для BUTTONEXT, каждый элемент массива задавать объектом THmgData. Тогда код может быть такой [pre2] ... aBtnColors[ n ] := oHmgData() aBtnColors[ n ]:cIcon := "..." aBtnColors[ n ]:aGrFill := { { 0.5, CLR_HRED , CLR_WHITE }, { 0.5, CLR_WHITE , CLR_HRED } } aBtnColors[ n ]:aGrOver := { { 0.5, CLR_RED , CLR_HRED }, { 0.5, CLR_HRED , CLR_RED } } или aBtnColors[ n ]:cIconName := "..." aBtnColors[ n ]:aGradientFill := { { 0.5, CLR_HRED , CLR_WHITE }, { 0.5, CLR_WHITE , CLR_HRED } } aBtnColors[ n ]:aGradientOver := { { 0.5, CLR_RED , CLR_HRED }, { 0.5, CLR_HRED , CLR_RED } } ... *-----------------------------------------------------------------------------* STATIC FUNCTION FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bBlock, lClosable, cFont, nMaxLen ) *-----------------------------------------------------------------------------* ... FOR n := 1 TO nLenaOp cBtnName := "Btn_" + StrZero( n, 2 ) AAdd( aBut, cBtnName ) IF lExt IF Valtype( aBtnColors[ n ] ) == "O" // контейнер THmgData cIcon := aBtnColors[ n ]:cIcon aBthColor := aBtnColors[ n ]:aGrOver aGrFill := aBtnColors[ n ]:aGrFill Default cIcon := aBtnColors[ n ]:cIconName Default aBthColor := aBtnColors[ n ]:aGradientOver Default aGrFill := aBtnColors[ n ]:aGradientFill bGotFocus := aBtnColors[ n ]:bMouseHover bLostFocus := aBtnColors[ n ]:bMouseLeave Default bGotFocus := aBtnColors[ n ]:bGotFocus Default bLostFocus := aBtnColors[ n ]:bLostFocus ELSE cIcon := NIL aBthColor := aBtnColors[ n ] aGrFill := NIL bGotFocus := NIL bLostFocus := NIL ENDIF @ 0, 0 BUTTONEX ( cBtnName ) OF ( cForm ) CAPTION aOptions[ n ] ICON cIcon ; FONTCOLOR aFontColor BACKCOLOR aBtnColor GRADIENTFILL aGrFill NOXPSTYLE HANDCURSOR ; FONT cFont WIDTH nMaxBoton HEIGHT nVMARGIN_BUTTON + nChrHeight + nVMARGIN_BUTTON ; ACTION ( _HMG_ModalDialogReturn := This.Cargo, _SetGetGlobal( "_HMG_PressButton", .T. ), ThisWindow.Release() ) IF Valtype( bGotFocus ) == "B" ; SetProperty( cForm, cBtnName, "GOTFOCUS", bGotFocus ) ENDIF IF Valtype( bLostFocus ) == "B" ; SetProperty( cForm, cBtnName, "LOSTFOCUS", bLostFocus ) ENDIF ELSE ... Задаем значения: aBtnText := {" &Продолжить "} aBtnText := {" &Да "," &Нет "} aBtnClr := { oHmgData(), oHmgData() } aBtnClr[1]:cIcon := "..." aBtnClr[1]:aGrFill := { { 0.5, CLR_HRED , CLR_WHITE }, { 0.5, CLR_WHITE , CLR_HRED } } aBtnClr[1]:aGrOver := { { 0.5, CLR_RED , CLR_HRED }, { 0.5, CLR_HRED , CLR_RED } } aBtnClr[2]:cIcon := "..." aBtnClr[2]:aGrFill := { { 0.5, CLR_HRED , CLR_WHITE }, { 0.5, CLR_WHITE , CLR_HRED } } aBtnClr[2]:aGrOver := { { 0.5, CLR_RED , CLR_HRED }, { 0.5, CLR_HRED , CLR_RED } } ... AlertStop( cMsg, cTitle, cIco, 64, aBtnClr, .T., bInit, lNoSound ) [/pre2]

SergKis: Andrey пишет Хочется ГОТОВУЮ и практичную функцию в составе МиниГуи (из коробки) "Их есть у меня" (c) Ставим градиент на кнопку[и]. Пример тут https://TransFiles.ru/5n3ae Запуск: demo.exe 1 demo.exe 2 demo.exe 3 demo.exe

Andrey: Спасибо БОЛЬШОЕ !

Andrey: Сейчас на mail.ru сделано красиво - снежинки падают. Можно так же сделать на МиниГуи ?

Andrey: Вывожу авишку на форму ANIMATEBOX Avi_1 ... AUTOPLAY После прорисовки формы проходит секунд 30 и только потом АВИ начинает двигаться. Почему так ? Как сделать чтобы сразу анимация пошла ?

Andrey: Вопрос по подвисанию программы на МиниГуи. Есть программа на С# из неё вызывается карточка из проги на МиниГуи по GetMessageData(). Однако программа на МиниГуи может быть занята длительной операцией, а юзер тупо кликнул вызов карточки. Прога на МиниГуи виснет наглухо. Как избавиться/блокировать вызов по GetMessageData() из проги на С# ?

SergKis: Andrey пишет Как избавиться/блокировать вызов по GetMessageData() из проги на С# ? 1. Ставишь переменную длительной операции .T. (все работы, кроме приема от C#, клики, ... игнорируешь, повесив modal окно, например) 2. Принимаешь данные от C# в стек всегда 3. Проверяешь переменную длительной операции на .T., если да -> ничего не делаешь 4. Длительная операция завершилась, ставишь .F., смотришь стек, если не пустой исполняешь его или исполнение стека всегда по глобальному таймеру (проверка, если не пуст стек)

Andrey: Можно изменить кодек показа AVI-файлов в МиниГуи ? А то очень многие авишки не показываются на форме....

Andrey: А как можно передать хендл иконки для показа в функции AlertInfo() ? Там же нужно указать явное имя ресурса. А я хочу показать ранее открытую иконку из коллекции. [pre2] This.Cargo:hIcon64 := LoadIconByName( "1MG_ICO", 64, 64 ) ... hIcon := ow:Cargo:hIcon64 ... AlertInfo( Message, Title, Icon, nSize, aColors, lTopMost, bInit, lNoSound )[/pre2]

SergKis: Andrey пишет А как можно передать хендл иконки для показа в функции AlertInfo() ? [pre2] FUNCTION HMG_Alert( cMsg, aOptions, cTitle, nType, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFontName ) ... IF ISNUMBER( cIcoFile ) DRAW SYSICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / 1.4 ; ICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT ELSE DRAW ICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ; PICTURE cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT ENDIF [/pre2]

Andrey: Блин... СПАСИБО !

SergKis: Andrey пишет Показ на форме есть, а в AlertInfo() нет. Если поправить h_alert.prg, то работает [pre2] IF ISNUMBER( cIcoFile ) DRAW ICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ; HICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT /*DRAW SYSICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / 1.4 ; ICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT */ ELSE [/pre2]

gfilatov2002: SergKis пишет: Если поправить h_alert.prg Добавил такую возможность Контрольный пример: hIcon := LoadIconByName( "demo.ico", 32, 32 ) ... AlertInfo ( "MiniGUI Alert Boxes demo", , hIcon ) Благодарю за подсказку

Andrey: Можно ли управлять BORDER и CLIENTEDGE после построения LABEL ?

gfilatov2002: Andrey пишет: Можно ли управлять BORDER и CLIENTEDGE после построения LABEL ? Да, это возможно. См. рабочий пример ниже [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo */ #include "minigui.ch" #include "i_winuser.ch" FUNCTION MAIN DEFINE WINDOW Form_1 ; AT 0, 0 ; WIDTH 640 HEIGHT 380 ; TITLE 'Harbour MiniGUI Demo' ; MAIN ; FONT 'Arial' SIZE 10 ; NOMAXIMIZE ; NOMINIMIZE ; NOSIZE DEFINE STATUSBAR STATUSITEM ' HMG Power Ready!' END STATUSBAR ON KEY ESCAPE ACTION ThisWindow.RELEASE DEFINE LABEL Label_1 COL 10 ROW 30 WIDTH 100 HEIGHT 30 VALUE 'Label Test 1' BORDER .T. CLIENTEDGE .F. CENTERALIGN .T. VCENTERALIGN .T. END LABEL DEFINE LABEL Label_2 COL 120 ROW 30 WIDTH 100 HEIGHT 30 VALUE 'Label Test 2' BORDER .F. CLIENTEDGE .T. CENTERALIGN .T. VCENTERALIGN .T. END LABEL DEFINE BUTTON B ROW 240 COL 10 CAPTION 'Remove Border' ACTION ( ChangeStyle( GetControlHandle( 'Label_1', 'Form_1' ), , WS_BORDER ) ) END BUTTON DEFINE BUTTON B2 ROW 240 COL 120 WIDTH 140 CAPTION 'Remove ClientEdge' ACTION ( ChangeStyle( GetControlHandle( 'Label_2', 'Form_1' ), , WS_EX_CLIENTEDGE, .T. ) ) END BUTTON END WINDOW Form_1.Center() Form_1.Activate() RETURN NIL [/pre2]

Andrey: Спасибо БОЛЬШОЕ !

Andrey: На форме куча ави-файлов. Получаю список этих ави [pre2] aName := HMG_GetFormControls(ow:Name, "ANIMATEBOX") [/pre2] А как получить имена файлов из которого состоит этот объект ? [pre2] @ ... ANIMATEBOX &cName ... File cResAvi ... [/pre2] P.S. Конечно можно сделать массив и запоминать там, но хочется попробовать сделать это через функции МиниГуи.

SergKis: А как получить имена файлов из которого состоит этот объект ? [pre2] FOR EACH oAvi IN ow:GetObj4Type( "ANIMATEBOX" ) Default oAvi:Cargo := oHmgData() oAvi:Cargo:cFile := _HMG_aControlCaption[ oAvi:Index ] // avi file тут NEXT PS. в твоем варианте в цикле (в GetProperty(...) нет этого) ? _HMG_aControlCaption[ GetControlIndex(aName[ i ], ow:Name) ] [/pre2]

SergKis: PS. Если у тебя avi логически связаны с Label, то соединить их для совместной работы можно так [pre2] @ y, x LABEL &cN VALUE "Info win" WIDTH nWBtn HEIGHT nHBtn ; FONTCOLOR aBtnFClr[1] BACKCOLOR aBtnBClr[1] ; CENTERALIGN VCENTERALIGN BORDER CLIENTEDGE ; ON MOUSEHOVER {|| MouseFocus_Label(.T., This.Cargo) } ; ON MOUSELEAVE {|| MouseFocus_Label(.F., This.Cargo) } ; ON CLICK {| | _wPost(This.Cargo:nPost, This.Index ) } ; ON INIT {|o| This.Cargo := oHmgData() o := This.Cargo o:oObj := This.Object o:cObj := o:oObj:Name o:nObj := 1 o:cAvi := "Avi_1" // на др. Label свои имена avi контролов o:lAction := .F. o:lHover := .F. o:lBorder := .T. o:lClientEdge := .T. Return Nil } ... в ON INIT окна сделать FOR EACH oLbl IN ow:GetObj4Type( "LABEL" ) Default oLbl:Cargo := oHmgData() IF Empty(oLbl:Cargo:cAvi) ; LOOP // label без avi пропускаем ENDIF oAvi := ow:GetObj( oLbl:Cargo:cAvi ) Default oAvi:Cargo := oHmgData() oAvi:Cargo:cFile := _HMG_aControlCaption[ oAvi:Index ] // avi file тут oAvi:Cargo:oLabel := oLbl // запомнили в avi объект label oLbl:Cargo:oAvi := oAvi // запомнили в label объект avi oLbl:Cargo:cAviFile := oAvi:Cargo:cFile // если надо, продублировали на label имя avi file NEXT ... [/pre2]

Andrey: А на LABEL положить градиент можно ? Что то примеры не найду...

gfilatov2002: Andrey пишет: на LABEL положить градиент можно ? Например, можно сделать так: в примере из папки \SAMPLES\Advanced\DrawGradient

Andrey: Классный пример, СПАСИБО ! А после установки объекта на форме [pre2] DRAW GRADIENT IN WINDOW &cForm AT 250, 20 TO 278, 300 ; VERTICAL BORDER PANEL [/pre2]Можно поменять следующие параметры и как поменять ? [pre2]VERTICAL - убрать PANEL - заменить на BOX BEGINCOLOR - задать заново цвет ENDCOLOR - задать заново цвет [/pre2]

gfilatov2002: Andrey пишет: Можно поменять следующие параметры и как поменять ? Например, можно сделать так: [pre2] /* * DrawBoxGradient.prg * * Author: P.Chornyj <myorg63@mail.ru> */ ANNOUNCE RDDSYS #include "minigui.ch" #define NONE 0 #define BOX 2 #define PANEL 3 PROCEDURE Main () LOCAL aColor := HMG_n2RGB( GetSysColor( 15 ) ) SET FONT TO "Arial", 12 DEFINE WINDOW x ; WIDTH 640 ; HEIGHT 420 ; TITLE "Draw Box and Panel Gradient Sample" ; MAIN ; NOMAXIMIZE NOSIZE ; BACKCOLOR aColor DRAW GRADIENT IN WINDOW x AT 20, 20 TO 200, 300 BORDER BOX @ 95, 110 LABEL Label_1 VALUE "Gradient Box In" AUTOSIZE TRANSPARENT FONTCOLOR YELLOW DRAW GRADIENT IN WINDOW x AT 20, 320 TO 200, 610 ; VERTICAL BORDER PANEL @ 95, 410 LABEL Label_2 VALUE "Gradient Panel" AUTOSIZE TRANSPARENT FONTCOLOR YELLOW DRAW GRADIENT IN WINDOW x AT 250, 20 TO 278, 300 ; VERTICAL BORDER BOX ; BEGINCOLOR { 255, 255, 255 } ; ENDCOLOR { 220, 220, 220 } @ 255, 110 LABEL Label_3 VALUE "Gradient Box In" AUTOSIZE TRANSPARENT DRAW GRADIENT IN WINDOW x AT 250, 320 TO 278, 610 ; VERTICAL BORDER PANEL ; BEGINCOLOR { 255, 255, 255 } ; ENDCOLOR { 200, 200, 216 } @ 255, 410 LABEL Label_4 VALUE "Gradient Panel" AUTOSIZE TRANSPARENT DRAW GRADIENT IN WINDOW x AT 300, 20 TO 302, 316 ; BORDER NONE ; BEGINCOLOR { 250, 0, 0 } ; ENDCOLOR { 130, 0, 0 } DRAW GRADIENT IN WINDOW x AT 300, 316 TO 302, 610 ; BORDER NONE ; BEGINCOLOR { 130, 0, 0 } ; ENDCOLOR { 250, 0, 0 } @ 330, 240 BUTTON Button_1 ; CAPTION "&Switch" ; ACTION SwitchBoxPanel() ; WIDTH 150 HEIGHT 26 END WINDOW CENTER WINDOW x ACTIVATE WINDOW x RETURN PROCEDURE SwitchBoxPanel() ERASE WINDOW x DRAW GRADIENT IN WINDOW x AT 20, 20 TO 200, 300 VERTICAL BORDER PANEL x.Label_1.VALUE := "Gradient Panel" DRAW GRADIENT IN WINDOW x AT 20, 320 TO 200, 610 ; BORDER BOX x.Label_2.VALUE := "Gradient Box In" DRAW GRADIENT IN WINDOW x AT 250, 20 TO 278, 300 ; VERTICAL BORDER PANEL ; BEGINCOLOR { 255, 255, 255 } ; ENDCOLOR { 200, 200, 216 } x.Label_3.VALUE := "Gradient Panel" DRAW GRADIENT IN WINDOW x AT 250, 320 TO 278, 610 ; VERTICAL BORDER BOX ; BEGINCOLOR { 255, 255, 255 } ; ENDCOLOR { 220, 220, 220 } x.Label_4.VALUE := "Gradient Box In" DRAW GRADIENT IN WINDOW x AT 300, 20 TO 302, 316 ; BORDER NONE ; BEGINCOLOR { 250, 0, 0 } ; ENDCOLOR { 130, 0, 0 } DRAW GRADIENT IN WINDOW x AT 300, 316 TO 302, 610 ; BORDER NONE ; BEGINCOLOR { 130, 0, 0 } ; ENDCOLOR { 250, 0, 0 } InvalidateRect( x.HANDLE, 0 ) RETURN [/pre2]

Andrey: Что-то мудрённый объект этот... А обработку на этот объект можно сделать ? [pre2] DRAW GRADIENT IN WINDOW x AT 20, 20 TO 200, 300 BORDER BOX < ACTION | ONCLICK > [/pre2]Да и имя бы иметь на этот объект было бы хорошо.... Да и синтаксис привести как у LABEL было бы лучше. А возможно разместить градиент на уже готовой кнопке ? Или расширить синтаксис LABEL ? у BUTTONEX же есть уже градиент - [ GRADIENTFILL <aGradInfo> [ HORIZONTAL ] ]

Andrey: Хочу чтобы имя фонта и САМ ВИД ФОНТА отображался в контекстном меню. Имя фонта меняю, а сам размер фонта не получается. Для контекстного меню знаю что есть такие функции изменения: [pre2] // для меню _SetMenuItemCaption( "SetFont" , cForm , cItem ) // для иконок _SetMenuItemIcon( "SetCopy" , cForm, if( lCopy, "iCopy32On", "iCopy32Off" ) ) // для bmp _SetMenuItemBitmap( "SetFile" , cForm, if( lFile, "bRecOn32" , "bRecOff32" ) )[/pre2] А как поменять сам фонт и его размер в меню ? [pre2].... STATIC cStaticFont, hStaticFont DEFINE FONT TestFnt FONTNAME "DejaVu Sans Mono" SIZE 12 BOLD hStaticFont := GetFontHandle( "TestFnt" ) aFont := GetFontParam( hStaticFont ) cStaticFont := aFont[1] + " " + HB_NtoS(aFont[2]) cStaticFont += IIF(aFont[3]," Bold", "" ) cStaticFont += IIF(aFont[4]," Itl" , "" ) DEFINE MAIN MENU .... SEPARATOR MENUITEM 'Change font: ' + cStaticFont NAME SetFont FONT hStaticFont ACTION ChangeFont() ... END MENU ......... Static FUNCTION ChangeFont() LOCAL aFont, aF, cItem, cForm := "wMain" aF := GetFontParam( hStaticFont ) // вызвать стандартное меню шрифт для Windows aFont := GetFont( aF[1] , aF[2], aF[3], aF[4] , {0,0,0} , .f. , .f. , 0 ) if ! empty ( aFont[1] ) RELEASE FONT TestFnt // удаляем фонт // Name , Size , Bold , Italic aFont := { aFont[1] , aFont[2], aFont[3], aFont[4] } DEFINE FONT TestFnt FONTNAME aFont[1] SIZE aFont[2] DO EVENTS // запишем новые значения фонта cStaticFont := aFont[1] + " " + HB_NtoS(aFont[2]) cStaticFont += IIF(aFont[3]," Bold", "" ) cStaticFont += IIF(aFont[4]," Itl" , "" ) hStaticFont := GetFontHandle( "TestFnt" ) // запишем в меню новые значения фонта cItem := _GetMenuItemCaption( "SetFont" , cForm ) cItem := SUBSTR(cItem, 1, AT(":",cItem) + 1 ) cItem += oCargo:cFont2 _SetMenuItemCaption( "SetFont" , cForm , cItem ) EndIf RETURN NIL[/pre2]

gfilatov2002: Andrey пишет: как поменять сам фонт и его размер в меню ? Переписал эту функцию таким образом: [pre2] Static FUNCTION ChangeFont() LOCAL aFont, aF, cItem, cForm := "wMain" aF := GetFontParam( hStaticFont ) // вызвать стандартное меню шрифт для Windows aFont := GetFont( aF[1] , aF[2], aF[3], aF[4] , {0,0,0} , .f. , .f. , 0 ) if ! empty ( aFont[1] ) RELEASE FONT TestFnt // удаляем фонт // Name , Size , Bold , Italic aFont := { aFont[1] , aFont[2], aFont[3], aFont[4] } //DEFINE FONT TestFnt FONTNAME aFont[1] SIZE aFont[2] _DefineFont ( 'TestFnt', aFont[1], aFont[2], aFont[3], aFont[4] ) DO EVENTS // запишем новые значения фонта cStaticFont := aFont[1] + " " + HB_NtoS(aFont[2]) cStaticFont += IIF(aFont[3]," Bold", "" ) cStaticFont += IIF(aFont[4]," Itl" , "" ) hStaticFont := GetFontHandle( "TestFnt" ) // запишем в меню новые значения фонта cItem := _GetMenuItemCaption( "SetFont" , cForm ) cItem := SUBSTR(cItem, 1, AT(":",cItem) + 1 ) cItem += cStaticFont _SetMenuItemCaption( "SetFont" , cForm , cItem ) _SetMenuItemFont( "SetFont" , cForm , hStaticFont ) EndIf RETURN NIL [/pre2] Результат см. на картинке ниже:

SergKis: gfilatov2002 пишет Переписал эту функцию таким образом Еще небольшую правку в _o2log(...) [pre2] *----------------------------------------------------------------------------* FUNCTION _o2Log( o, nLen, cMsg, lExt, cLog ) *----------------------------------------------------------------------------* LOCAL a, b, c, i, j, k := pCount(), l := .F., xRet := .T. LOCAL lLog := IsErrorLogActive() IF Valtype(cLog) $ "LND" l := .T. cLog := hb_FNameDir( _SetGetLogFile() ) + "_" + hb_ntos( Seconds() ) _HMG_CreateErrorLog := .T. ENDIF ... IF l .and. hb_FileExists( cLog ) xRet := hb_memoread( cLog ) hb_FileDelete( cLog ) _HMG_CreateErrorLog := lLog ENDIF RETURN xRet [/pre2]

gfilatov2002: SergKis пишет: Еще небольшую правку в _o2log(...) Принято с благодарностью

Andrey: gfilatov2002 пишет: Переписал эту функцию таким образом: Спасибо БОЛЬШОЕ ! А как быть с цветом ? Т.е. меню "Change color"

gfilatov2002: Andrey пишет: А как быть с цветом ? Посмотри еще раз пример в папке \SAMPLES\Advanced\ComboColor, а именно функцию CreateColorBMP()

SergKis: gfilatov2002 Еще правка в [pre2] *----------------------------------------------------------------------------* FUNCTION _o2Log( o, nLen, cMsg, lExt, cLog ) *----------------------------------------------------------------------------* LOCAL a, b, c, i, j, k := pCount(), l := .F., xRet := .T. LOCAL lLog := IsErrorLogActive(), aTmp, xTmp, cTmp ... IF HB_ISOBJECT( o ) ... FOR EACH a IN o:GetAll() ... IF HB_ISOBJECT( a[2] ) ... ELSEIF HB_ISARRAY( a[2] ) .and. lExt aTmp := {} FOR EACH xTmp IN a[2] IF HB_ISOBJECT(xTmp) cTmp := "O:" + xTmp:ClassName IF xTmp:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA" cTmp += " "+"ARRAY[" + hb_ntos( xTmp:Len() ) + "]" IF xTmp:ClassName == "TINIDATA" cTmp += " "+xTmp:cIni ENDIF ELSEIF xTmp:ClassName == "TWNDDATA" cTmp += " "+xTmp:Name+" "+xTmp:Type ELSEIF xTmp:ClassName $ "TCNLDATA,TTSBDATA,TGETDATA,TSTBDATA" cTmp += " "+xTmp:Window+" "+xTmp:Name+" "+xTmp:Type ELSEIF xTmp:ClassName == "TSBROWSE" cTmp += " "+xTmp:cControlName+" "+xTmp:cParentWnd+" "+xTmp:cAlias ENDIF AAdd( aTmp, cTmp ) ELSE AAdd( aTmp, xTmp ) ENDIF NEXT _LogFile( {.F., cLog}, hb_valtoexp( aTmp ) ) //_LogFile( {.F., cLog}, hb_valtoexp( a[2] ) ) ELSE ... [/pre2]

gfilatov2002: SergKis пишет: Еще правка Добавил, конечно. Благодарю за помощь

Andrey: Григорий, а можно побороть: несовместимость режима TRANSPARENT для LABEL на форме и переключения тем ? gfilatov2002 пишет: Посмотри еще раз пример в папке \SAMPLES\Advanced\ComboColor, а именно функцию CreateColorBMP() А как сделать bmp 32x32 и поместить его в [pre2] MENUITEM 'Change color: [[[[[[]]]]]' FONT hFont ACTION ( aZClr := ChangeColor(aZClr) ) [/pre2]

gfilatov2002: Andrey пишет: можно побороть: несовместимость режима TRANSPARENT для LABEL на форме и переключения тем ? Уже поправил. Andrey пишет: как сделать bmp 32x32 и поместить его в Примерно вот так:

SergKis: gfilatov2002 Еще небольшая правка _o2log()[pre2] ... IF HB_ISOBJECT( o ) ... ELSEIF HB_ISARRAY( o ) _LogFile( {.F., cLog}, o ) FOR EACH a IN o i := hb_enumIndex( a ) j := TR0( i, nLen - 1 ) + "." + " " + '"' + Valtype( a ) + '"' _LogFile( {.T., cLog}, j + " -> " ) IF HB_ISOBJECT( a ) _o2Log( a, nLen + 5, , lExt, cLog ) ELSEIF HB_ISARRAY( a ) _LogFile( {.T., cLog}, TR0( i, nLen - 1 ) + "." ) ... [/pre2]

gfilatov2002: SergKis пишет: Еще небольшая правка _o2log() OK

SergKis: gfilatov2002 Пропустил неточность, надо чуток добавить в код выше обвязку[pre2] FOR EACH a IN o i := hb_enumIndex( a ) IF ! HB_ISARRAY( a ) j := TR0( i, nLen - 1 ) + "." + " " + '"' + Valtype( a ) + '"' _LogFile( {.T., cLog}, j + " -> " ) ENDIF IF HB_ISOBJECT( a ) [/pre2] Пример для проверки тут https://TransFiles.ru/jw39y В demo4.ini можно задавать cMainMenuItems = MENU_1 or MENU_2 or MENU_3 и др. переменными, кроме cMainMenuFile (или сделать др. файл ini с секциями для items)

gfilatov2002: SergKis пишет: добавить в код выше Принято

Andrey: А как можно получить хенлы иконок из i_controlmisc.ch ? [pre2]// Alert icons #define ICON_EXCLAMATION 1 // default value #define ICON_QUESTION 2 #define ICON_INFORMATION 3 #define ICON_STOP 4[/pre2] И можно ли этот хендл показать вместо файла/ресурса в меню [pre2] MENUITEM '&About' .... ICON "i_About32" FONT "DlgFont" [/pre2] Или нужно этот хендл иконки записать в файл, и потом показывать ? Как это сделать ? Не нашёл в примерах запись иконки по хендлу.

gfilatov2002: Andrey пишет: Не нашёл в примерах запись иконки по хендлу. Посмотри рабочий пример ниже [pre2] #include "minigui.ch" PROCEDURE Main() LOCAL cIconDll := System.SystemFolder + "\imageres.dll" // LOCAL cIconSave := System.TempFolder + '\temp.ico' LOCAL cIconSave := GetStartUpFolder() + '\temp.ico' SET MULTIPLE OFF WARNING // icon with number SYSICO_WARN to write along the path IF ! SaveIcon( cIconSave, cIconDll, SYSICO_WARN ) MsgInfo( "Icon is NOT saved!", "Error" ) ENDIF SET DEFAULT ICON TO cIconSave DEFINE WINDOW Form_1 ; AT 50, 50 ; WIDTH 660 HEIGHT 450 ; TITLE "This is icon SYSICO_WARN from the file - " + cIconDll ; MAIN ; BACKCOLOR ORANGE ; ON RELEASE FErase( cIconSave ) DRAW SYSICON IN WINDOW Form_1 ; AT ( This.ClientHeight - 32 ) / 2, ( This.ClientWidth - 32 ) / 2 ; FROM cIconDll ID SYSICO_WARN COLOR CLR_ORANGE ON KEY ESCAPE ACTION ThisWindow.Release() END WINDOW Form_1.Activate() RETURN FUNCTION SaveIcon( cIconName, cIconSrc, nItem ) LOCAL aIcons := ExtractIconEx( cIconSrc, nItem ) RETURN C_SaveHIconToFile( cIconName, aIcons ) [/pre2]

Andrey: gfilatov2002 пишет: C_SaveHIconToFile( cIconName, aIcons ) Не то ! Это я видел. Нужна одна иконка, а не коллекция иконок, т.е. [pre2] cIcoExtrn := '.\Res\IconVista3.ico' // icon file of all sizes hIcon := LoadIconByName( cIcoExtrn, 64 , 64 ) // а как записать hIcon ? [/pre2] Это нужно потом для показа иконок в [pre2] AlertInfo( cMsg, "About", hIcon, nIcoSize, aBtnClr, .T. , bOnInit, .F. ) AlertStop( cMsg, "About", hIcon, nIcoSize, aBtnClr, .T. , bOnInit, .F. ) [/pre2]и т.д.

gfilatov2002: Andrey пишет: а как записать hIcon ? hIcon в данном случае - это временный указатель на загруженную иконку. Сохранить его для дальнейшего использования можно только в переменную (например, статическую).

Andrey: Понял. Спасибо ! А как у других это делается в HMG или FiveWin ? Оттуда код портировать нельзя ?

Andrey: Нашёл немного не то, но тоже интересно. Иконку можно записать как .png и .bmp Тоже бы не помешало в МиниГуи иметь такое. https://forums.fivetechsupport.com/viewtopic.php?f=3&t=35109 Пост N: 1186 Там в исходнике на С есть такое: [pre2] // Write the iconheader first of all // WriteIconHeader(hFile, nNumIcons); [/pre2] И ещё нашёл на С++ [pre2]HRESULT SaveIcon(HICON hIcon, const wchar_t* path) { // Create the IPicture intrface PICTDESC desc = { sizeof(PICTDESC) }; ....[/pre2] https://stackoverflow.com/questions/2289894/how-can-i-save-hicon-to-an-ico-file

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: Это большой пример. Попроще может быть пример ? Форма и одна кнопка без окантовки с иконкой ...

SergKis: Andrey пишет Это большой пример. Попроще может быть пример ? Форма и одна кнопка без окантовки с иконкой ... Бери demo.prg и оставляй, только то, что интересно, остальное удали - это сборка под hmg 24.02 и даже без SET OOP ON Вопрос, наверное, надо ставить по другому, может вкл. этот обработчик в minigui.lib, соединив его с тем что есть ? + команды для установки вариантов, но это требует детального понимания кода, я не разбирался, где и что лежит PS Наследование данных из App.Cargo позволит делать для каждого окна свое поведение кнопок ButtonEx, надо использовать в окне команду This.Cargo:aButStyles := AClone( App.Cargo:aButStyles ) ... потом менять значения для поведения в This.Cargo:aButStyles у кнопок без установленного Cargo будет поведение из App.Cargo:aButStyles по умолчанию iButStyle := 1 aButMisc := { 1, '' }

Andrey: SergKis пишет: Вопрос, наверное, надо ставить по другому, может вкл. этот обработчик в minigui.lib, соединив его с тем что есть ? Согласен с этим !!! Я вывожу png на форму и назначаю на картинку клик мышки. Но картинка фигово выглядит, линия соединения с формой ЗУБЧИКАМИ вся... Из-за этого и захотел сделать кнопку без окантовки.

SergKis: Andrey пишет Я вывожу png на форму и назначаю на картинку клик мышки. Но картинка фигово выглядит, линия соединения с формой ЗУБЧИКАМИ вся... Из-за этого и захотел сделать кнопку без окантовки. ButtonEx тут причем ? В нем bmp и icon Может хотел png и Label ?

Andrey: SergKis пишет: ButtonEx тут причем ? В нем bmp и icon PNG выводить не вариант. Вывод ICON на форму тоже не вариант, т.к. на иконку нельзя повесить клик мышки. Вернее можно по координатам, но коду дофига. Остаётся только BUTTONEXT с иконкой без окантовки, там можно повесить ACTION Вот и спрашиваю, как проще убрать окантовку кнопки ?

SergKis: Andrey пишет Вот и спрашиваю, как проще убрать окантовку кнопки ? Кнопки из Label с Avi ты делал, аналог (пример с Popup_Menu) с DRAW ICON ~ такой (окантовки нет) [pre2] nW := This.ClientWidth nH := This.ClientHeight nY := 5 ; nX := nW - 64 DRAW ICON IN WINDOW &cForm AT nY, nX HICON This.Cargo:hIcon ; WIDTH 64 HEIGHT 64 COLOR This.Backcolor @ nY, nX LABEL DrawIcon VALUE "" WIDTH 64 HEIGHT 64 TRANSPARENT ; ACTION AlertInfo("Click: "+ThisWindow.Name+"."+This.Name) nY := 2 ; nX := 10 @ nY, nX LABEL Buff VALUE cVal WIDTH nW - 80 HEIGHT nH FONT "FontHmg" ; FONTCOLOR WHITE BACKCOLOR oAC():aBClrMain RIGHTALIGN ; ACTION AlertInfo("Click: "+ThisWindow.Name+"."+This.Name) ... o:Event({ 1, "Paint"}, {|ow| // прорисовка иконки сразу на форме This.DrawIcon.Hide() DoEvents() SendMessage( ow:Handle, WM_PAINT, 0, 0 ) This.DrawIcon.Show() DoEvents() Return Nil }) ... [/pre2]

Andrey: Иконка конфликтует с LABEL, т.е. она будет затираться LABEL'ом

SergKis: Andrey Не затирается в примере со строками выше

Andrey: SergKis пишет: Не затирается в примере со строками выше Это похоже на кнопку с иконкой. А мне нужно чтобы юзер на иконку кликнул и получил результат, причём при попадание в фокус иконки мышка меняла форму на палец.

SergKis: Andrey пишет Это похоже на кнопку с иконкой. А мне нужно чтобы юзер на иконку кликнул и получил результат, причём при попадание в фокус иконки мышка меняла форму на палец. Так ты же этого и хочешь, т.е. чтобы была кнопка без окантовки, смотри файл i_label.ch[pre2] #command @ <row>,<col> LABEL <name> ; ... [ <dummy2: ACTION, ON CLICK, ONCLICK> <action> ] ; [ ON DBLCLICK <dblclick> ] ; [ ON RCLICK <rclick> ] ; [ <dummy3: ON MOUSEHOVER, ONMOUSEHOVER> <overproc> ] ; [ <dummy4: ON MOUSELEAVE, ONMOUSELEAVE> <leaveproc> ] ; ...[/pre2] все есть, даже выпадающее меню можешь приделать, как на кнопку DEFINE CONTEXT MENU CONTROL &cLbl ... окантовку делать ф-ей DrawRR(...) из примеров, если надо (могут быть с закругленными углами) Цвета и градиента не будет, но палец и окантовка цветная будет и с темной темой будет сочетатся

Andrey: Может я плохо объяснил. Сделал пример для иконки, Григорий добавил обработку иконки. Но иконка часто при уходе НЕ МЕНЯЕТСЯ... Да и кода дофига писать приходиться. Вот пример - https://cloud.mail.ru/public/prnj/7gHLfUwwW Можно ли сделать класс для иконки похожий на кнопку/картинку ? [pre2] @ nY, nX ICON Icon_2 PICTURE 'iDebug64x1' WIDTH 64 HEIGHT 64 BACKGROUNDCOLOR aBackColor ; OnMouseHover {|| This.Icon := 'iDebug64x2' , RC_CURSOR("MINIGUI_FINGER") } ; OnMouseLeave {|| This.Icon := 'iDebug64x1' } ; ACTION {|| MsgDebug( This.Name ) } [/pre2] Самый простой выход - убрать окантовку кнопки... Но как не знаю...

gfilatov2002: Andrey пишет: Самый простой выход - убрать окантовку кнопки... Так, как на картинке ниже, подойдет Изменения, которые сделал в коде примера, см. ниже [pre2]... App.Cargo:aButStyles := { ; { 0, 1, aBackColor, aBackColor, aBackColor, aBackColor, BLACK, BLACK, 1, aBackColor, aBackColor } ; } DEFINE WINDOW Form_Main ; TITLE (App.Cargo):cPRG_NAME ; MAIN NOMAXIMIZE NOSIZE ; BACKCOLOR aBackColor ; ON INIT {|| DoEvents() , _wPost(0) } ; // выполняется после инициализации окна ON RELEASE {|| _wSend(92) } ; // выполняется перед разрушением окна ON INTERACTIVECLOSE {|| NIL } ; // закрытие окна по [x] ON MOUSEMOVE DisplayCoords() // обработка координат мышки This.Cargo := oHmgData() // для окна создаем объект без переменных (условно пустой) This.Cargo:aWinBtn := Nil // кнопки окна This.Cargo:aBColor := aBackColor // цвет фона окна This.Cargo:aButStyles := App.Cargo:aButStyles DEFINE STATUSBAR STATUSITEM "+" FONTCOLOR RED STATUSITEM "Item 1" WIDTH 230 FONTCOLOR BLUE STATUSITEM "Item 2" WIDTH 230 FONTCOLOR BLUE STATUSITEM "Item 3" WIDTH 230 FONTCOLOR BLUE END STATUSBAR nY := nX := 5 DRAW ICON IN WINDOW Form_Main AT nY, nX PICTURE 'iQuest64x1' WIDTH 64 HEIGHT 64 COLOR aBackColor nX += 64 + 5 @ nY, nX BUTTONEX Btn_1 WIDTH 64 HEIGHT 64 ; CAPTION '' ICON 'iQuest64x1' ; FLAT NOXPSTYLE HANDCURSOR NOTABSTOP ; BACKCOLOR aBackColor ; ON MOUSEHOVER ( This.Backcolor := GRAY , This.Icon := 'iQuest64x2' ) ; ON MOUSELEAVE ( This.Backcolor := aBackColor , This.Icon := 'iQuest64x1' ) ; ACTION {|| This.Enabled := .F. ,; MsgDebug( This.Name ) ,; This.Enabled := .T. } ; ON INIT {|| This.Cargo := oHmgData(), ; This.Cargo:cButMisc := '0', ; This.Cargo:aButStyles := ThisWindow.Cargo:aButStyles } ... [/pre2]

Andrey: Супер ! Спасибо БОЛЬШОЕ !

Andrey: gfilatov2002 пишет: Изменения, которые сделал в коде примера, см. ниже У меня что-то не срабатывают эти изменения... Положил к Сергею на ftp свой исправленный файл....

gfilatov2002: Andrey пишет: У меня что-то не срабатывают эти изменения Положил к Сергею на ftp в папку Andrey свой рабочий проект

Andrey: Спасибо ! Я забыл добавить в проект myownbut51.prg Мой тоже заработал с этим добавлением. Ещё вопрос, допустим на форму вывожу 3 иконки: [pre2] DRAW ICON IN WINDOW Form_Main AT nY, nX PICTURE 'Icon1' WIDTH 64 HEIGHT 64 COLOR aBackColor nX += 64 + 10 DRAW ICON IN WINDOW Form_Main AT nY, nX PICTURE 'Icon2' WIDTH 64 HEIGHT 64 COLOR aBackColor nX += 64 + 10 DRAW ICON IN WINDOW Form_Main AT nY, nX PICTURE 'Icon2' WIDTH 64 HEIGHT 64 COLOR aBackColor[/pre2] После закрытия формы нужно удалять хендлы иконок. А как в этом случае быть ? Как определить эти хендлы ?

gfilatov2002: Andrey пишет: После закрытия формы нужно удалять хендлы иконок В этом случае ничего специально НЕ НАДО делать. Все хендлы иконок будут очищены автоматически Это легко проверить, если собрать проект с отладчиком или просто добавить в проект вызов функции AltD( 1 ) Если в проекте есть утечка ресурсов, то при выходе из программы будет создан дополнительный текстовый файл с указанием, где в коде были определены эти ресурсы.

Andrey: СПАСИБО БОЛЬШОЕ !

Andrey: gfilatov2002 пишет: Так, как на картинке ниже, подойдет На форме ВСЕ кнопки теряют окантовку !!! А как можно сделать, чтобы только у некоторых кнопок можно удалять окантовку ? SergKis пишет: у кнопок без установленного Cargo будет поведение из App.Cargo:aButStyles по умолчанию iButStyle := 1 aButMisc := { 1, '' } Это не работает...

SergKis: Andrey пишет Это не работает... А ты обратил внимание что произошло упрощение примера, как ты и просил, все поведения кнопок убраны из массива[pre2] :aButStyles := { ; // для кнопки - убрать окантовку { 0, 1, aBackColor, aBackColor, aBackColor, aBackColor, BLACK, BLACK, 1, aBackColor, aBackColor } ; } [/pre2] надо разбирать назначения всех элементов в нем и применять правильно, т.е. из кода myownbut51.prg надо инструкцию писать, вот немного начал, можешь продолжить [pre2] // 1 2 3 4 5 6 7 8 9 10 11 // Styl Tip, Fill // gradient App.Cargo:aButStyles := { ; { 0, 1, {106,131,160}, {106,131,160}, {106,131,160}, {106,131,160}, BLACK, BLACK , 1, {106,131,160}, RED },; { 1, 3, {182,189,210}, {220,220,220}, {182,189,210}, WHITE , BLACK, BLACK , 1, {220,220,220}, WHITE },; { 2, 4, {106,131,160}, {220,220,220}, {220,220,220}, {220,220,220}, BLACK, BLACK , 0, {220,220,220}, WHITE },; { 3, 4, {192,192,192}, {192,192,192}, {192,192,192}, {192,192,192}, BLACK, BLACK , 0, { 82,189,210}, BLACK },; { 4, 2, GRAY , {255,255,255}, {106,131,160}, {255,255,255}, BLACK, BLACK , 1, GRAY , {106,131,160} },; { 5, 2, GRAY , {220,220,220}, GRAY , {255,255,255}, BLACK, {196,0,0}, 1, GRAY , RED },; { 6, 4, GRAY , {220,220,220}, {106,131,160}, {255,255,255}, BLACK, BLACK , 1, GRAY , {106,131,160} },; { 7, 2, GRAY , {255,255,255}, {106,131,160}, {255,255,255}, BLACK, BLACK , 2, GRAY , {106,131,160} },; { 8, 2, GRAY , {220,220,220}, GRAY , {255,255,255}, BLACK, {196,0,0}, 2, GRAY , RED },; { 9, 4, GRAY , {220,220,220}, {106,131,160}, {255,255,255}, BLACK, BLACK , 2, GRAY , {106,131,160} },; {10, 1, {196,164,164}, {196,164,164}, {196,164,164}, {196,164,164}, WHITE, WHITE , 0, {106,131,160}, RED },; {11, 1, {196,164,164}, {196,164,164}, {196,164,164}, {196,164,164}, BLACK, RED , 0, {106,131,160}, RED } ; } // 1 2 3 4 5 6 7 8 9 10 11 // ^ // | FillGradient(hDC, ...) // 1 - Type fill grag vert 1 // 2 - Type fill grag vert 2 // 3 - Type fill grag horiz 1 // 4 - Type fill grag horiz 2 // [/pre2] без понимания, как применять А как можно сделать, чтобы только у некоторых кнопок можно удалять окантовку ? Разобраться в алгоритмах myownbut51.prg примера и заодно в алгоритмах такой же ф-ии из h_buttonex.prg

Andrey: Есть пример C:\MiniGUI\SAMPLES\BASIC\GetBox_3 Как в нём заменить окно с ошибкой MsgXXX() для даты на окно с AlertStop() ? [pre2] DEFINE GETBOX Text_1 // Alternate Syntax ROW ( :Y := :T ) COL ( :X := :L ) WIDTH :W(1.5) HEIGHT :H1 VALUE DATE() PICTURE '@K' TOOLTIP "Date Value: Must be greater or equal to "+DTOC(DATE()) VALID {|| Compare(this.value)} VALIDMESSAGE "Must be greater or equal to "+DTOC(DATE()) MESSAGE "Date Value"[/pre2]

Andrey: Есть ли возможность при отладке программы - смотреть какие объекты на форме созданы ? Какой нибудь мини-просмотр списка объектов на форме. Или готовые функции для этого. Самому писать долго...



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