Автор | Сообщение |
|
| |
Пост N: 4905
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.06.15 10:51. Заголовок: Вопросы новичка [MiniGUI]
MAIN окно не получило фокус ввода при запуске , почему ? Пример самодостаточный. #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
|
|
|
Новых ответов нет
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[см. все]
|
|
|
| постоянный участник
|
Пост N: 654
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.06.15 21:11. Заголовок: Dima пишет:Не думал ..
Dima пишет: цитата: | Не думал я что до такой степени |
| попробовал простой пример Скрытый текст
#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
| ерунда получается со statusbar, да с окном main после modal, похоже разбираться надо по новой c mdi в последних версиях. Работаем с mdi из версии 4.07 MiniGui и правили кое что под себя - все проги только с mdi интерфейсом и работают на ура. Пример advanced\TsBrowse (mdi часть) вроде работает, но там только окна mdichild.
|
|
|
|
| |
Пост N: 4946
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.06.15 21:30. Заголовок: SergKis пишет: ерун..
SergKis пишет: цитата: | ерунда получается со statusbar |
| да это так , еще и с тулбар тоже. буду копать дальше пока не надоест ;) Andrey пишет: цитата: | Да не используй MDICHILD и всех делов. |
| Так и сделаю пока все копья не сломаю )) Просто зацепили меня MDICHILD так как живут внутри MDI , и это все что было мне надо. Примерчик твой посмотрел. Код как бы в порядке. Скрин MDI окна после закрытия MDICHILD окна (все съехало и уехало хз куда)
|
|
|
|
| постоянный участник
|
Пост N: 655
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.06.15 22:20. Заголовок: Dima я про это гово..
Dima я про это говорил, думаю есть еще переменные _HMG_..., которые цепляются modalom и не восстанавливаются (это первая мысль, но может все и не так) вот к меню C фун. (покрути), делал мой товарищ, он что то использовал, я обошелся. может помогут в дополнение к c_menu.c: Скрытый текст
// 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) ) ); }
| описание (очень краткое) Скрытый текст
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 )
|
|
|
|
|
| |
Пост N: 4948
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.06.15 23:14. Заголовок: SergKis Спасибо..
SergKis Спасибо
|
|
|
|
| |
Пост N: 4950
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.15 08:52. Заголовок: SergKis Не собрать ..
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
|
|
|
|
| |
Пост N: 4951
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.15 10:52. Заголовок: SergKis пишет: Sav..
SergKis пишет: А вот эта функция все исцелила чудесным образом и TSBROWSE не падает и ложится куда надо. Это костыль получается ?
|
|
|
|
| постоянный участник
|
Пост N: 656
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.06.15 11:37. Заголовок: Dima пишет:Не собрат..
Dima пишет: извини, забываю, что у нас внутри все тексты в unicode, а это все конвертации в один байт. хотел как лучше, но ... типа да, родной mdi (minigui) работает с окнами mdichild, с модал запрещено, а без них как то не очень. Если у тебя есть движение вперед, то обрати внимание на editbox, если окон > 2 фокус после ввода в нем улетал на др.окно (на mdichild мы используем только getbox вместо editbox), побороть это не смогли. А с mdichild окнами получилось так, в работе остаются где то 1-2 окна документа, а остальные разрушаем при потере фокуса (справочники). Еще есть установка SET PROGRAMMATIC OFF, при ней имена mdichild окон как ты задал, при ON имена динамические (добавляется счетчик окон к имени, заданному тобой), на что еще влияет эта установка не смотрел (в нашей версии этого нет).
|
|
|
|
| |
Пост N: 4952
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.15 13:04. Заголовок: SergKis Спасибо , м..
SergKis Спасибо , многое прояснил. Про SET PROGRAMMATIC не знал и пока сам ловлю счетчик окон.
|
|
|
|
| |
Пост N: 4953
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.15 13:30. Заголовок: SergKis Не могу соб..
SergKis Не могу собрать Achoice (примерчик) Не хватает функций 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'
|
|
|
|
| постоянный участник
|
Пост N: 659
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.06.15 14:49. Заголовок: Dima пишет:Не хватае..
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 |
|
|
|
|
|
|
| постоянный участник
|
Пост N: 660
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.06.15 15:13. Заголовок: Dima вот так правил..
Dima вот так правильней будет (в пред. тексте была еще функция, я ее заменил, но не удачно): FUNCTION GetStatusBarHeight( cForm ) // высота StatusBar DEFAULT cForm := _HMG_aFormNames [ _HMG_MainIndex ] // т.к. StatusBar на mdimain RETURN GetWindowHeight(GetControlHandle('STATUSBAR', cForm))
|
|
|
|
|
| |
Пост N: 4954
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.15 15:49. Заголовок: SergKis пишет: вот ..
SergKis пишет: Понял. Копаю пока дальше. Сенкс !
|
|
|
|
| |
Пост N: 4958
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.06.15 21:27. Заголовок: SergKis Функция Sav..
SergKis Функция Save_Rest_HMG то что надо Но вылез нежданчик )) Если в MDI или MDICHILD окне создать окно MODAL свое или вызвать что то типа функций MSG....() то это модальное окно живет в других программах . Такого эффекта нет , если окно простое не MDI.. Что то можно подкрутить в этом плане (чую сырец надо переделывать) ? ЗЫ Чисто интереса ради юзанул FiveWin c MDI , там нет такой бяки , все норм с MODAL + MDI...
|
|
|
|
| постоянный участник
|
Пост N: 661
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.15 22:04. Заголовок: Dima попробуй HB_FU..
Dima попробуй HB_FUNC( SETPARENT ) (в С текстах с меню выше) поставь своему модал поставить handle родителя mdichild
|
|
|
|
| |
Пост N: 4959
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.06.15 22:20. Заголовок: SergKis пишет: пост..
SergKis пишет: цитата: | поставь своему модал поставить handle родителя mdichild |
| Понял , пока не пробовал , а что делать с системными функциями Минигуи типа MSG...() там же тоже модальное окно и эффект тот же ? Объясню: есть модальное окно и в нем вызываю ну скажем MSGINFO() , ну все красиво , все вызвалось. Затем его не закрывая тихонько так переключаюсь совсем на другую программу и с удивлением обнаруживаю в ней на переднем плане MSGINFO() из моей задачи.
|
|
|
|
| постоянный участник
|
Пост N: 662
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.15 22:52. Заголовок: Dima пишет:MSGINFO()..
Dima пишет: цитата: | MSGINFO() из моей задачи. |
| по цепочке там заканчивается: MessageBoxIndirect( <ТУТ>, cMessage, cTitle, nStyle, nIcon ) первым параметром дай handle parent нужного окна
|
|
|
|
| |
Пост N: 4960
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.06.15 22:56. Заголовок: SergKis Понял , то ..
SergKis Понял , то есть сырец править , да ?
|
|
|
|
| постоянный участник
|
Пост N: 663
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.15 23:07. Заголовок: Dima Напиши свой ан..
Dima Напиши свой аналог MsgBox(), Msg..., используя тексты из h_msgbox.prg как "рыбу"
|
|
|
|
| |
Пост N: 4961
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.06.15 08:09. Заголовок: SergKis пишет: попр..
SergKis пишет: цитата: | попробуй HB_FUNC( SETPARENT ) |
| Попробовал. Перед тем как создать MODAL окно , считал handle родителя вот так GetActiveMdiHandle() (в переменую HTEST к примеру) Далее создаю MODAL окно и в конце ACTIVATE WINDOW Mchoice SETPARENT(ThisWindow.Handle,HTEST) и ни чего , MODAL живет без привязки. Что я сделал не так ?
|
|
|
|
| постоянный участник
|
Пост N: 664
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.06.15 11:25. Заголовок: Dima пишет:ACTIVATE ..
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 влиять не должно. Не знаю что сказать ...
|
|
|
Новых ответов нет
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[см. все]
|
|