Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть V) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть V) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Haz: Григорий Есть еще предложение ... Как неоднократно тут вопрошал Андрей, при переключении между программами в Windows, если в программе на MiniGui последним активным было модальное окно , вызванное из дочернего, то такое модальное окно не получает фокус и программа уходит в вечное ожидание когда его закроют. Схематически вызовы такие MAIN->CHILD->MODAL , переключаем задачи и попадаем в CHILD ( MODAL не видно и на него не переключиться ). Предлагаю очень простое решение: в модуле h_events.prg в обработку событий в функцию Events() , в событие WM_SETFOCUS добавить условие [pre2] Было: _DoWindowEventProcedure ( _HMG_aFormGotFocusProcedure , i , 'WINDOW_GOTFOCUS' ) iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) Стало: IF _HMG_IsModalActive BringWindowToTop(_HMG_ActiveModalHandle) ELSE iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) END [/pre2] Таким образом , при любой попытке дать фокус любому окну, если есть модальное , то фокус и топ на экране получит оно PS. После получения фокуса , к модальному можно еще и Flash добавить .... будет моргать совсем как по настоящему )

gfilatov2002: Haz пишет: при любой попытке дать фокус любому окну, если есть модальное , то фокус и топ на экране получит оно Неплохое предложение, хотя особого эффекта функция BringWindowToTop() у меня не дает (но и ничего не портит, похоже). Лучше работает другая функция WinAPI DECLARE DLL_TYPE_BOOL SwitchToThisWindow( DLL_TYPE_LONG hWnd, DLL_TYPE_BOOL lRestore ) ; IN USER32.DLL но она является недокументированной и не рекомендуется к использованию, т.к. может быть исключена в любой новой Винде Благодарю за помощь, Ваше предложение принимается

Andrey: Haz пишет: к модальному можно еще и Flash добавить .... будет моргать совсем как по настоящему ) Григорий - добавь пожалуйста ! Очень нужно...


Haz: Andrey пишет: Григорий - добавь пожалуйста ! Очень нужно... тогда так [pre2] if _HMG_IsModalActive BringWindowToTop(_HMG_ActiveModalHandle) if _HMG_aFormFocusedControl <> _HMG_ActiveModalHandle .and. _HMG_aFormType [ i ] <> "M" FlashWindowEx( _HMG_ActiveModalHandle , 1, 5, 100 ) end else iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) end [/pre2]

SergKis: gfilatov2002 В своей версии подправил:[pre2] METHOD GoToRec( nRec ) CLASS TSBrowse ... ( ::cAlias )->( DbGoto( nRec ) ) // If nRecNo != ( ::cAlias )->( RecNo() ) .and. ::nLen > nLines было If ::nLen > nLines nRecNo := ( ::cAlias )->( RecNo() ) ( ::cAlias )->( DbSkip( nLines - ::nRowPos ) ) If ( ::cAlias )->( EoF() ) ... Else ( ::cAlias )->( DbGoTo( nRecNo ) ) ::nLastPos := nRecNo ::nAt := ::nLogicPos() EndIf ... [/pre2] без этих изменений, не удерживался ::nRowPos (перепрыгивал на 1) и бывало не так, как надо перепоказ происходил Пример (на базе Tsb_addrecord): [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * */ #include "minigui.ch" #include "tsbrowse.ch" FIELD id, info *----------------------------------- PROCEDURE Main *----------------------------------- LOCAL i, obrw IF !hb_FileExists( "datab.dbf" ) dbCreate( "datab", { { "ID", "N", 5, 0 }, { "INFO", "C", 15, 0 } } ) ENDIF USE datab ALIAS base NEW INDEX ON id TO datab temporary IF LastRec() == 0 FOR i := 1 TO 200 APPEND BLANK REPLACE id WITH RecNo(), info WITH "record " + hb_ntos( RecNo(), 4 ) NEXT ENDIF DEFINE WINDOW win_1 AT 0, 0 WIDTH 400 HEIGHT 500 ; MAIN TITLE "TSBrowse Add Record Demo" NOMAXIMIZE NOSIZE @06, 10 BUTTON BRUN CAPTION "Add Record" ACTION AddRecord( obrw ) @06, 110 BUTTON BFND CAPTION "Find ID 100" ACTION FindRecord( obrw ) DEFINE STATUSBAR FONT _HMG_DefaultFontName SIZE _HMG_DefaultFontSize STATUSITEM "" END STATUSBAR DEFINE TBROWSE obrw AT 40, 10 GRID ALIAS "base" ; WIDTH 370 HEIGHT 418 - 60 ADD COLUMN TO obrw HEADER "ID" ; SIZE 100 ; DATA FieldWBlock( "id", Select( "base" ) ) ; TOOLTIP "My column 1" ADD COLUMN TO obrw HEADER "INFO" ; SIZE 150 ; DATA FieldWBlock( "info", Select( "base" ) ) ; TOOLTIP "My column 2" obrw:cToolTip := "My all columns TsBrowse tooltip" obrw:lNoHScroll := .T. obrw:SetColor( { 2 }, { {|| iif( base->( ordKeyNo() ) % 2 == 0, RGB( 255, 255, 255 ), RGB( 230, 230, 230 ) ) } } ) END TBROWSE obrw:SetFocus() END WINDOW CENTER WINDOW win_1 ACTIVATE WINDOW win_1 RETURN *----------------------------------- PROCEDURE AddRecord( obrw ) *----------------------------------- APPEND BLANK REPLACE id WITH RecNo(), info WITH "record " + hb_ntos( RecNo(), 4 ) obrw:GoToRec( base->( RecNo() ) ) obrw:SetFocus() RETURN FUNC FindRecord( obrw ) SEEK 100 obrw:GotoRec(RecNo()) obrw:SetFocus() RETURN [/pre2]

gfilatov2002: SergKis пишет: без этих изменений, не удерживался ::nRowPos Благодарю за помощь, сделал эти изменения в коде TSBrowse

gfilatov2002: Andrey пишет: добавь пожалуйста ! Очень нужно Не вопрос, уже добавил моргание (6 раз с интервалом в 50 миллисекунд)

gfilatov2002: Сегодня выпущен очередной релиз библиотеки MiniguiEx. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-16.03-setup.zip Также доступна сборка для компилятора MinGW32 по адресу: http://hmgextended.com/files/CONTRIB/hmg1603-mingw.exe и для компилятора MinGW64 по адресу: http://hmgextended.com/files/CONTRIB/minigui64-1603.exe и компактный архив для последней доступной версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg1603_xhb10146.zip Благодарю за Ваше внимание и поддержку данного проекта

Haz: Григорий , все же следующий вариант работает более корректно ( у себя заменил на него ) [pre2] //H_EVENTS.PRG _DoWindowEventProcedure ( _HMG_aFormGotFocusProcedure , i , 'WINDOW_GOTFOCUS' ) IF _HMG_IsModalActive BringWindowToTop(_HMG_ActiveModalHandle) if _HMG_aFormFocusedControl <> _HMG_ActiveModalHandle .and. _HMG_aFormType [ i ] <> "M" // Это нужно чтоб при вызове из модального окна - другого FlashWindowEx( _HMG_ActiveModalHandle , 1, 6, 50 ) // модального , старое не мограло end ELSE iif ( _HMG_aFormFocusedControl != 0 , setfocus ( _HMG_aFormFocusedControl ) , Nil ) END [/pre2] Проверял работу новой версии вот на примере ниже , если после запуска теста на панели задач выбрать мышью другое приложение , а потом опять тест - НЕ ВСЕГДА попадаем в модал да и моргает не то окно ( в титле окон видно ). А если переключать не мышом, а альт+таб , то вроде нормик [pre2] #include "minigui.ch" Function Main DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Main' ; MAIN ; ON INIT Child() END WINDOW Form_1.Activate Return Nil Func Child() Form_1.Hide DEFINE WINDOW Form_2 ; AT 100,100 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Standard' ; WINDOWTYPE STANDARD ; ON INIT Modal() END WINDOW Form_2.Activate Form_1.Show return nil Func Modal() DEFINE WINDOW Form_3 ; AT 200,200 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Modal' ; MODAL END WINDOW Form_3.Activate return nil [/pre2]

gfilatov2002: Haz пишет: следующий вариант работает более корректно Благодарю за пример! Предлагаю доработанный вариант кода с учетом Ваших замечаний: [pre2]... IF _HMG_IsModalActive BringWindowToTop ( _HMG_ActiveModalHandle ) IF iswinnt() .AND. ( _HMG_aFormType != 'M' .OR. ; _HMG_aFormFocused == .T. .AND. _HMG_aFormType [ AScan ( _HMG_aFormHandles, _HMG_aFormParentHandle ) ] == 'M' ) // Form's caption blinking FlashWindowEx ( _HMG_ActiveModalHandle , 1 , 5 , 60 ) ELSE _HMG_aFormFocused := .T. ENDIF ENDIF IF _HMG_aFormFocusedControl != 0 setfocus ( _HMG_aFormFocusedControl ) ENDIF [/pre2]

gfilatov2002: gfilatov2002 пишет: доработанный вариант кода Сделал "тихий" апдейт сборки 16.03 с учетом этих поправок Для кого это критично, могут обновить у себя инсталяцию BCC по ссылке выше

Haz: gfilatov2002 пишет: Сделал "тихий" апдейт сборки 16.03 с учетом этих поправок Спасибо, в таком варианте все работает.

Softlog86: Заметил небольшой баг . WINDOWS XP . Тема - "XP стандартная голубая" Контрол из MiniGui :FRAME Неправильно отображает цвета , указанные в FONTCOLOR ...... Пишу - WHITE - выводит вроде как зелёный :( WINDOWS -7 . Тема "Классическая" -отображение правильное . На других темах не проверял

gfilatov2002: Softlog86 пишет: Тема "Классическая" -отображение правильное Это не ошибка. В классической теме под WinXP будет также отображение правильное Выводы о поведении Винды в разных темах делайте самостоятельно...

Softlog86: просто другие контролы вырисовываются заданным цветом , а frame - почему-то по-своему . Чтоб ему еще прикрутить свойство NOXPSTYLE :) Посоветуйте как решить-то ? или тупо не использовать раскраску вовсе ? ругаются клиенты что ничего не видно . А предлагать им "сменить тему" ...... не так поймут .

gfilatov2002: Softlog86 пишет: Посоветуйте как решить Используйте в таком случае OwnerDraw frame как в примере из папки samples\Basic\LABEL_3 Вызов функции MyFrame(300,300,175,50,"20","My Frame",BLUE,LGREEN)

Softlog86: Спасибо за наводку .... Приму к сведению .....

sashaBG: У меня все Разморгалось с новой сборкой 16.03 :) Видимо потому что я пользуюсь только Модальными окнами . Причем в версии под MINGW имею Модальное окно которое моргает после того когда възвал и закрыл функцию MsgInfo() например. а в BCC наоборот сначало моргает MsgInfo() при показе а потом и основное Модальное окно из кторого функция бъла вызвана Григорий есть способ ето откльчить ?

Haz: sashaBG пишет: У меня все Разморгалось с новой сборкой 16.03 : Есть такое. При нескольких модальный они перемигиваются Скорее всего дело в условии [pre2] IF iswinnt() .AND. ( _HMG_aFormType != 'M' .OR. ; _HMG_aFormFocused == .T. .AND. _HMG_aFormType [ AScan ( _HMG_aFormHandles, _HMG_aFormParentHandle ) ] == 'M' ) [/pre2] поменял у себя на [pre2] if iswinnt() .AND. _HMG_aFormFocusedControl <> _HMG_ActiveModalHandle .and. _HMG_aFormType [ i ] <> "M" [/pre2] т.е. мигает только если пытается получить фокус не то окно которое является последним открытым модальным, а какое то другое. При этом окно которое хочет получить фокус не является модальным. После этой правки вроде полегчало и моргает только по делу. Для отключения, можно флаг организовать в исходнике типа lModalBlink и моргать только если он выставлен в .T.

gfilatov2002: sashaBG пишет: Григорий есть способ ето откльчить ? Да, надо в исходнике h_events.prg изменить обработку события WM_SETFOCUS таким образом: [pre2]... _DoWindowEventProcedure ( _HMG_aFormGotFocusProcedure [ i ] , i , 'WINDOW_GOTFOCUS' ) IF _HMG_IsModalActive .AND. Empty ( _HMG_InplaceParentHandle ) BringWindowToTop ( _HMG_ActiveModalHandle ) IF iswinnt() .AND. _HMG_aFormType [ i ] != 'M' // Form's caption blinking FlashWindowEx ( _HMG_ActiveModalHandle , 1 , 5 , 60 ) ENDIF ENDIF ...[/pre2] и пересобрать библиотеку



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