Форум » GUI » Как вернуть на экран своё окно ? » Ответить

Как вернуть на экран своё окно ?

Andrey: Непонятка большая у юзеров, да и у меня тоже.... Запускаю Фар и Мозилу, потом прогу на минигуи. В проге на МиниГуи открываю своё окно печати : [pre2] PUBLIC oBrwP ..... DEFINE WINDOW Form_F5 ; ..... nHandle := ThisWindow.Handle .... DEFINE TBROWSE oBrwP ; ..... CELL END TBROWSE .... @ nRowButt, nColButt BUTTONEX BUTTON_Print WIDTH nWButt HEIGHT nHButt ; .......... ACTION {|| MenuPrint("F5", oBrwP:nAt), DoEvents(), BringWindowToTop( nHandle ) } ....[/pre2] По кнопке в функции MenuPrint() ставлю в конце функции: [pre2]STATIC FUNCTION MenuF5F4(cFKey,nLine) ..... hWinHandle := nHandle cRet := &cRun(cMenu, cForma, ....) .... ShowWindow( hWinHandle, 6 ) // MINIMIZE windows ShowWindow( hWinHandle, 1 ) // SW_NORMAL windows DO EVENTS BringWindowToTop( hWinHandle ) // A window on the foreground BrwButtonShowHide(.T.) // разблокировать кнопки внизу формы DO EVENTS oBrwP:Setfocus() DO EVENTS SELECT(nTekSelect) RETURN Nil[/pre2] После выхода из cRet := &cRun(cMenu, cForma, ....) появляется окно Фара, а окно печати под Фаром. Если Фар скинуть на панель задач, то появляется окно Мозилы, а моё окно печати под ней. Почему так ? Как вернуть своё окно печати поверх всех окон ? Если Фар и Мозилу скинуть на панель задач, то только тогда появляется моё окно, т.к. нет других открытых задач. Но у юзеров постоянно куча окон открыто и они теряются, ищут окно печати. P.S. Забыл уточнить, на главной форме висит таймер каждые 1 минуту проверяет то что нужно.

Ответов - 9

Andrey: Опять непонятки поведения МиниГуи в Win8.1 и WinServer 2012 В WinServer 2012 теряется модальное окно. В проге есть окно Form_0 c бровсом(таблица) и кнопкой вызова для модального окна Form_1, на неё есть кнопка вызова другого модального окна Form_2. После закрытия Form_2 на экране остаётся таблица, которую нельзя редактировать, так как модальное окно Form_1 прячется на MAIN окне. Пока не тыкнешь на MAIN окне - только тогда поднимается модальное окно Form_1 и можно дальше работать. На Win8.1 такого нет. Достаточно ли будет поставить так, чтобы убрать эту непонятку ? [pre2] .... Show_Form2() // вызов модального окна Form_2 Form_1.Restore DO EVENTS[/pre2]

SergKis: Andrey пишет Достаточно ли будет поставить так, чтобы убрать эту непонятку ? Практика показала, что нет. Когда делал менеджер запуска clipper программ по DosBox и windows программ по командам из DosBox менеджером (ShellExecuteEx), описанная тобой ситуация, под 10 и 7 была во всей красе, под 8 все отлично, как надо. BringToTop не помогали. Моя борьба с этим закончилась тем, что окно менеджера минимизирую, запускаю wvt\hmg\vo программу и по окончании их работы поднимаю окно менеджера. Все сообщения менеджера, при окне DosBox и др. раб. окон (MsgStop(), MsgBox(),...) выходили но передний план, но не в фокусе, т.е. надо доп. по ним кликать мышкой. Сделал доп. комплект этих ф-й с добавленным параметром hWnd родителя и при 0 (окно десктоп родитель) окна сообщений стали работать почти как надо, кроме первого раза. Т.е. первый раз любое окно сообщения было не в фокусе. С окнами сообщений завершил работу тем, что убрал их и стал общаться с DosBox, т.е. перенес сообщения на прогу, работающую в DosBox (bat файл). В таком виде работает стабильно.

SergKis: Andrey Если Form_2 вызываешь из под Form_1, то попробуй на Form_2 до DEFINE WINDOW ... сделать hParent := _hmg_InplaceParentHandle _hmg_InplaceParentHandle := GetFormHandle(ThisWindow.Name) // 'Form_1' ... Form_2.Action _hmg_InplaceParentHandle := hParent


Andrey: SergKis пишет: Если Form_2 вызываешь из под Form_1, то попробуй на Form_2 до DEFINE WINDOW ... сделать У меня в программе 2 режима вызова этого окна. 1) сразу одна кнопка вызова Show_Form2() 2) есть доп.окно Form_1 и вызов с этого окна по кнопке Show_Form2() Как мне сделать эту обработку только для режима 2 ? Т.е. там [pre2] DEFINE WINDOW Form_1 .... @ ... nG BUTTONEX Btn_F4 ... ; .... ACTION {|| ToF4(), oBrw:SetFocus() } .... END WINDOW Form_1.Action ... Function ToF4() Show_Form2() // вызов модального окна Form_2 Form_1.Restore DO EVENTS Return Nil [/pre2] На втором компе проверил по удалёнке, там стоит WinServer 2008 - отлично работает, костылей не нужно.

SergKis: [pre2] FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... [/pre2] Делай для всех окон модальных, как я написал. Это привязка мод. окна к родителю. По умолчанию к main окну. Поможет ли ?

Andrey: SergKis пишет: Делай для всех окон модальных, как я написал. Это привязка мод. окна к родителю. По умолчанию к main окну. Поможет ли ? А куда это вставить, модуль какой ? Вообще то меня забодало (юзеров тоже), открываешь несколько модальных окон и потом нужно дергать MAIN окно. Может это нужно сразу поставить в МиниГуи ?

SergKis: Andrey пишет А куда это вставить, модуль какой ? У тебя, как понимаю, окна в функциях. Вот в них и делаешь. Повторю на твоем примере[pre2] LOCAL hParent := _hmg_InplaceParentHandle _hmg_InplaceParentHandle := GetFormHandle(ThisWindow.Name) DEFINE WINDOW Form_1 .... @ ... nG BUTTONEX Btn_F4 ... ; .... ACTION {|| ToF4(), oBrw:SetFocus() } .... END WINDOW Form_1.Action _hmg_InplaceParentHandle := hParent ... [/pre2]

Andrey: SergKis пишет: Вот в них и делаешь. Повторю на твоем примере Спасибо БОЛЬШОЕ ! Буду пробовать...

SergKis: PS Можно попробовать добавить[pre2] LOCAL cWnd := ThisWindow.Name LOCAL cFocus := This.FocusedControl ... _hmg_InplaceParentHandle := hParent DoMethod(cWnd, 'SetFocus') IF ! empty(cFocus) DoMethod(cWnd, cFocus, 'SetFocus') ENDIF ... [/pre2]



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