Форум » GUI » Вопросы новичка [MiniGUI] » Ответить

Вопросы новичка [MiniGUI]

Dima: MAIN окно не получило фокус ввода при запуске , почему ? Пример самодостаточный. [pre2] #include "minigui.ch" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_LANG_RUWIN REQUEST HB_LANG_RUWIN REQUEST HB_LANG_RU866 Func Main() DEFINE WINDOW Form_0 AT 321 , 491 WIDTH 558 HEIGHT 175 TITLE "Почему окно не в фокусе при запуске ?" ; MAIN NOSIZE NOSYSMENU TOPMOST ON INIT {|| MdiMain()} DEFINE BUTTONex Button_1 ROW 32 COL 424 WIDTH 110 HEIGHT 28 CAPTION "Вход" ACTION { || ret:=.t., DoMethod("Form_0","Hide") , DoMethod("Form_1","show") } FONTBOLD .t. END BUTTONex DEFINE BUTTONex Button_2 ROW 71 COL 424 CAPTION "Отмена" ACTION { || DoMethod("Form_0","Release") } WIDTH 110 HEIGHT 28 FONTBOLD .t. END BUTTONex END WINDOW Form_0.Activate Form_0.Setfocus return nil ***************************** Func Mdimain() DEFINE WINDOW Form_1 at 0,0 ; WIDTH 200 HEIGHT 300 TITLE "MDI windows" ; MDI ; NOSHOW END WINDOW Form_1.Center Form_1.Activate Form_0.Release return [/pre2]

Ответов - 129, стр: 1 2 3 4 5 6 7 All

Andrey: Dima пишет: Form_0.Release А зачем ты это делаешь ?

Dima: Andrey пишет: А зачем ты это делаешь ? Случайно вкралось. Но вопроса это не решило.

Andrey: Dima пишет: NOSHOW Не знаю правильно ли это сделано. Если окно не показывать - то фокус на нём и не будет ! Т.е. это окно скрытое, без показа !

Andrey: Попробуй ON INIT {|| MdiMain(), Form_0.Setfocus }

Haz: Dima пишет: MAIN окно не получило фокус ввода при запуске , почему Потому что в майн окне есть он инит , при выполнении которого выполняется Form_1.Activate. Activate работает так ( упрощенно ) - дает окну ФОКУС ( в нашем случае Form_1 ) и вызывает состояние ожидания пока окно не закроется Для решения вопроса нужно просто закоментить две строки //Form_1.Activate //Form_0.Release Теперь зачем в коде Form_0.Release было - для того что бы после закрытия окна Form_1 автоматом закрывалось и майн окно . Теперь, когда две строки закомментили фокус у майн будет , но после закрытия Form_1 задача не завершится и будет висеть в памяти ( окно то не видно , а в процессах есть ). Для решения этой проблемы в описании Form_1 нужно добавить ON INTERACTIVECLOSE {|| Domethod("Form_0","Release"), .T.}

Haz: Andrey пишет: Попробуй ON INIT {|| MdiMain(), Form_0.Setfocus } не поможет

Dima: Haz Да заработало

Dima: Есть MAIN MENU , хочу в ниспадающее меню (в RUNTIME) добавлять и удалять пункты меню. Пробовал _InsertMenuItem но оно добавляет не туда куда надо. Хотел при открытии окон , "корректировать" эту менюшку ....то есть когда много окошек открыто можно было тупо зайти в главное меню и выбрать нужное окошко с переходом фокуса ввода на него. Окна открываются из MDI окна , окно не MAIN , окошки открываю MDICHILD. Пример нужен или я понятно выразился ? )) PS MRU меню не предлагать так как создает MRU.INI там где прога живет. А прога по идее жить будет на серваке , в папке только для чтения.

gfilatov2002: Dima пишет: MRU меню не предлагать так как создает MRU.INI там где прога живет Просто к сведению. Команда MRU имеет дополнительный класс FILENAME <имя файла> для задания имени и пути для ини-файла, который можно создавать во временной папке, открытой для записи

Dima: gfilatov2002 Понял , попробую. А если без MRU , как добавить корректно пункт в выпадающее меню. PS Сразу видно что ответил человек которому и пример не нужен и сразу понял мысль Респект !

SergKis: Dima Можно в statusbar иметь icon, по клику делать окно (можно modal) со списком для выбора и перехода

Dima: Меню с MRU заявлено так [pre2] ......... END POPUP POPUP "Окна" NAME OPENWIND MRU FILENAME System.TempFolder + "\temp.ini" END POPUP END POPUP END MENU [/pre2] В совершенно другом окне при его создании , добавляю пунктик в MRU меню (Главного окна) так: [pre2] Func MyMditool(cforma,ctitle) _InsertMenuItem ( "OPENWIND" , "Form_1" , ctitle , ; {||DoMethod(mymenuhash[cforma],"Restore"),DoMethod(mymenuhash[cforma],"Setfocus")}) .......... [/pre2] И получаю следующий бред. Картинка Нужные пункты добавились и в MRU меню и в горизонтальное между пунктом Настройки и Окна (о чем прогу я не просил собственно). Кроме того добавленный мною Action срабатывает только в этих не заявленных мною пунктах. Если те же пункты в MRU клацать в пункте Окна то ни какой реакции. По картинке (до кучи) хорошо видно что используется SET MENUSTYLE EXTENDED и на добавленных в RunTime пунктах это свойство теряется.

SergKis: Dima SergKis пишет:Можно в statusbar иметь... суть та же, а дизайн свой (отличный от mru). список можно делать горизонтально, вертикально, окно по краю или за пределами Mdi, по on change списка переключать mdichild окна сразу на показ ...

Dima: SergKis В самплесах есть примерчик ? Интересует не только добавление в меню но и удаление из него ( при закрытии нужных окон )

SergKis: Dima в качестве списка может быть array TsBrowse, Grid (с картинками), примеры есть при формировании окна modal надо отключить режим mdi по завершении работы окна включить снова за базу можно взять и пример basic\msgmenu\*.*. Вот обрывки у меня из mdi надергал по быстрому: [pre2] ... DEFINE WINDOW wMain ; AT 0, 0 ; WIDTH GetClientWidth () * nKfcW ; HEIGHT GetClientHeight() * nKfcH ; TITLE gTxt(Title) ; ICON cIcon ; MAIN MDI ; CURSOR cCursor ; ON INIT MainExecute() ; ON RELEASE MainExecute() ; ON MOUSECLICK MainExecute() ; ON INTERACTIVECLOSE MainExecute() ; BACKCOLOR aBColor _wCargoSet('') // Wnd.Cargo для окна MainMenu(cPref) // меню от префикса MainStatusBar() // StatusBar hWnd := FormHandle(wMain) AppSet(MainName , GetFormName()) AppSet(MainIndex , FormIndex(wMain)) AppSet(MainHandle, hWnd) AppSet(MainVhod1 , empty(g_Cfg(AppGet(MainName) + cCursor, '', [Window]))) // первый вход AppSet(SBarHeight, GetWindowHeight(ControlHandle(StatusBar, wMain))) AppSet(TBarHeight, 0) AppSet(MainClientWidth , GetClientWidth (hWnd)) AppSet(MainClientHeight, GetClientHeight(hWnd) - AppGet(SBarHeight)) END WINDOW ... STATIC FUNCTION MainStatusBar( cFont, nSize, lBold ) // MDI Main StatusBar LOCAL oS := Application.Sets LOCAL nW3 := oS:W(20) + 16 LOCAL nW4 := oS:W(30) + 16 LOCAL nW5 := oS:W(,4) + 16 LOCAL nW2 := int(( GetClientWidth( _HMG_MainHandle ) - nW3 - nW4 - nW5 ) * 0.4 ) DEFAULT cFont := oS:cFontName, ; nSize := oS:nDefFontSize, ; lBold := .T. IF lBold DEFINE STATUSBAR FONT cFont SIZE nSize BOLD ELSE DEFINE STATUSBAR FONT cFont SIZE nSize ENDIF STATUSITEM "" ACTION MainExecute('stb.1') STATUSITEM "" WIDTH nW2 ACTION MainExecute('stb.2') STATUSITEM "" WIDTH nW3 ACTION MainExecute('stb.3') ICON 'D_DAT' STATUSITEM "" WIDTH nW4 ACTION MainExecute('stb.4') ICON 'D_ORG' STATUSITEM "" WIDTH nW5 ACTION MainExecute('stb.5') ICON 'D_SET' END STATUSBAR RETURN FUNCTION MainExecute( cKey, cTxt ) // выполнение в главном окне LOCAL a,i,j,k LOCAL cThis := '', lRet := .T., o := AppGet(Leto) LOCAL cMain_menu := 'Main_menu_' /* msglog( CRLF ) msglog( procname(), o:IsErrConnect(), o:cPathBase, o:cPathLocal ) msglog( '_HMG_ThisEventType ', _HMG_ThisEventType ) msglog( '_HMG_ThisFormIndex ', _HMG_ThisFormIndex ) msglog( '_HMG_ThisType ', _HMG_ThisType ) msglog( '_HMG_ThisIndex ', _HMG_ThisIndex ) msglog( '_HMG_ThisFormName ', _HMG_ThisFormName ) msglog( '_HMG_ThisControlName', _HMG_ThisControlName) */ IF _HMG_ThisEventType == 'WINDOW_INIT' // ON INIT IF o:IsErrConnect() o:ErrorMsg() ELSE ENDIF ELSEIF _HMG_ThisEventType == 'WINDOW_ONINTERACTIVECLOSE' // ON RELEASE lRet := YesNoMainClose() ELSEIF _HMG_ThisEventType == 'WINDOW_RELEASE' // ON INTERACTIVECLOSE CLOSE ALL IF ! o:ErrorMsg(); o:DisConnect() ENDIF ELSEIF ! empty(_HMG_ThisControlName) .and. ! empty(cKey) // Menu item execute cThis := _HMG_ThisControlName // меню name IF left(cThis, len(cMain_menu)) == cMain_menu i := RAt('_', cThis) j := left(cThis, i-1)+'.'+subs(cThis, i+1) j := subs(j, RAt('_', j)+1) IF j == '1.9'; cKey := j // Exit item из пункта меню с префиксом ENDIF ENDIF IF cKey == '1.9' // Exit item RETURN YesNoMainClose() ELSEIF cKey == '2.1' Wnd_SetKassa() ELSEIF cKey == '2.2' Wnd_SetPVN() ELSEIF cKey == '2.3' Wnd_SetProv() ELSEIF cKey == '2.4' Wnd_Test() ELSEIF cKey == '7.1' Imp_OldBase() ELSEIF 'stb.' $ cKey a := { ; {"1.", "Item line 1", "Execute 1"}, ; {"2.", "Item line 2", "Execute 2"}, ; {"3.", "Item line 3", "Execute 3"}, ; {"4.", "Item line 4", "Execute 4"}, ; {"5.", "Item line 5", "Execute 5"}, ; {"6.", "Item line 6", "Execute 6"}, ; {"7.", "Item line 7", "Execute 7"}, ; {"8.", "Item line 8", "Execute 8"}, ; {"9.", "Item line 9", "Execute 9"} ; } i := 0 IF cKey == 'stb.1' ELSEIF cKey == 'stb.2' ELSEIF cKey == 'stb.3' i := mAchoice(a, 1, 8, 'Setting') ELSEIF cKey == 'stb.4' i := mAchoice(a, 1, 9, 'Setting') ELSEIF cKey == 'stb.5' i := mAchoice(a, 1, 10, 'Setting') ENDIF MsgBox('StatusBar press '+hb_valtoexp(i), 'Achoice') ENDIF ENDIF RETURN lRet FUNCTION mAchoice( aAchoice, nValue, nLayOut, cTitle, nSize, nLines, nRow, nCol ) // меню Achoice LOCAL a, i, j, k LOCAL aItems := {}, aRezult := {} LOCAL aJustify, aHeaders, aWidths, nW, nH LOCAL nAchoice := 0, lNoLines := .T., lHeaders := .F. LOCAL nKols, nWidth := 4, nHeight := 100, lCell := .F. LOCAL cIcon := AppGet(MainIcon) LOCAL aBackColor := AppGet(BackColor) LOCAL cFontName := AppGet(FontNameDef) LOCAL nFontSize := AppGet(FontSizeDef) LOCAL lFontBold := .F., aFontColor, lSysMenu LOCAL lSelected := .T., nMaxRow := 21, uParent, cParent, hParent LOCAL nParentWidth, nParentHeight, nFormWidth, nFormHeight LOCAL nAppRow := Application.Row + GetBorderHeight() + GetTitleHeight() + GetMenuBarHeight() LOCAL nAppCol := Application.Col + GetBorderWidth() LOCAL aHmg := Save_Rest_HMG() DEFAULT nValue := 1, ; nRow := 0, ; nCol := 0, ; cTitle := '', ; nSize := nFontSize, ; nLines := nMaxRow, ; nLayOut := 0 IF hb_IsChar(nSize); nSize := nFontSize + val(nSize) // increment для FontSize ENDIF lSysMenu := ! empty(cTitle) IF empty(aAchoice) RETURN nAchoice ELSEIF hb_IsArray(aAchoice) aItems := aAchoice lHeaders := .F. ELSEIF hb_IsHash(aAchoice) nRow := hb_HGetDef(aAchoice, "ROW" , nRow ) nCol := hb_HGetDef(aAchoice, "COL" , nCol ) aItems := hb_HGetDef(aAchoice, "ITEMS" , NIL) aHeaders := hb_HGetDef(aAchoice, "HEADERS" , NIL) aJustify := hb_HGetDef(aAchoice, "JUSTIFY" , NIL) aRezult := hb_HGetDef(aAchoice, "RETURN" , {} ) cTitle := hb_HGetDef(aAchoice, "TITLE" , cTitle) cFontName := hb_HGetDef(aAchoice, "FONT" , cFontName) nFontSize := hb_HGetDef(aAchoice, "SIZE" , nFontSize) lFontBold := hb_HGetDef(aAchoice, "BOLD" , lFontBold) aFontColor := hb_HGetDef(aAchoice, "FCOLOR" , NIL) aBackColor := hb_HGetDef(aAchoice, "BCOLOR" , NIL) uParent := hb_HGetDef(aAchoice, "PARENT" , NIL) cIcon := hb_HGetDef(aAchoice, "ICON" , cIcon) lNoLines := hb_HGetDef(aAchoice, "NOLINES" , lNoLines) lSysMenu := hb_HGetDef(aAchoice, "SYSMENU" , lSysMenu) lSelected := hb_HGetDef(aAchoice, "SELECTED", lSysMenu) nLines := hb_HGetDef(aAchoice, "MAXROW" , nMaxRow ) nLayOut := hb_HGetDef(aAchoice, "LAYOUT" , nLayOut ) lHeaders := ! empty(aHeaders) ENDIF IF empty(aItems); RETURN nAchoice ENDIF nMaxRow := nLines nKols := len(aItems) IF nMaxRow > nKols; nMaxRow := nKols ENDIF IF ! empty(nSize) ; nFontSize := nSize ENDIF IF nValue > nKols ; nValue := nKols ENDIF IF empty(aRezult) ; aRezult := array(nKols) ENDIF IF empty(aJustify); aJustify := array(nKols) ENDIF IF ! lHeaders aHeaders := array(nKols) aEval(aHeaders, {|x,n| aHeaders[ n ] := hb_ntos(n) }) ENDIF IF empty(uParent) IF ! empty(_HMG_MainClientMDIName) uParent := _HMG_MainClientMDIName ELSEIF ! empty(_HMG_ActiveFormName) uParent := _HMG_ActiveFormName ELSE uParent := Application.FormName ENDIF ENDIF hParent := iif(hb_IsChar(uParent), GetFormHandle(uParent), uParent) IF ! empty(hParent) IF ( i := AScan( _HMG_aFormHandles, hParent) ) > 0 cParent := _HMG_aFormNames[ i ] ENDIF ENDIF nParentWidth := GetClientWidth (hParent) nParentHeight := GetClientHeight (hParent) nAppRow += GetToolBarHeight(hParent) k := len(aItems[1]) aWidths := array(k) a := array(k); aFill(a, 0) FOR i := 1 TO len(aItems) FOR j := 1 TO k a[ j ] := Max(a[j], GetTxtWidth(aItems[ i ][j] + repl('W', 2), nFontSize, cFontName)) NEXT NEXT aEval(aWidths , {|x,n| aWidths [ n ] := a[ n ] }) aEval(aWidths , {|x,n| nWidth += (x + 1) }) IF nKols > nMaxRow; nWidth += GetVScrollBarWidth() // items больше строк в показе ENDIF DEFINE WINDOW wAchoice AT 0,0 WIDTH 100 HEIGHT 100 ICON cIcon MODAL _SetThisFormInfo(FormIndex(wAchoice)) ThisWindow.Sizable := .F. ThisWindow.MaxButton := .F. ThisWindow.MinButton := .F. ThisWindow.Title := cTitle ThisWindow.TitleBar := ! empty(cTitle) ThisWindow.SysMenu := lSysMenu DEFINE GRID Achoice ROW 0 COL 0 WIDTH nWidth HEIGHT nHeight HEADERS aHeaders WIDTHS aWidths ITEMS aItems VALUE nValue NOLINES lNoLines CELLNAVIGATION lCell SHOWHEADERS lHeaders FONTNAME cFontName FONTSIZE nFontSize FONTBOLD lFontBold FONTCOLOR aFontColor BACKCOLOR aBackColor JUSTIFY aJustify IF lSelected ON DBLCLICK ( nAchoice := wAchoice.Achoice.Value, ThisWindow.Release ) ENDIF END GRID wAchoice.Achoice.Height := GetHeghtBrowse( ControlHandle(Achoice, wAchoice), nMaxRow ) wAchoice.Height := GetTitleHeight() + wAchoice.Achoice.Height + GetBorderHeight() + 2 wAchoice.Width := GetBorderWidth() + wAchoice.Achoice.Width + 2 nFormHeight := wAchoice.Height nFormWidth := wAchoice.Width IF empty(nRow + nCol) .and. nParentWidth > nFormWidth .and. nParentHeight > nFormHeight nH := nParentHeight - nFormHeight - GetBorderHeight() - GetStatusBarHeight() nW := nParentWidth - nFormWidth IF ! ThisWindow.TitleBar; nH += GetTitleHeight() ENDIF IF nLayOut == 0 // центровать в Desktop ELSEIF nLayOut == 1 // левый ВЕРХНИЙ угол в parent окне nRow := 1 nCol := 1 ELSEIF nLayOut == 2 // ( 0.3 ) ВЕРХНИЙ угол в parent окне nRow := 1 nCol := int(nW * 0.33) ELSEIF nLayOut == 3 // центр. ВЕРХНИЙ угол в parent окне nRow := 1 nCol := int(nW / 2) ELSEIF nLayOut == 4 // ( 0.6 ) ВЕРХНИЙ угол в parent окне nRow := 1 nCol := int(nW * 0.67) ELSEIF nLayOut == 5 // правый ВЕРХНИЙ угол в parent окне nRow := 1 nCol := nW ELSEIF nLayOut == 6 // левый НИЖНИЙ угол в parent окне nRow := nH nCol := 1 ELSEIF nLayOut == 7 // ( 0.3 ) НИЖНИЙ угол в parent окне nRow := nH nCol := int(nW * 0.33) ELSEIF nLayOut == 8 // центр. НИЖНИЙ угол в parent окне nRow := nH nCol := int(nW / 2) ELSEIF nLayOut == 9 // ( 0.6 ) НИЖНИЙ угол в parent окне nRow := nH nCol := int(nW * 0.67) ELSEIF nLayOut == 10 // правый НИЖНИЙ угол в parent окне nRow := nH nCol := nW ELSEIF nLayOut == 11 // центровать в parent окне nRow := int(nH / 2) nCol := int(nW / 2) ENDIF ENDIF IF nRow > 0 .and. nCol > 0 wAchoice.Row := nAppRow + nRow wAchoice.Col := nAppCol + nCol ENDIF END WINDOW _SetThisFormInfo() IF empty(nRow) .and. empty(nCol); CENTER WINDOW wAchoice ENDIF ACTIVATE WINDOW wAchoice Save_Rest_HMG(aHmg) IF nAchoice > 0 .and. ! empty(aRezult[ nAchoice ]); nAchoice := aRezult[ nAchoice ] ENDIF RETURN nAchoice FUNCTION Save_Rest_HMG( uHMG ) // save\restore _HMG_... переменные пере MODAL LOCAL aHMG IF hb_IsArray(uHMG) aHMG := uHMG _HMG_BeginWindowMDIActive := aHMG[ 1] _HMG_ActiveStatusHandle := aHMG[ 2] _HMG_UserWindowHandle := aHMG[ 3] _HMG_SetFocusExecuted := aHMG[ 4] _HMG_ThisFormName := aHMG[ 5] _HMG_ThisControlName := aHMG[ 6] _HMG_ActiveFontName := aHMG[ 7] _HMG_ActiveFontSize := aHMG[ 8] _HMG_ExtendedNavigation := aHMG[ 9] _HMG_InplaceParentHandle := aHMG[10] ELSE aHMG := array(10) aHMG[ 1] := _HMG_BeginWindowMDIActive aHMG[ 2] := _HMG_ActiveStatusHandle aHMG[ 3] := _hmg_UserWindowHandle aHMG[ 4] := _HMG_SetFocusExecuted aHMG[ 5] := _HMG_ThisFormName aHMG[ 6] := _HMG_ThisControlName aHMG[ 7] := _HMG_ActiveFontName aHMG[ 8] := _HMG_ActiveFontSize aHMG[ 9] := _HMG_ExtendedNavigation aHMG[10] := _HMG_InplaceParentHandle _HMG_BeginWindowMDIActive := .F. _HMG_ExtendedNavigation := .T. ENDIF RETURN aHMG [/pre2]

SergKis: может еще это:[pre2] FUNCTION GetWndMDIChildAll() // Получить массивом все имена доступных дочерних окон LOCAL i, k, aNames:={} k := Len( _HMG_aFormNames ) FOR i := 1 TO k IF _HMG_aFormType=='Y' AAdd(aNames, _HMG_aFormNames ) ENDIF NEXT RETURN aNames [/pre2]

Dima: SergKis Спасибо , буду разбираться !

Dima: DEFINE CONTEXT MENU OF FORM_1 его можно убить через RELEASE CONTEXT MENU OF Form_1 А как убить DEFINE CONTEXT MENU CONTROL StatusBar OF FORM_1 способ RELEASE CONTEXT MENU OF Form_1 не катит

Dima: Есть MDI окно , в ACTION статусбара висит функция , которая создает MODAL окно и в котором живет GRID. Это работает. Стоит вместо GRID сунуть туда TSBROWSE , при вызове функция падает и пишет нет парента ;) Едем дальше. Из MDI окна создаем MDICHILD окно. Снова топчем мышей по статус бару и если в функции живет GRID , то все работает. Если там живет TSBROWSE , тогда он начинает жить не в окне MODAL как ему и предписано а в MDICHILD. Григорий писал что MDI это темная история ;) Не думал я что до такой степени ;)

Andrey: Да не используй MDICHILD и всех делов. Я тоже от них отказался...

SergKis: Dima пишет:Не думал я что до такой степени попробовал простой пример [pre2] #include "minigui.ch" REQUEST DBFCDX, DBFFPT, DBFNTX STATIC nWndChild := 0 *----------------------------------------------------------------------------- FUNCTION MAIN( ... ) *----------------------------------------------------------------------------- RddSetDefault ("DBFCDX") SET CENTURY ON SET DATE GERMAN SET DELETED ON SET EXCLUSIVE ON SET EPOCH TO 2000 SET AUTOPEN OFF SET EXACT ON SET SOFTSEEK ON SET BROWSESYNC ON DEFINE WINDOW wMain ; AT 0, 0 ; WIDTH 800 ; HEIGHT 500 ; TITLE 'Test MDI window' ; MAIN MDI ; ON INIT MainExecute() ; ON RELEASE MainExecute() ; ON MOUSECLICK MainExecute() ; ON INTERACTIVECLOSE MainExecute() DEFINE MAIN MENU POPUP 'Test' ITEM 'Child window new' ACTION Wnd_Child() SEPARATOR ITEM 'Exit' ACTION ThisWindow.Release END POPUP END MENU DEFINE STATUSBAR STATUSITEM "" ACTION MainExecute('stb.1') STATUSITEM "" WIDTH 150 ACTION MainExecute('stb.2') STATUSITEM "" WIDTH 40 ACTION MainExecute('stb.3') STATUSITEM "" WIDTH 40 ACTION MainExecute('stb.4') STATUSITEM "" WIDTH 40 ACTION MainExecute('stb.5') END STATUSBAR END WINDOW CENTER WINDOW wMain ACTIVATE WINDOW wMain RETURN NIL FUNCTION MainExecute( cKey ) // выполнение в главном окне LOCAL lRet := .T. IF _HMG_ThisEventType == 'WINDOW_INIT' // ON INIT ELSEIF _HMG_ThisEventType == 'WINDOW_ONINTERACTIVECLOSE' // ON INTERACTIVECLOSE ELSEIF _HMG_ThisEventType == 'WINDOW_RELEASE' // ON RELEASE ELSEIF ! empty(_HMG_ThisControlName) .and. ! empty(cKey) // StatusBar execute IF 'stb.' $ cKey IF cKey == 'stb.3' Wnd_Modal() ELSEIF cKey == 'stb.4' Wnd_Modal() ELSEIF cKey == 'stb.5' Wnd_Modal() ENDIF MsgBox('StatusBar press '+right(cKey, 1), 'INFO') ENDIF ENDIF RETURN lRet FUNCTION Wnd_Child( cName, cTitle ) // Child window nWndChild += 1 DEFAULT cName := 'MDI_'+'Child_'+hb_ntos(nWndChild), ; cTitle := cName DEFINE WINDOW &cName ; AT GetMenuBarHeight(), 0 ; TITLE cTitle ; MDICHILD FOCUSED ; ON INIT NIL ; ON RELEASE NIL ThisWindow.Maximize END WINDOW RETURN FUNCTION Wnd_Modal( cTitle ) // Modal window LOCAL aHmg DEFAULT cTitle := 'Modal_'+ThisWindow.Name aHmg := Save_Rest_HMG() DEFINE WINDOW wModal AT 0,0 WIDTH 400 HEIGHT 300 MODAL ThisWindow.Sizable := .F. ThisWindow.MaxButton := .F. ThisWindow.MinButton := .F. ThisWindow.Title := cTitle ThisWindow.TitleBar := .T. ThisWindow.SysMenu := .T. END WINDOW CENTER WINDOW wModal ACTIVATE WINDOW wModal Save_Rest_HMG(aHmg) RETURN FUNCTION Save_Rest_HMG( uHMG ) // save\restore _HMG_... переменные пере MODAL LOCAL aHMG IF hb_IsArray(uHMG) aHMG := uHMG _HMG_BeginWindowMDIActive := aHMG[ 1] _HMG_ActiveStatusHandle := aHMG[ 2] _HMG_UserWindowHandle := aHMG[ 3] _HMG_SetFocusExecuted := aHMG[ 4] _HMG_ThisFormName := aHMG[ 5] _HMG_ThisControlName := aHMG[ 6] _HMG_ActiveFontName := aHMG[ 7] _HMG_ActiveFontSize := aHMG[ 8] _HMG_ExtendedNavigation := aHMG[ 9] _HMG_InplaceParentHandle := aHMG[10] ELSE aHMG := array(10) aHMG[ 1] := _HMG_BeginWindowMDIActive aHMG[ 2] := _HMG_ActiveStatusHandle aHMG[ 3] := _hmg_UserWindowHandle aHMG[ 4] := _HMG_SetFocusExecuted aHMG[ 5] := _HMG_ThisFormName aHMG[ 6] := _HMG_ThisControlName aHMG[ 7] := _HMG_ActiveFontName aHMG[ 8] := _HMG_ActiveFontSize aHMG[ 9] := _HMG_ExtendedNavigation aHMG[10] := _HMG_InplaceParentHandle _HMG_BeginWindowMDIActive := .F. _HMG_ExtendedNavigation := .T. ENDIF RETURN aHMG [/pre2] ерунда получается со statusbar, да с окном main после modal, похоже разбираться надо по новой c mdi в последних версиях. Работаем с mdi из версии 4.07 MiniGui и правили кое что под себя - все проги только с mdi интерфейсом и работают на ура. Пример advanced\TsBrowse (mdi часть) вроде работает, но там только окна mdichild.

Dima: SergKis пишет: ерунда получается со statusbar да это так , еще и с тулбар тоже. буду копать дальше пока не надоест ;) Andrey пишет: Да не используй MDICHILD и всех делов. Так и сделаю пока все копья не сломаю )) Просто зацепили меня MDICHILD так как живут внутри MDI , и это все что было мне надо. Примерчик твой посмотрел. Код как бы в порядке. Скрин MDI окна после закрытия MDICHILD окна (все съехало и уехало хз куда)

SergKis: Dima я про это говорил, думаю есть еще переменные _HMG_..., которые цепляются modalom и не восстанавливаются (это первая мысль, но может все и не так) вот к меню C фун. (покрути), делал мой товарищ, он что то использовал, я обошелся. может помогут в дополнение к c_menu.c: [pre2] // BAA HB_FUNC( DRAWMENUBAR ) { DrawMenuBar( ( HWND ) hb_parnl(1) ); } // BAA HB_FUNC( GETSUBMENU ) { HMENU hMnu = GetSubMenu( ( HMENU ) hb_parnl(1), hb_parnl(2)-1 ); hb_retnl( ( LONG ) hMnu ); } // BAA HB_FUNC( MODIFYMENU ) { // | MF_POPUP hb_retnl( ModifyMenu( ( HMENU ) hb_parnl(1), hb_parni(2)-1, MF_BYPOSITION | MF_STRING , hb_parni(3), hb_parc_t(4) ) ); } // BAA HB_FUNC( MODIFYMENUID ) { // | MF_POPUP hb_retnl( ModifyMenu( ( HMENU ) hb_parnl(1), hb_parni(2), MF_BYCOMMAND | MF_STRING , hb_parni(3), hb_parc_t(4) ) ); } // BAA HB_FUNC( GETMENUITEMID ) { DWORD Id = GetMenuItemID( ( HMENU ) hb_parnl(1), hb_parnl(2)-1 ); hb_retnl( ( LONG ) Id ); } // BAA HB_FUNC( ISMENUSEPARATOR ) { UINT state; // hMenu Pos state = GetMenuState( ( HMENU ) hb_parnl(1), hb_parni(2)-1, MF_BYPOSITION ); if( state != 0xFFFFFFFF ) hb_retl( ( state & MF_SEPARATOR ) ? TRUE : FALSE ); else hb_retl( FALSE ); } // BAA HB_FUNC( ISMENUPOPUP ) { UINT state; // hMenu Pos state = GetMenuState( ( HMENU ) hb_parnl(1), hb_parni(2)-1, MF_BYPOSITION ); if( state != 0xFFFFFFFF ) hb_retl( ( state & MF_POPUP ) ? TRUE : FALSE ); else hb_retl( FALSE ); } // BAA HB_FUNC( ISMENUSEPARATORID ) { UINT state; // hMenu Id state = GetMenuState( ( HMENU ) hb_parnl(1), hb_parni(2), MF_BYCOMMAND ); if( state != 0xFFFFFFFF ) hb_retl( ( state & MF_SEPARATOR ) ? TRUE : FALSE ); else hb_retl( FALSE ); } // BAA HB_FUNC( SETMENUDEFAULTITEM ) { BOOL Ret = SetMenuDefaultItem( ( HMENU ) hb_parnl(1), ( UINT ) hb_parnl(2), FALSE ); hb_retl( Ret ); } // BAA HB_FUNC( SETPARENT ) { SetParent( ( HWND ) hb_parnl(1), ( HWND ) hb_parnl(2) ); } // BAA HB_FUNC( GETPARENT ) { hb_retnl( ( LONG ) GetParent( ( HWND ) hb_parnl(1) ) ); } [/pre2] описание (очень краткое) [pre2] hMenu := GetMenu( hWnd ) k := GetMenuItemCount( hMenu ) IsMenuPopUp( hMenu, i) hSubMenu := GetSubMenu( hMenu, i) IsMenuSeparator( hMenu, i) ModifyMenu( hMenu, i, hSubMenu, "......" ) ModifyMenuItem( hMenu, Id, Id, " ..... " ) DrawMenuBar( hWnd ) [/pre2]

Dima: SergKis Спасибо

Dima: SergKis Не собрать однако obj/mmenu.o:mmenu.c:(.text+0x77): undefined reference to `hb_parc_t' obj/mmenu.o:mmenu.c:(.text+0xf7): undefined reference to `hb_parc_t' C:/MinGW12/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: obj/mmenu.o: bad reloc address 0x20 in s ection `.eh_frame' C:/MinGW12/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: final link failed: Invalid operation collect2.exe: error: ld returned 1 exit status hbmk2[sklad]: Error: Running linker. 1

Dima: SergKis пишет: Save_Rest_HMG(aHmg) А вот эта функция все исцелила чудесным образом и TSBROWSE не падает и ложится куда надо. Это костыль получается ?

SergKis: Dima пишет:Не собрать однако извини, забываю, что у нас внутри все тексты в unicode, а это все конвертации в один байт. хотел как лучше, но ... Это костыль получается ? типа да, родной mdi (minigui) работает с окнами mdichild, с модал запрещено, а без них как то не очень. Если у тебя есть движение вперед, то обрати внимание на editbox, если окон > 2 фокус после ввода в нем улетал на др.окно (на mdichild мы используем только getbox вместо editbox), побороть это не смогли. А с mdichild окнами получилось так, в работе остаются где то 1-2 окна документа, а остальные разрушаем при потере фокуса (справочники). Еще есть установка SET PROGRAMMATIC OFF, при ней имена mdichild окон как ты задал, при ON имена динамические (добавляется счетчик окон к имени, заданному тобой), на что еще влияет эта установка не смотрел (в нашей версии этого нет).

Dima: SergKis Спасибо , многое прояснил. Про SET PROGRAMMATIC не знал и пока сам ловлю счетчик окон.

Dima: SergKis Не могу собрать Achoice (примерчик) Не хватает функций [pre2] undefined reference to `HB_FUN_APPGET' undefined reference to `HB_FUN_GETCLIENTWIDTH' undefined reference to `HB_FUN_GETCLIENTHEIGHT' undefined reference to `HB_FUN_GETTOOLBARHEIGHT' undefined reference to `HB_FUN_GETTXTWIDTH' undefined reference to `HB_FUN_FORMINDEX' undefined reference to `HB_FUN_GETHEGHTBROWSE' undefined reference to `HB_FUN_CONTROLHANDLE' undefined reference to `HB_FUN_GETSTATUSBARHEIGHT' [/pre2]

SergKis: Dima пишет:Не хватает функций тут: // команды для сокращения формы записи - без кавычек имена !!! // получить Handle окна #translate FormHandle ( <FormName> ) => GetFormHandle ( <"FormName"> ) #translate FHandle ( <FormName> ) => GetFormHandle ( <"FormName"> ) // получить Index окна #translate FormIndex ( <FormName> ) => GetFormIndex ( <"FormName"> ) #translate FIndex ( <FormName> ) => GetFormIndex ( <"FormName"> ) // получить Handle контрола #translate ControlHandle ( <ControlName> , <FormName> ) => ; GetControlHandle ( <"ControlName"> , <"FormName"> ) #translate CHandle ( <ControlName> , <FormName> ) => ; GetControlHandle ( <"ControlName"> , <"FormName"> ) // получить Index контрола #translate ControlIndex ( <ControlName> , <FormName> ) => ; GetControlIndex ( <"ControlName"> , <"FormName"> ) #translate CIndex ( <ControlName> , <FormName> ) => ; GetControlIndex ( <"ControlName"> , <"FormName"> ) #translate ColumnsWidthAutoH ( <ControlName> , <FormName> ) => ; _SetColumnsWidthAutoH( <"ControlName"> , <"FormName"> ) #translate AppSet ( <KeyName> , <Value> ) => AppCargo( <"KeyName">, <Value> ) #translate AppGet ( <KeyName> ) => AppCargo( <"KeyName"> ) STATIC oCargo_App FUNCTION AppCargo( cKey, uVal ) LOCAL j, k := pCount() IF oCargo_App == NIL; oCargo_App := hb_Hash() ENDIF IF k > 1; hb_HSet (oCargo_App, upper(cKey), uVal) ELSEIF k > 0; RETURN hb_HGetDef(oCargo_App, upper(cKey), NIL ) ENDIF RETURN NIL GetClientWidth(), GetClientHeight() см. SAMPLES\Advanced\Tsb_Config\Tsb_Config.prg FUNCTION GetToolBarHeight( hParent ) // высота ToolBar LOCAL nHeight := 0, hControl := 0 LOCAL i, k := len(_HMG_aControlHandles) FOR i := 1 TO k IF _HMG_aControlParenthandles [ i ] == hParent .and. _HMG_aControlType [ i ] == "TOOLBAR" hControl := _HMG_aControlHandles [ i ] nHeight := GetWindowHeight(hControl) ENDIF NEXT RETURN nHeight FUNCTION GetStatusBarHeight( cForm ) // высота StatusBar DEFAULT cForm := ThisWindow.Name RETURN GetWindowHeight(GetControlHandle('STATUSBAR', cForm)) FUNCTION GetHeghtBrowse( hBrw, nRows ) // height Grid\Browse от указанного nRows LOCAL a a := ListViewApproximateViewRect( hBrw, nRows - 1 ) // { Width, Height } a[1] += Round(GetBorderWidth ()/2, 0) // Width a[2] += Round(GetBorderHeight()/2, 0) + 2 // Height RETURN a[2] FUNCTION GetTxtWidth( cText, nFontSize, cFontName ) // get the width of the text LOCAL hFont, nWidth, cChr := 'A' IF Valtype(cText) == 'N'; cText := Replicate(cChr, cText) ENDIF DEFAULT cText := Replicate(cChr, 2), ; cFontName := _HMG_DefaultFontName, ; nFontSize := _HMG_DefaultFontSize hFont := InitFont(cFontName, nFontSize) nWidth := GetTextWidth(0, cText, hFont) DeleteObject (hFont) RETURN nWidth

SergKis: Dima вот так правильней будет (в пред. тексте была еще функция, я ее заменил, но не удачно): FUNCTION GetStatusBarHeight( cForm ) // высота StatusBar DEFAULT cForm := _HMG_aFormNames [ _HMG_MainIndex ] // т.к. StatusBar на mdimain RETURN GetWindowHeight(GetControlHandle('STATUSBAR', cForm))

Dima: SergKis пишет: вот так правильней будет Понял. Копаю пока дальше. Сенкс !

Dima: SergKis Функция Save_Rest_HMG то что надо Но вылез нежданчик )) Если в MDI или MDICHILD окне создать окно MODAL свое или вызвать что то типа функций MSG....() то это модальное окно живет в других программах . Такого эффекта нет , если окно простое не MDI.. Что то можно подкрутить в этом плане (чую сырец надо переделывать) ? ЗЫ Чисто интереса ради юзанул FiveWin c MDI , там нет такой бяки , все норм с MODAL + MDI...

SergKis: Dima попробуй HB_FUNC( SETPARENT ) (в С текстах с меню выше) поставь своему модал поставить handle родителя mdichild

Dima: SergKis пишет: поставь своему модал поставить handle родителя mdichild Понял , пока не пробовал , а что делать с системными функциями Минигуи типа MSG...() там же тоже модальное окно и эффект тот же ? Объясню: есть модальное окно и в нем вызываю ну скажем MSGINFO() , ну все красиво , все вызвалось. Затем его не закрывая тихонько так переключаюсь совсем на другую программу и с удивлением обнаруживаю в ней на переднем плане MSGINFO() из моей задачи.

SergKis: Dima пишет:MSGINFO() из моей задачи. по цепочке там заканчивается: MessageBoxIndirect( <ТУТ>, cMessage, cTitle, nStyle, nIcon ) первым параметром дай handle parent нужного окна

Dima: SergKis Понял , то есть сырец править , да ?

SergKis: Dima Напиши свой аналог MsgBox(), Msg..., используя тексты из h_msgbox.prg как "рыбу"

Dima: SergKis пишет: попробуй HB_FUNC( SETPARENT ) Попробовал. Перед тем как создать MODAL окно , считал handle родителя вот так GetActiveMdiHandle() (в переменую HTEST к примеру) Далее создаю MODAL окно и в конце ACTIVATE WINDOW Mchoice SETPARENT(ThisWindow.Handle,HTEST) и ни чего , MODAL живет без привязки. Что я сделал не так ?

SergKis: Dima пишет:ACTIVATE WINDOW Mchoice SETPARENT(ThisWindow.Handle,HTEST) после ACTIVATE команды сработают только после закрытия окна (ACTIVATE цикл ожидания сообщений) между END WINDOW и ACTIVATE This... команды не пашут. SETPARENT(ThisWindow.Handle,HTEST) надо в ON INIT или LOSTFOCUS, попробовал у себя ..., фигню получил, стал смотреть, что сам делаю - да ничего не делаю Dima пишет:Если в MDI или MDICHILD окне создать окно MODAL свое или вызвать что то типа функций MSG....() то это модальное окно живет в других программах у меня такого нет, окна привязаны к своему приложению и на чужие не лезут, что modal, что msg. То, что уменя hb2.0, MiniGui 4.07 и msvc влиять не должно. Не знаю что сказать ...

Dima: SergKis Понял , спасибо и на этом. Минигуи не допилен как следует я так понял , потому как даже в старых версиях FW таких ляпов нет.

gfilatov2002: Dima пишет: Минигуи не допилен как следует я так понял Поддержку MDI интерфейса в Минигуи не одобрял автор библиотеки, поэтому ее добавил в расширенную сборку Януш Пора (как сумел). Если будут предложены необходимые доработки от заинтересованных лиц, то они будут включены в актуальную версию (после проверки, конечно)

Dima: gfilatov2002 пишет: поэтому ее добавил в расширенную сборку Януш Пора (как сумел) Теперь все ясно а я копья ломаю

SergKis: Dima Добавил в пример (в начале темы, который ломал mdimain [hb 3.2 minigui 2.4.7 borland]) в modal окно DEFINE WINDOW wModal AT 0,0 WIDTH 400 HEIGHT 300 MODAL ThisWindow.Topmost := .T. ... и получил модально окно в др. приложениях поверх, может у тебя такое есть ?

Dima: SergKis Такого нет. Основное окно у меня простое с запросом пароля , после его ввода окно прячу. Затем вылазит MDI окно в котором живет статус бар и живут MDICHILD окна. При нажатии на статус бар создается менюшка в окне MODAL , это окно живет во всех приложениях ;) Что касается TOPMOST то он да стоял но на окне с вводом пароля. Убрал временно. Поведение MODAL окна изменилось. При переключении в другую программу все нормально и нет этого окна. Но при возврате в свое приложение не видать MODAL окна.

SergKis: Dima пишет:Основное окно у меня простое с запросом пароля , после его ввода окно прячу. Затем вылазит MDI окно т.е. у тебя основное окно main и потом mdi main, два окна типа A - не знаю как они уживуться по переммым _HMG_... у меня есть такая ситуация, но mdi - отдельный exe, который запускаю. Если пробнуть пустить только mdi часть (типа пароль уже ввели), что будет ? Пример на borland (говорил выше) ведет себя с модал окном (без topmost) вполне адекватно, как должно быть (кроме отрисовки main после ...)

Dima: SergKis пишет: и потом mdi main Нет просто MDI , ведь 2-х MAIN окон быть не может Ладно , спасибо. Я не буду пока юзать MDI пока с ними не наведут порядок.

Andrey: Dima пишет: ведь 2-х MAIN окон быть не может Было бы интересно посмотреть. Очень удобно на панели задач иметь свои отдельные окна ! Юзера просят об этом.

Dima: Пара простых вопросов от новичка к знатокам. 1. В самом начале программы стоит вот такая конструкция , что бы не запустить программу более одного раза [pre2] IF IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) ) hWnd := FindWindow( APP_TITLE ) IF hWnd > 0 IF IsIconic( hWnd ) _Restore( hWnd ) ELSE SetForeGroundWindow( hWnd ) ENDIF ELSE MsgStop( "Cannot find application window!", "Error", , .f. ) ENDIF quit ENDIF [/pre2] Да это работает. Но в основном окне могут быть открыты другие окошки. Как можно попасть не на основное окно программы (хотя понятно что ищем его в коде выше) а на активное (в фокусе окно) живущее в паренте главного окна ? А если попасть еще бы в нужное окошко да еще и в последний в фокусе контрол , но это видимо я уже фантазирую ;) 2. Пример C:\MiniGUI\SAMPLES\BASIC\REGIONS\ , почему такие "обгрызанные" углы в RoundRect , молчу уже про эллипс ?

SergKis: Dima пишет:в нужное окошко да еще и в последний в фокусе контрол Не очень понятно желание попасть в контрол, который уже в фокусе (gotfocus, onchange уже были и ...), может про это спрашиваешь (последним был в фокусе): [pre2] // в процедуре LostFocus IF ( i := AScan ( _HMG_aControlHandles, GetFocus()) ) > 0 cControlName := _HMG_aControlNames[ i ] IF ( i := AScan ( _HMG_aFormHandles, _HMG_aControlParenthandles[ i ] ) ) > 0 cFormName := _HMG_aFormNames[ i ] ENDIF ENDIF ... // потом где то IF ! empty(cControlName) .and. ! empty(cFormName) _SetFocus(cControlName, cFormName) ENDIF [/pre2]

Dima: Нет я не про это. В самом начале проги вот такой код [pre2] IF IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) ) hWnd := FindWindow( APP_TITLE ) IF hWnd > 0 IF IsIconic( hWnd ) _Restore( hWnd ) ELSE SetForeGroundWindow( hWnd ) ENDIF ENDIF quit ENDIF [/pre2] Запустил программу , вылезло главное окно (обычное) , вызываю в нем CHILD окно. После этого снова запускаю программу и код который выше сделает активным главное окно но не CHILD. Мне надо попасть на CHILD. Возможно (это просто догадка) попадать нужно на последнюю форму вызванную в программе.

SergKis: Dima Запущена прога 2-раза сразу (первый раз уже где то работаем), или запустили, где то работали, вышли (запомнили где были), снова запустили и хотим попасть сразу в режим (окно, контрол) где были ?

Dima: SergKis пишет: Запущена прога 2-раза сразу (первый раз уже где то работаем) вот это

Dima: Собственно идея взята тут C:\MiniGUI\SAMPLES\Advanced\IsExeRunning\demo.prg Вторую копию проги не запустить. Но в примере окошко всего одно. А если их будет больше то при повторном запуске мы все равно попадаем на главное окно а попасть надо на последнее , которое было в момент повторного запуска программы. Вроде понятно пояснил.

SergKis: Dima Туплю. Если уже в child работаешь, зачем манипуляции с hWnd - просто выходи и все из 2-го экз. проги.

Dima: SergKis пишет: Если уже в child работаешь, зачем манипуляции с hWnd - просто выходи и все из 2-го экз. проги. Мы не ищем легких путей , хотел сделать красиво. В одной проге такой эффект видел. При повторном запуске попадаем куда нужно.

SergKis: Dima пишет:Мы не ищем легких путей Если 1-е приложение свернуто (все окна) и надо развернуть 2-м запуском можно - послать WM_COPYDATA 1-ому и пусть оно само все делает как надо (в sampes поищи) - перебрать окна принадл. hWnd и раскрыть нужные (как определить ?) но где видел не помню

Dima: Понял , бум копать. Спасибо !

SergKis: Dima Если на окно 1-го запуска повесить on gotfocus, с алгоритмом по развернутым окнам child, то будет срабатывать и твой код

Dima: SergKis пишет: перебрать окна принадл. hWnd и раскрыть нужные (как определить ?) но где видел не помню Этот вариант предпочтительнее , будем искать примерчик....

Dima: думаю вот этот примерчик ;) C:\MiniGUI\SAMPLES\Advanced\ExternalApp_3\demo2.prg

Dima: Попробовал сделать и не пашет как следует...... [pre2] #include "minigui.ch" Func MY_IsExeRunning(par1,par2) Local aChild,nI,hWnd,Hch IF IsExeRunning( par1) hWnd := FindWindow(par2) IF hWnd > 0 aChild := {} EnumChildWindows( hWnd, { |hChild| AADD( aChild, hChild ), .T. }, 0 ) if len(aChild)#0 Hch:=aChild[len(aChild)] IF IsIconic( Hch ) _Restore( Hch ) ELSE SetForeGroundWindow( Hch ) ENDIF endif ENDIF Quit ENDIF return nil ************************ #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include <hbapiitm.h> ////////////////////////////////////////////////////////////// // http://forums.fivetechsupport.com/viewtopic.php?p=57503 void hb_evalBlock( PHB_ITEM pCodeBlock, ... ); static PHB_ITEM pCodeBlock = NULL; BOOL CALLBACK static EnumChildProc( HWND hWnd, LPARAM lParam ) { PHB_ITEM pHWnd = hb_itemPutNL( NULL, ( LONG ) hWnd ); PHB_ITEM pParam = hb_itemPutNL( NULL, ( LONG ) lParam ); if( pCodeBlock ) hb_evalBlock( pCodeBlock, pHWnd, pParam, 0 ); hb_itemRelease( pHWnd ); hb_itemRelease( pParam ); return hb_parl( -1 ); } HB_FUNC( ENUMCHILDWINDOWS ) { HWND hWnd = ( HWND ) hb_parnl( 1 ); LPARAM lParam = ( LPARAM ) hb_parnl( 3 ); pCodeBlock = hb_param( 2, HB_IT_BLOCK ); hb_retl( EnumChildWindows( hWnd, EnumChildProc, lParam ) ); pCodeBlock = NULL; } #pragma ENDDUMP [/pre2]

Andrey: Dima пишет: MAIN окно не получило фокус ввода при запуске , почему ? Можно получить фокус на MAIN окно если в Func Mdimain() сделать так: Form_1.Center Activate Window Form_1 NoWait Form_0.Release

Dima: Andrey пишет: Activate Window Form_1 NoWait Понял. А если у всех окон программы использовать NOWAIT , тут не может быть каких то подводных камней ? Как выше Сергей писал ACTIVATE WINDOW без NOWAIT это цикл и живет пока окно не закроется , то есть из функции в которой я создал окно я не выйду пока окно не будет закрыто. Да и команды после ACTIVATE WINDOW не сработают пока окно не закроется.

Andrey: Dima пишет: А если у всех окон программы использовать NOWAIT , тут не может быть каких то подводных камней ? А каких ? Даже и не знаю, я сторонник попробовать... Просто занялся этим прелодером вот и вспомнил, как Григорий показывал в примерах. А окно можешь убить потом в любое время и в любом месте программ. Очень удобно. Dima пишет: 1) из функции в которой я создал окно я не выйду пока окно не будет закрыто. 2) Да и команды после ACTIVATE WINDOW не сработают пока окно не закроется. 1) можешь там же в функции закрыть окно - команду ты знаешь. 2) Не пиши код после ACTIVATE WINDOW, сделай все в ON INIT {|| функция1(), функция2(), .... , ThisWindow.Release }

Dima: Простой вопрос :) Есть статус бар [pre2] DEFINE STATUSBAR FONT 'Verdana' SIZE 8 STATUSITEM "TEST" STATUSITEM "123" DATE CLOCK KEYBOARD END STATUSBAR [/pre2] Хочу в RUNTIME оставить только один ITEM на всю ширину статус бара. Затем выставить ITEM по центру (изначально он по левому краю ориентирован) Сменить фон статус бара , шрифт + его параметры и цвет ITEM Знаний хватило только на это Form_0.StatusBar.Item(1) := "Проверка" Form_0.StatusBar.Width(1) := WidthWindow_MyApl // ширина главного окна А как быть с остальными хотелками ? ;)

Dima: Вроде понял ;) Примерно таким макаром SetProperty( "Form_0", "Statusbar","Item",1,"1111111111111" )

Andrey: Dima пишет: Form_0.StatusBar.Item(1) := "Проверка" В TBROWSE налетишь на грабли, в StatusBar.Item(1) он выводит свои какие то данные и затирает, то что сам выводишь. Я от StatusBar отказался, не очень он красивый получается... Насчет фона и цвета шрифта смотри Пост N: 714 http://clipper.borda.ru/?1-1-0-00000431-000-20-0

Dima: Andrey пишет: Насчет фона и цвета шрифта смотри Пост N: 714 Спасибо но это было до того как в статус бар ввели цвета. Так что сейчас видать все проще. Разбираюсь.

Dima: Вообщем все решил. Через _HMG_aControlBkColor _HMG_aControlSpacing _HMG_aControlFontColor С одним НО ;) это все пашет только если статуситем заявлен так , как минимум STATUSITEM "TEST" FONTCOLOR BLACK вот так фокус не сработает STATUSITEM "TEST" Вероятно косяк Минигуи. PS С этим Минигуи , не когда даже телик глянуть 5 часов пролетает как 5 минут ))

Andrey: Dima пишет: Вообщем все решил. Через _HMG_aControlBkColor _HMG_aControlSpacing _HMG_aControlFontColor Как ? Напиши подробней. Dima пишет: С этим Минигуи , не когда даже телик глянуть 5 часов пролетает как 5 минут )) Аналогично ! Читаешь как детектив и расследуешь - как будет работать или не работать !

Dima: Andrey пишет: Как ? Напиши подробней. Кушать подано сэр Во первых статусбар надо объявить примерно так [pre2] DEFINE STATUSBAR FONT 'Verdana' SIZE 8 STATUSITEM "TEST_SB" FONTCOLOR BLACK // без FONTCOLOR BLACK все что дальше не заработает , хз почему STATUSITEM "" DATE //WIDTH 80 CLOCK //WIDTH 90 KEYBOARD END STATUSBAR [/pre2] Далее [pre2] SetProperty( "Form_0", "Statusbar","Width",1,WidthWindow_MyApl ) [/pre2] Тут все ясно , этой командой как бы убиваются все STATUSITEM кроме первого так его расширили по самое не хочу Команда хороша тем что можно точно указать нужный ITEM , без вопросов. Дальше все будет в слепую без четкого указания ITEM [pre2] IF ( h := MyGetControlHandle('StatusBar' ) ) > 0 // опа а тут сразу вопрос , 'StatusBar' может жить и в другом окне MySetSb( h ) // и как их отличать ? У меня живет только в главном , поэтому ладно.. ENDIF [/pre2] Далее ставим новые фичи на STATUSITEM но в слепую без указания ITEM , как это сделать нормально не нашел. Но в случае если видимый ITEM только один , это работает. [pre2] FUNC MySetSb( ParentHandle ) LOCAL h, i FOR EACH h In _HMG_aControlContainerHandle i := h:__enumIndex() IF _HMG_aControlType [ i ] == "ITEMMESSAGE" .AND. h == ParentHandle _HMG_aControlCaption [ i ]:="TEST-2" // Caption _HMG_aControlBkColor [ i ]:= nRGB2Arr(RGB(159, 191, 236) ) // цвет заднего фона _HMG_aControlSpacing [ i ]:=1 // по центру _HMG_aControlFontColor [ i ]:=WHITE // цвет шрифта ENDIF NEXT RETURN Nil [/pre2] Поправка: я допер как делать не в слепую.

Dima: Dima пишет: Поправка: я допер как делать не в слепую. Итак в начале [pre2] SetProperty( "Form_0", "Statusbar","Width",1,WidthWindow_MyApl ) IF ( h := MyGetControlHandle('StatusBar',"Form_0" ) ) > 0 // находим хендл StatusBar на форме Form_0 MySetSb( h ) ENDIF [/pre2] Функция MyGetControlHandle [pre2] FUNC MyGetControlHandle( cControlName ,cFormName) Local Hc:=0 Local Hcf:=GetControlHandle ( cControlName ,cFormName ) Local Elem Local i for each Elem in _HMG_aControlNames i:=Elem:__enumindex() if Elem==cControlName if _HMG_aControlHandles[ i ]==Hcf Hc:=_HMG_aControlHandles[ i ] endif endif next RETURN Hc [/pre2] Дальше красим так , потому что из SetProperty добраться к цветам и ALIGN не удалось (может кто подскажет как....) Было бы логичным добираться к Property ITEM через SetProperty и не городить весь этот огород , ведь часть Property все же доступна из SetProperty. [pre2] FUNC MySetSb( ParentHandle ) LOCAL h, i FOR EACH h In _HMG_aControlContainerHandle i := h:__enumIndex() IF _HMG_aControlType [ i ] == "ITEMMESSAGE" .AND. h == ParentHandle _HMG_aControlCaption [ i ]:="Всем привет ;)" _HMG_aControlBkColor [ i ]:= nRGB2Arr(RGB(159, 191, 236) ) _HMG_aControlSpacing [ i ]:=1 // по центру _HMG_aControlFontColor [ i ]:=YELLOW ENDIF NEXT RETURN Nil [/pre2] Функция MySetSb работает по умолчанию с ITEM 1 , как добраться к другим не понял. Может кто подскажет как.... Полистал все елементы _HMG_SYSDATA (их больше 400) Обратил внимание на 135 и 136 и как обратится к нужному ITEM статусбара понятно. Вот только сдвиг там идет на 2. То есть если надо править ITEM 1 , то править нужно 3 элемент нужного массива. Так все больше "флудить" не буду раз это ни кому не надо и ни кто не испытывает желание подсказать (помочь).

SergKis: Dima Вернусь к вопросу с Modal на Mdi (если не выкинул еще) h_windows.prg в _DefineModalWindow (...) есть такое IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive // срабатывает этот кусок кода Parent := _hmg_MainHandle // после Save_Rest_HMG() ENDIF если не трудно проверь это на модал окне hParent := _HMG_InplaceParentHandle aHmg := Save_Rest_HMG() _HMG_InplaceParentHandle := GetActiveMdiHandle() ... здесь модал окно Save_Rest_HMG(aHmg) _HMG_InplaceParentHandle := hParent измениться ли поведение модал ?

Dima: SergKis пишет: (если не выкинул еще) Похоронил всё MDI

SergKis: Dima пишет:Дальше красим так , потому что из SetProperty добраться к цветам нашел HB_FUNC( SETBKCOLOR ) { hb_retnl( ( ULONG ) SetBkColor( ( HDC ) hb_parnl( 1 ), ( COLORREF ) RGB( hb_parni( 2 ), hb_parni( 3 ), hb_parni( 4 ) ) ) ); } т.е. по идее если знаешь handle item StatusBar, то ... для align используем свою [pre2] // BAA HB_FUNC( CONTROLALIGN ) { HWND hWnd = ( HWND ) hb_parnl(1); LONG nStyle, nAlign=0, nAlignNew, nAlignMsk; nAlignMsk = ES_LEFT | ES_CENTER | ES_RIGHT; // 0x0003 if( IsWindow(hWnd) ){ nStyle = GetWindowLong(hWnd, GWL_STYLE); nAlign = nAlignMsk & nStyle; if( HB_ISNUM(2) ){ nAlignNew = hb_parni(2); nAlignNew &= nAlignMsk; // Что бы небыло лишнего nStyle &= ( ~nAlignMsk ); // Снять nStyle |= nAlignNew; // Поставить // Только при прижатии влево // Текст не сворачивается а обрезается // Делается замена табуляции на пробелы if(nAlignNew==ES_LEFT ) nStyle |= SS_LEFTNOWORDWRAP ; else nStyle &= ( ~SS_LEFTNOWORDWRAP ); SetWindowLong(hWnd, GWL_STYLE, nStyle); } } hb_retni( nAlign ); } [/pre2] ControlAlign(hWnd) - читает значение ControlAlign(hWnd, nAlign) - ставит

Dima: SergKis Спасибо. Пишу пока свою , закончу , выложу.

SergKis: Dima пишет:Похоронил всё MDI Жаль, возможно это решило бы проблему modal

Dima: Снова бяка. Толи у меня руки не оттуда растут или косячок в Минигуи. [pre2] #include "minigui.ch" Function Main() DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 500 ; HEIGHT 200 ; MAIN; TITLE 'Test' DEFINE BUTTONEX Button_1 ROW 20 COL 70 WIDTH 110 HEIGHT 30 CAPTION "Change With SB" ACTION { || SetProperty("Form_1","StatusBar","Width",1,; if( GetProperty("Form_1","StatusBar","Width",1)==50,GetProperty( "Form_1","Width"),50)) } END BUTTONEX DEFINE BUTTONEX Button_2 ROW 70 COL 70 WIDTH 110 HEIGHT 30 CAPTION "New Windows" ACTION { || New_win() } END BUTTONEX DEFINE STATUSBAR OF Form_1 STATUSITEM "Test1" WIDTH 50 FONTCOLOR BLACK DATE CLOCK KEYBOARD END STATUSBAR END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil ********************* Func New_Win() DEFINE WINDOW Form_2 ; WIDTH 800 ; HEIGHT 100 ; CHILD; TITLE 'Newwin' DEFINE STATUSBAR OF Form_2 STATUSITEM "Test2" WIDTH 50 FONTCOLOR BLACK DATE CLOCK KEYBOARD END STATUSBAR END WINDOW Form_2.Center ACTIVATE WINDOW Form_2 return [/pre2] Топчем кнопку Change With SB , ширина 1 итема StatusBar меняется Cтоит вызвать окно по кнопке New Windows и закрыть его , то ACTION в кнопке Change With SB уже не фурычит , точнее не пашет SetProperty для StatusBar Более того если открыть Child окно и не закрывая его переключится на главное и потыкать кнопку Change With SB то все начинает меняться в StatusBar CHILD окна )) Оно лечится ?

gfilatov2002: Dima пишет: Оно лечится ? Благодарю за наводку - это мой косяк Поправил следующую процедуру [pre2]*-----------------------------------------------------------------------------* PROCEDURE _SetStatusWidth ( ParentForm , Item , Size ) *-----------------------------------------------------------------------------* LOCAL nItem As Numeric, nSize As Numeric LOCAL FormHandle, aWidths, h := GetControlHandle ( "StatusBar", ParentForm ) Assign nItem := Item Assign nSize := Size FormHandle := GetFormHandle ( ParentForm ) aWidths := _GetStatusItemWidth ( FormHandle ) _SetStatusItemWidth ( nItem, nSize, FormHandle ) aWidths [nItem] := nSize SetStatusBarSize ( h, aWidths ) RefreshItemBar ( h, _GetStatusItemWidth ( FormHandle, 1 ) ) RETURN [/pre2] Теперь Ваш пример работает нормально

Dima: gfilatov2002 Спасибо ! Все работает !

Dima: gfilatov2002 Не уходя далеко от вопроса о StatusBar , хотел узнать в том же ключе. В справке пишется что бы изменить высоту этого контрола юзать надо SetProperty ( <ParentWindowName>,<ControlName>, Height , nHeight ) Так и сделал ......не работает в рантайм . Хотел было добраться к остальным параметрам конкретного ITEM , через SetProperty с 5-ю параметрами по аналогии с шириной итема (SetProperty( cFormName, cControlName,"Width",nitem,nWidth )) , не получилось. Добраться к некоторым из них удалось только через _HMG_aControlCaption _HMG_aControlBkColor _HMG_aControlSpacing _HMG_aControlFontColor к шрифту добраться не получилось через _HMG_aControlFontAttributes Не знаю фича это или косяк... Спасибо за работу !!!

gfilatov2002: Dima пишет: В справке пишется что бы изменить высоту этого контрола Мы не можем установить высоту StatusBar, т.к. она устанавливается автоматически в зависимости от выбранного для StatusBar шрифта. Dima пишет: Хотел было добраться к остальным параметрам конкретного ITEM Для установки свойства Caption конкретного ITEM надо использовать SetProperty( cFormName, cControlName,"Item",nitem, cCaption ) Для установки новой иконки конкретного ITEM надо использовать SetProperty( cFormName, cControlName,"Icon",nitem,"iconname" ) Для изменения действия по клику мыши можно использовать следующую команду #command DEFINE STATUSITEM <n> ; OF <Form> ; ACTION <action> ; => ; _SetStatusItemAction( <n>, <{action}>, GetFormHandle(<"Form">) ) Изменение остальных свойств в рантайм НЕ предусмотрено, они назначаются при определении этого ITEM

Dima: gfilatov2002 пишет: Мы не можем установить высоту StatusBar, т.к. она устанавливается автоматически в зависимости от выбранного для StatusBar шрифта. Точно , мой косяк....виноват. Про остальное понял. Спасибо !

Dima: gfilatov2002 пишет: Изменение остальных свойств в рантайм НЕ предусмотрено, они назначаются при определении этого ITEM У меня получилось , исходник могу выложить. Имею в виду цвет шрифта , фон для итема , align .

gfilatov2002: Dima пишет: исходник могу выложить Конечно, выложи Любые доработки в минигуи приветствуются

Dima: gfilatov2002 Вот и пример , Америку я конечно не открыл , но возможно кому то будет полезно. [pre2] #include "minigui.ch" Function Main() Private n:=1 DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 800 ; HEIGHT 600 ; MAIN; TITLE 'MY WINDOW' ; NOSIZE DEFINE BUTTONEX Button_1 ROW 20 COL 70 WIDTH 110 HEIGHT 30 CAPTION "Change With SB" ACTION {|| TestSB()} END BUTTONEX DEFINE STATUSBAR OF Form_1 STATUSITEM "Status-1" FONTCOLOR BLACK STATUSITEM "Status-2" WIDTH 100 FONTCOLOR BLACK STATUSITEM "Status-3" WIDTH 100 FONTCOLOR BLACK STATUSITEM "Status-4" WIDTH 100 FONTCOLOR BLACK STATUSITEM "Status-5" WIDTH 100 FONTCOLOR BLACK STATUSITEM "Status-6" WIDTH 100 FONTCOLOR BLACK END STATUSBAR END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil ************************* FUNC MySetSb( cFormName,cControlName,nWidth,nitem,aProperty ) LOCAL h, i ,j Local ParentHandle:=GetControlHandle ( cControlName ,cFormName ) hb_default(@nWidth,GetProperty( cFormName, cControlName,"Width",nitem)) hb_default(@nitem,1) if ParentHandle==0 return nil endif SetProperty( cFormName, cControlName,"Width",nitem,nWidth ) // ширину получилось сменить только так FOR EACH h In _HMG_aControlContainerHandle i := h:__enumIndex() IF _HMG_aControlType [ i ] == "ITEMMESSAGE" .AND. h == ParentHandle if i==nitem+2 for each j in aProperty j[1]:=j[2] next endif ENDIF NEXT InvalidateRect( _HMG_MainHandle, 0 ) // в принципе не нужна строка так как всегда срабатывает // SetProperty( cFormName, cControlName,"Width",nitem,nWidth ) RETURN Nil ****************** Func TestSb() if n==1 n:=2 MysetSb("Form_1", "StatusBar",200,2,; {{_HMG_aControlCaption,"111"},; {_HMG_aControlBkColor,nRGB2Arr(RGB( 255,255,159))},; {_HMG_aControlSpacing,1},; {_HMG_aControlFontColor,BLACK}}) InkeyGUI(500) MysetSb("Form_1", "StatusBar",,1,; {{_HMG_aControlCaption,"222"},; {_HMG_aControlBkColor,nRGB2Arr(RGB( 155,255,159))},; {_HMG_aControlSpacing,1},; {_HMG_aControlFontColor,RED}}) InkeyGUI(500) MysetSb("Form_1", "StatusBar",,5,; {{_HMG_aControlBkColor,nRGB2Arr(RGB( 155,155,159))},; {_HMG_aControlFontColor,RED}}) InkeyGUI(500) elseif n==2 n:=1 MysetSb("Form_1", "StatusBar",Form_1.Width,1,; {{_HMG_aControlCaption,"Hello WORD ;)"},; {_HMG_aControlBkColor,nRGB2Arr(RGB( 255,255,159))},; {_HMG_aControlSpacing,1},; {_HMG_aControlFontColor,BLACK}}) endif return nil [/pre2]

Alex_Cher: SergKis пишет: FUNCTION GetWndMDIChildAll() // Получить массивом все имена доступных дочерних окон LOCAL i, k, aNames:={} k := Len( _HMG_aFormNames ) FOR i := 1 TO k IF _HMG_aFormType=='Y' AAdd(aNames, _HMG_aFormNames ) ENDIF NEXT RETURN aNames SergKis - функция не работает Выдает ошибку - "Error BASE/1070 Argument error: ==" может чего не хватет ..?

Alex_Cher: SergKis пишет: FUNCTION GetWndMDIChildAll() // Получить массивом все имена доступных дочерних окон LOCAL i, k, aNames:={} k := Len( _HMG_aFormNames ) FOR i := 1 TO k IF _HMG_aFormType=='Y' AAdd(aNames, _HMG_aFormNames ) ENDIF NEXT RETURN aNames SergKis - функция не работает Выдает ошибку - "Error BASE/1070 Argument error: ==" может чего не хватет ..?

SergKis: Alex_Cher пишет может чего не хватет ..? такой текст [pre2] FUNCTION GetWndMDIChildAll() // Получить массивом все имена доступных дочерних окон LOCAL i, k, aNames:={} k := Len( _HMG_aFormNames ) FOR i := 1 TO k IF _HMG_aFormType[ i ]=='Y' AAdd(aNames, _HMG_aFormNames[ i ] ) ENDIF NEXT RETURN aNames [/pre2]

Alex_Cher: SergKis пишет: такой текст SergKis - посоветуй, я наверное не там капаю, задача - при переходе с дочернего окна на родительское дочернее должно закрываться само. Функция GetWndMDIChildAll() при любом раскладе дает пустой массив.

SergKis: Alex_Cher пишет посоветуй 1. GetWndMDIChildAll() для MDI MAIN окна 2. В вашем случае, думаю, надо в родительском окне сделать [pre2] DEFINE WINDOW WndOwner ... ON GOTFOCUS OwnerGotFocus() ... DEFINE WINDOW WndChild_1 ... Func OwnerGotFocus() If IsWindowDefined(WndChild_1) WndChild_1.Release EndIf Return Nil [/pre2]

Alex_Cher: SergKis пишет: В вашем случае, думаю, SergKis - еще раз огромное Вам спасибо, все оказывается так просто ...

rvu: Добрался до Минигуи, всё очень круто, особенно примеры, большое спасибо за них! Но вот такая ситуация: есть поля для ввода данных, переключение между ними по умолчанию клавишей Tab. Хочу сделать Enter. В консоли все было просто: set key to... и процедура с keyboard(). Предполагаю, что и здесь должно быть как-то не сложно, но пока не нашел ничего очевидного.

gfilatov2002: Благодарю за добрые слова в адрес библиотеки! rvu пишет: переключение между ними по умолчанию клавишей Tab. Хочу сделать Enter Это вохможно сделать, если добавить следующую команду в начало программы: SET NAVIGATION EXTENDED Кстати, полный список новых команд, добавленных в Минигуи, можно см. в файле Doc\Commands.txt

rvu: gfilatov2002 пишет: SET NAVIGATION EXTENDED В самом деле очень просто. Спасибо!

rvu: Интересно, а можно убрать самую верхнюю строчку? В которой пишется TITLE, где крестик для закрытия программы.

Softlog86: rvu Изучайте классы : свойства и методы . Есть MiniGUI.chm - там всё описано достаточно неплохо для Вашего вопроса : DEFINE WINDOW <WindowName> [ AT <nRow> ,<nCol> ] [ ROW <nRow> ] [ COL <nCol> ] [ WIDTH <nWindth> ] [ HEIGHT <nHeight> ] [ CLIENTAREA <nClientWidth> , <nClientHeight> ] [ VIRTUAL WIDTH <nVirtualWindth> ] [ VIRTUAL HEIGHT <nVirtualHeight> ] [ TITLE <cTitle> ] [ NOMINIMIZE ] - не допускать сворачивание окна (соответственно и значёк этой команды недоступен в шапке ) [ NOMAXIMIZE ] - не допускать разворачивание во весь экран [ NOSIZE ] - не допускать изменение размера [ NOSYSMENU ] - не показывать системное меню окна [ NOCAPTION ] - окно без заголовка ( просто рамка)

Dima: rvu Изучать придется много , так что смирись и копай , абы как не получится и Softlog86 прав !

Softlog86: Сам до сих пор регулярно "туплю" ..... Век живи - век учись . Чем мне и нравится MiniGui - очень богатый инструментарий !

rvu: Dima пишет: смирись и копай Копаю, копаю... Никак не найду, как меняются цвета данных в активном поле в DEFINE TEXTBOX Там белый на синем по умолчанию видимо?

Dima: есть справка вообще то и примеры вот навскидку C:\MiniGUI\SAMPLES\Advanced\ComboSearchGrid\combosearchgrid.prg

rvu: Dima пишет: есть справка вообще то и примеры В справке ничего не нашел. А про примеры, мы точно об одном и том же? Я не про BACKCOLOR и FONTCOLOR в TEXTBOX.

Dima: rvu Про это речь ? DEFINE TEXTBOX &( textboxname ) ROW nR Col nC WIDTH nW HEIGHT 24 ONGOTFOCUS SetProperty( ThisWindow.Name, textboxname, "FontColor", RED ) ONLOSTFOCUS SetProperty( ThisWindow.Name, textboxname, "FontColor", GRAY ) END TEXTBOX

Haz: Dima пишет: ONGOTFOCUS SetProperty( ThisWindow.Name, textboxname, "FontColor", RED ) ONLOSTFOCUS SetProperty( ThisWindow.Name, textboxname, "FontColor", GRAY ) Все верно, но можно проще если вместо TEXTBOX использовать GETBOX как более "продвинутый" контрол ввода. Там эти цвета встроены по умолчанию [pre2] [ BACKCOLOR <anBackColor> ] // * or <anBackColor, anReadOnlyBackColor, anAciveBackColor> [/pre2]

SergKis: Haz пишет [ BACKCOLOR <anBackColor> ] // * or <anBackColor, anReadOnlyBackColor, anAciveBackColor> или новыми командами SET GETBOX FOCUS BACKCOLOR [TO <backcolor>] SET GETBOX FOCUS FONTCOLOR TO <fontcolor> тогда anAciveBackColor не используем

rvu: Dima пишет: Про это речь ? Понятно. Мы о разном. Это работает, если на поле мышкой кликать. А если по полям бегать клавишами Tab или Enter, то активное поле имеет цвет белый на синем. И как эти цвета менять пока не нашел.

rvu: Haz пишет: GETBOX Какой там курсор страшный. А можно его размерами управлять? И можно ли его вообще убрать? Наверное, можно. Пошел искать...

rvu: Посмотрел образцы курсоров (мышиных). А можно его вообще убрать простым способом? Чтобы при вождении мышью вообще ничего не было видно (в смысле, курсор).

Петр: rvu пишет: А можно его вообще убрать простым способом? Добавить в событие ON MOUSEHOVER | ON MOUSEMOVE (для control/window соответственно) вызов FileCursor('')

rvu: Петр пишет: ON MOUSEMOVE Открываю окно, развернутое на весь экран. Если курсор на программе стоит, то это срабатывает. А если он после открытия откуда-то пришел, то вполне себе бегает.

Петр: rvu пишет: Если курсор на программе стоит, то это срабатывает. А если он после открытия откуда-то пришел, то вполне себе бегает. И что? Читайте документацию WinAPI (в данном случае SetCursor): FileCursor('') - это эквивалент SetCursor( NULL ). И дальше уже сами определяйтесь, возможно придется обрабатывать события ON GOTFOCUS / ON LOSTFOCUS, откуда я знаю, что и откуда к вам приходит.

Петр: rvu пишет: А можно его вообще убрать простым способом? Чтобы при вождении мышью вообще ничего не было видно (в смысле, курсор). Кстати такое поведение не является типичным для програм Windows, сответственно никакой волшебной функции по гашению курсора в MiniGUI нет. И, надеюсь, не будет.

rvu: Петр пишет: возможно придется обрабатывать события ON GOTFOCUS / ON LOSTFOCUS Наверное. Но вообще, спасибо, за подробное объяснение!

SergKis: rvu пишет А можно его вообще убрать простым способом? Чтобы при вождении мышью вообще ничего не было видно (в смысле, курсор). Возможно речь о GetBox-ах в состоянии ReadOnly и перевод в рабочее состояние на время ввода ?

rvu: Нет, тут идея другая была. Захотели подключить второй монитор к компьютеру, как информационное табло для клиентов компании. Типа, мы что-нибудь наберем и пусть оно на втором мониторе отображается, пока не поменяем. Идея любопытная, но я имею опыт работы с несколькими мониторами, постоянно курсор на другой монитор убегает. Ну и что он будет бегать перед клиентами, надо бы его как минимум из видимости убрать.

SergKis: rvu пишет Ну и что он будет бегать перед клиентами, надо бы его как минимум из видимости убрать. Так может разделить окна: 1 - для основного монитора с курсором 2 - для др. мониторов с Getbox ReadOnly Ввели в 1-м данные, отобразили во 2-м. Если это возможно разделить, не имел счастья раб. с неск. мониторами

rvu: Курсор-то по всему рабочему столу ходит. Я не то что окна, я программы разделил, одна для ввода, другая для показа.

Петр: rvu пишет: Курсор-то по всему рабочему столу ходит. Ну тогда вам сюда Дополните c_cursor.c #include "hbapiitm.h" extern HB_EXPORT BOOL Array2Rect( PHB_ITEM aRect, RECT * rc ); extern HB_EXPORT PHB_ITEM Rect2Array( RECT * rc ); HB_FUNC( CLIPCURSOR ) { RECT rc; if( Array2Rect( hb_param( 1, HB_IT_ANY ), &rc ) ) hb_retl( ClipCursor( & rc ) ? HB_TRUE : HB_FALSE ); else hb_retl( ClipCursor( NULL ) ? HB_TRUE : HB_FALSE ); } HB_FUNC( GETCLIPCURSOR ) { RECT rc; hb_retl( GetClipCursor( &rc ) ? HB_TRUE : HB_FALSE ); hb_itemParamStoreRelease( 1, Rect2Array( &rc ) ); } и перекомпилируйте библиотеку. Пример использования #include "minigui.ch" Function Main local oldRect := {0,0,0,0} local newRect := {0,0,0,0} DEFINE WINDOW Win_1 ; CLIENTAREA 400, 400 ; TITLE 'Hello World!' ; WINDOWTYPE MAIN ; ON INIT ; ( ; GetClipCursor( @oldRect ), ; GetWindowRect( ThisWindow.Handle, @newRect), ; ClipCursor( @newRect ) ; ) ; ON RELEASE ClipCursor( @oldRect ) END WINDOW Win_1.Center Win_1.Activate Return Nil

Петр: rvu пишет: Захотели подключить второй монитор к компьютеру, как информационное табло для клиентов компании. И еще к вам один вопрос - пользуетесь ли вы встроенной в MiniGUI поддержкой работы с несколькими мониторами, насколько она удобна или неудобна?

rvu: Петр пишет: пользуетесь ли вы встроенной в MiniGUI поддержкой работы с несколькими мониторами А я ничего про нее не знаю. Где посмотреть можно описание или примеры? Или какие команды смотреть?

Петр: MiniGui\SAMPLES\BASIC\Multi_Monitor Процедуру ShowTxt можете изменить так [pre2]PROCEDURE ShowTxt( cText ) DEFINE WINDOW Form_1 ; CLIENTAREA 800, 600 ; TITLE 'Show output' ; MODAL ; ON INIT WindowToMonitor( ThisWindow.Handle, EnumDisplayMonitors()[1/*2*/][1] ) [/pre2] Что ж вы ChangeLog.txt не читаете

rvu: А я в пикселях задавал расположение. Если монитор 2-й, а у первого ширина 1280 пикселей, то начинаю окно с 1281.

rvu: Петр пишет: Дополните c_cursor.c Спасибо! Не знаю, то ли это, что в итоге потребуется, но очень здорово!

rvu: Опять у меня вопрос, наверняка простой, но никак не найду способ. Высвечиваю переменную на экране: @ 100,10 LABEL LABEL_D1 VALUE var1 потом она меняется, как ее на экране перерисовать? Окно закрывать и делать снова? Наверняка есть более простой способ.

Dima: какой то рефреш надо сделать ему ) типа Setproperty("SPR_REC","Message4","value",alltrim((o1:cAlias)->naim) )

SergKis: rvu пишет потом она меняется, как ее на экране перерисовать? По мне, лучше сразу разделять, генерация формы (контролы на оке) и заполнение их значениями, т.е. @ 100,10 LABEL LABEL_D1 VALUE "" WIDTH nWidth @ 100+This.LABEL_D1.Height+2 LABEL LABEL_D2 VALUE "" WIDTH nWidth ... FUNC Refr( cForm ) Default cForm := ThisWindow.Name _SetValue( "LABEL_D1", cForm, cValToChar((o1->cAlias)->NAIM) ) или _SetValue( "LABEL_D2", cForm, cValToChar((o1->cAlias)->EDIZM) ) или SetProperty( cForm, "LABEL_D1", "Value", cValToChar((o1->cAlias)->NAIM) ) SetProperty( cForm, "LABEL_D2", "Value", cValToChar((o1->cAlias)->EDIZM) ) и так по всем контролам формы, тогда в любом нужном месте вызываете Refr(cForm) RETURN Nil

Alex_Cher: Мужики, а так разве не проще - FORM_MAIN.LABEL_D1.VALUE := var2 где FORM_MAIN - имя текущего окна, var2 - новая переменная.

SergKis: Alex_Cher пишет а так разве не проще Вы привязались к конкретному названию окна, если окон много и все они содержат (в той или иной степени) одни и те же контролы, то проще This.LABEL_D1.Value := xValue, но иногда препроцессор, что то не понимает и приходится писать функциями, поэтому чтобы не заморачиваться, сразу пишешь функции. А при повторяющихся действиях собираешь в общую ф-ию и передаешь в нее имя окна. Все по ситуации.



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