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

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

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] Теперь Ваш пример работает нормально



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