Форум » GUI » Примеры из Минигуи -ошибки, вопросы..... (продолжение) » Ответить

Примеры из Минигуи -ошибки, вопросы..... (продолжение)

Andrey: Всем привет. Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые.... Очень красочный пример: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 (наверно AVI-шки нет в ресурсах) Предложение Григорию: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ? Пример: \MiniGUI\SAMPLES\Advanced\DisplayMode - не работает под ХР и далее.... Пример: \MiniGUI\SAMPLES\Advanced\Tsb_filter - вылетает на ХР -------------------------------------------------------------------------------- Harbour MiniGUI Errorlog File Harbour MiniGUI Extended Edition 2.0.1 - 2011.09.21 -------------------------------------------------------------------------------- Date: 11/15/2011 Time: 22:13:24 Error BASE/1124 Argument error: LEFT Called from LEFT(0) Called from SCANSOFT(195) Called from MAIN(84) Пример: \MiniGUI\SAMPLES\BASIC\MsgEdit - не собирается... Z:\MiniGUI\SAMPLES\BASIC\MsgEdit>call ..\..\..\batch\compile.bat demo /L shell32 Harbour 3.1.0dev (Rev. 17042) Copyright (c) 1999-2011, http://harbour-project.org/ Compiling 'demo.prg'... Lines 20133, Functions/Procedures 30 Generating C source output to 'demo.c'... Done. Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland demo.c: Error E2141 demo.prg 993: Declaration syntax error *** 1 errors in Compile *** C compile error.

Ответов - 39, стр: 1 2 All

Haz: SergKis пишет: Примерчик бы. да не вопрос , сейчас нарисую

Haz: Контекстное меню на бровсе , после исполнения открывается новое окно и пока его не закрыть меню больше не появляется [pre2] #include "minigui.ch" #include "tsbrowse.ch" #define CLR_PINK RGB( 255, 128, 128) #define CLR_NBLUE RGB( 128, 128, 192) Memvar oBrw1 Memvar aDatos Procedure Main() Public oBrw1 Public aDatos DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH 355 ; HEIGHT 400 ; TITLE "MAIN" ; MAIN ; FONT 'Tahoma' SIZE 10 Sample1() END WINDOW DEFINE CONTEXT MENU CONTROL oBrw1 OF Form1 MENUITEM 'Test Context Menu' ACTION {|| NewForm() } NAME CM_TEST END MENU ACTIVATE WINDOW Form1 Return *-------------------------------------------------------------- Function Sample1() aDatos := {} AADD( aDatos, {"Ena ", "Art01", "Mod01", "200"} ) AADD( aDatos, {"Dyo ", "Art02", "Mod01", "200"} ) AADD( aDatos, {"Tria ", "Art03", "Mod01", "200"} ) AADD( aDatos, {"Tessera ", "Art04", "Mod01", "200"} ) AADD( aDatos, {"Pente ", "Art05", "Mod01", "200"} ) AADD( aDatos, {"Exi ", "Art06", "Mod01", "200"} ) AADD( aDatos, {"Epta ", "Art07", "Mod01", "200"} ) AADD( aDatos, {"Okto ", "Art08", "Mod01", "200"} ) AADD( aDatos, {"Ennea ", "Art09", "Mod01", "200"} ) AADD( aDatos, {"Deka ", "Art10", "Mod02", "200"} ) AADD( aDatos, {"Enteka ", "Art11", "Mod02", "200"} ) AADD( aDatos, {"Dodeka ", "Art12", "Mod02", "200"} ) AADD( aDatos, {"Dekatria ", "Art13", "Mod02", "200"} ) AADD( aDatos, {"Dekatessera ", "Art14", "Mod02", "200"} ) AADD( aDatos, {"Dekapente ", "Art15", "Mod02", "200"} ) AADD( aDatos, {"Dekaexi ", "Art16", "Mod02", "200"} ) AADD( aDatos, {"Dekaepta ", "Art17", "Mod02", "200"} ) AADD( aDatos, {"Dekaokto ", "Art18", "Mod02", "200"} ) IF !_IsControlDefined ("oBrw1", "Form1") DEFINE TBROWSE oBrw1 ; AT 5,5 ; OF Form1 ; WIDTH 330 ; HEIGHT 345 ; FONT "Verdana" ; SIZE 10 ; GRID oBrw1:SetArray( aDatos ) ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 1; TITLE "Rubro" SIZE 120 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 2; TITLE "Articulo" SIZE 80 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 3; TITLE "Marca" SIZE 80 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 4; TITLE "M" SIZE 30 oBrw1:SetColor({5,6},{CLR_WHITE,CLR_MAGENTA}) oBrw1:SetColor( { 3, 4 }, { CLR_WHITE, CLR_NBLUE } ) END TBROWSE ENDIF Return Nil *-------------------------------------------------------------- Func NewForm() DEFINE WINDOW Form2 ; AT 5,500 ; WIDTH 355 ; HEIGHT 400 ; TITLE "CHILD" ; END WINDOW ACTIVATE WINDOW Form2 Return [/pre2]

gfilatov2002: Haz пишет: Контекстное меню на бровсе , после исполнения открывается новое окно и пока его не закрыть меню больше не появляется Да, есть такая проблема при обычном использовании контексного меню. Как временная мера, решил следующим образом в Вашем примере: [pre2] #include "minigui.ch" #include "tsbrowse.ch" #define CLR_PINK RGB( 255, 128, 128) #define CLR_NBLUE RGB( 128, 128, 192) Memvar oBrw1 Memvar aDatos Procedure Main() Public oBrw1 Public aDatos DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH 355 ; HEIGHT 400 ; TITLE "MAIN" ; MAIN ; FONT 'Tahoma' SIZE 10 Sample1() END WINDOW oBrw1:bRClicked := {|| CM() } DEFINE CONTEXT MENU CONTROL oBrw1 OF Form1 MENUITEM 'Test Context Menu' ACTION {|| NewForm() } NAME CM_TEST END MENU ACTIVATE WINDOW Form1 Return *-------------------------------------------------------------- Function Sample1() aDatos := {} AADD( aDatos, {"Ena ", "Art01", "Mod01", "200"} ) AADD( aDatos, {"Dyo ", "Art02", "Mod01", "200"} ) AADD( aDatos, {"Tria ", "Art03", "Mod01", "200"} ) AADD( aDatos, {"Tessera ", "Art04", "Mod01", "200"} ) AADD( aDatos, {"Pente ", "Art05", "Mod01", "200"} ) AADD( aDatos, {"Exi ", "Art06", "Mod01", "200"} ) AADD( aDatos, {"Epta ", "Art07", "Mod01", "200"} ) AADD( aDatos, {"Okto ", "Art08", "Mod01", "200"} ) AADD( aDatos, {"Ennea ", "Art09", "Mod01", "200"} ) AADD( aDatos, {"Deka ", "Art10", "Mod02", "200"} ) AADD( aDatos, {"Enteka ", "Art11", "Mod02", "200"} ) AADD( aDatos, {"Dodeka ", "Art12", "Mod02", "200"} ) AADD( aDatos, {"Dekatria ", "Art13", "Mod02", "200"} ) AADD( aDatos, {"Dekatessera ", "Art14", "Mod02", "200"} ) AADD( aDatos, {"Dekapente ", "Art15", "Mod02", "200"} ) AADD( aDatos, {"Dekaexi ", "Art16", "Mod02", "200"} ) AADD( aDatos, {"Dekaepta ", "Art17", "Mod02", "200"} ) AADD( aDatos, {"Dekaokto ", "Art18", "Mod02", "200"} ) IF !_IsControlDefined ("oBrw1", "Form1") DEFINE TBROWSE oBrw1 ; AT 5,5 ; OF Form1 ; WIDTH 330 ; HEIGHT 345 ; FONT "Verdana" ; SIZE 10 ; GRID oBrw1:SetArray( aDatos ) ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 1; TITLE "Rubro" SIZE 120 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 2; TITLE "Articulo" SIZE 80 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 3; TITLE "Marca" SIZE 80 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 4; TITLE "M" SIZE 30 oBrw1:SetColor({5,6},{CLR_WHITE,CLR_MAGENTA}) oBrw1:SetColor( { 3, 4 }, { CLR_WHITE, CLR_NBLUE } ) END TBROWSE ENDIF Return Nil *-------------------------------------------------------------- Func NewForm() DEFINE WINDOW Form2 ; AT 5,500 ; WIDTH 355 ; HEIGHT 400 ; TITLE "CHILD" ; CHILD END WINDOW ACTIVATE WINDOW Form2 Return nil *-------------------------------------------------------------- Func CM() if iswindowdefined(Form2) Form2.release endif Return Nil [/pre2]

Haz: gfilatov2002 пишет: Как временная мера, решил следующим образом Григорий, Ну как очень временная. Пример слишком прост, а реальная работа в том чтобы протащить в системе удобное переключение между активными окнами и документами. Пользователь наоткрывал много документов и по контексту хочу не закрывать документ , а переключится на него если он открыт. Сейчас все можно через главное меню, но там своя вложенная иерархия. Пока буду искать выход дальше, ведь главное меню отрабатывает правильно, значит и контекст можно научить

gfilatov2002: Haz пишет: хочу не закрывать документ , а переключится на него если он открыт. Тогда рекомендую сделать таким образом: [pre2] #include "minigui.ch" #include "tsbrowse.ch" #define CLR_PINK RGB( 255, 128, 128) #define CLR_NBLUE RGB( 128, 128, 192) Memvar oBrw1 Memvar aDatos Procedure Main() Public oBrw1 Public aDatos DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH 355 ; HEIGHT 400 ; TITLE "MAIN" ; MAIN ; FONT 'Tahoma' SIZE 10 Sample1() END WINDOW DEFINE WINDOW Form2 ; AT 5,500 ; WIDTH 355 ; HEIGHT 400 ; TITLE "CHILD" ; CHILD END WINDOW DEFINE CONTEXT MENU CONTROL oBrw1 OF Form1 MENUITEM 'Test Context Menu' ACTION {|| NewForm() } NAME CM_TEST END MENU ACTIVATE WINDOW ALL Return *-------------------------------------------------------------- Function Sample1() aDatos := {} AADD( aDatos, {"Ena ", "Art01", "Mod01", "200"} ) AADD( aDatos, {"Dyo ", "Art02", "Mod01", "200"} ) AADD( aDatos, {"Tria ", "Art03", "Mod01", "200"} ) AADD( aDatos, {"Tessera ", "Art04", "Mod01", "200"} ) AADD( aDatos, {"Pente ", "Art05", "Mod01", "200"} ) AADD( aDatos, {"Exi ", "Art06", "Mod01", "200"} ) AADD( aDatos, {"Epta ", "Art07", "Mod01", "200"} ) AADD( aDatos, {"Okto ", "Art08", "Mod01", "200"} ) AADD( aDatos, {"Ennea ", "Art09", "Mod01", "200"} ) AADD( aDatos, {"Deka ", "Art10", "Mod02", "200"} ) AADD( aDatos, {"Enteka ", "Art11", "Mod02", "200"} ) AADD( aDatos, {"Dodeka ", "Art12", "Mod02", "200"} ) AADD( aDatos, {"Dekatria ", "Art13", "Mod02", "200"} ) AADD( aDatos, {"Dekatessera ", "Art14", "Mod02", "200"} ) AADD( aDatos, {"Dekapente ", "Art15", "Mod02", "200"} ) AADD( aDatos, {"Dekaexi ", "Art16", "Mod02", "200"} ) AADD( aDatos, {"Dekaepta ", "Art17", "Mod02", "200"} ) AADD( aDatos, {"Dekaokto ", "Art18", "Mod02", "200"} ) IF !_IsControlDefined ("oBrw1", "Form1") DEFINE TBROWSE oBrw1 ; AT 5,5 ; OF Form1 ; WIDTH 330 ; HEIGHT 345 ; FONT "Verdana" ; SIZE 10 ; GRID oBrw1:SetArray( aDatos ) ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 1; TITLE "Rubro" SIZE 120 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 2; TITLE "Articulo" SIZE 80 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 3; TITLE "Marca" SIZE 80 ADD COLUMN TO TBROWSE oBrw1 ; DATA ARRAY ELEMENT 4; TITLE "M" SIZE 30 oBrw1:SetColor({5,6},{CLR_WHITE,CLR_MAGENTA}) oBrw1:SetColor( { 3, 4 }, { CLR_WHITE, CLR_NBLUE } ) END TBROWSE ENDIF Return Nil *-------------------------------------------------------------- Func NewForm() Form2.Restore Form2.Show Return nil[/pre2]

Andrey: Почему собираю ехе-ник (последняя версия Минигуи) под Win8 всё отлично работает, а под ХР появляются непонятные ошибки, вплоть до того что нет объекта, типа: Error BASE/1003 Переменная не существует: OBRWV Где и куда копать ?

SergKis: Haz пишет Пока буду искать выход дальше так работает на new версии http://my-files.ru/35j2jn

Haz: Григорий: Тогда рекомендую сделать таким образом: Григорий , спасибо за участие . К сожалению этот путь мне не годиться т.к. в контексте много пунктов , открываться может не одно окно и нужно правильно угадать куда хочет пользователь. В том же контексте живут вызовы dbAppend(), dbDelete() , вызов полной истории изменения значений ячейки в текущем бровсе (кто что когда ) и пр. Как идея - переделаю на вызов в своем потоке примерно так ( "гусары молчать! " (с) ) зато работает [pre2] MENUITEM 'Test Context Menu' ACTION {|| hb_threadDetach( hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @Newform())) } NAME CM_TEST [/pre2] SergKis пишет: так работает на new версии Ты волшебник , работает , правда перспектива переписи кода по всему проекту не обрадовала. Буду переползать постепенно

SergKis: Haz пишет Буду переползать постепенно Игорь, начни регистрировать все вызовы на Main окне (с главного меню, подменю, с окон, ...). Потом, действительно, постепенно меняешь вызовы на oMain:PostMsg(...). В oMain:oCargo:Set(nn, ...) под такими же номерами регистрации, можно иметь параметры для работы события и т.д.

Haz: SergKis пишет: начни регистрировать все вызовы на Main окне Спасибо. Начну понемногу. Тем более что вижу в этом только плюсы

Andrey: Как сделать до создания окна MAIN показ окна без ожидания ? Версия МиниГуи последняя. Пробовал так: [pre2]#include "i_hmgcompat.ch" Function Test_CreateDbf() .......... SET WINDOW MAIN OFF WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT //WaitWindow( "Подождите, создаю тестовую базу....", .T. ) // можно делать так везде без "i_hmgcompat.ch" FOR nI := 1 TO .... .......... NEXT WAIT CLEAR //WaitWindow() // можно делать так везде без "i_hmgcompat.ch" ..... RETURN NIL[/pre2] Программа отрабатывает нормально, НО в окне НЕТ НАДПИСИ !!! Что ещё нужно сделать, чтобы надпись появилась ?

Vlad04: Я создаю окно Main, но не показываю его NOSHOW ...ICON 'MAIN' MAIN NOSHOW NOMAXIMIZE ON INIT Init_Glav() ... При инициализации Окна делаю что надо - индексирую - проверяю доступ к программе и тп. А потом показываю ГЛАВНОЕ окно, если все нормально.

Andrey: Vlad04 пишет: Я создаю окно Main, но не показываю его NOSHOW Вопрос был другой...

Andrey: Пробую пере собрать исходник 2013 г. Не хватает функции IsWindowStyle(). Где её теперь брать ? В примере код выглядит так: [pre2] FOR i := 1 TO Len( aLbl ) cLbl := aLbl[ i ][ _N ] h := GetControlHandle( cLbl, cWnd ) lB := ! IsWindowStyle( h, WS_BORDER ) SetWindowStyle( h, WS_BORDER, lB ) DoMethod( cWnd, cLbl, "Refresh" ) NEXT[/pre2]

Dima: Andrey пишет: Где её теперь брать ? Возможно это твой сырец.

Andrey: Dima пишет: озможно это твой сырец. Нет, мне его (код программы) Григорий давал. Было раньше в самом МиниГуи. В версии 2.5.5 HB_FUNC( ISWINDOWSTYLE ) есть в модуле c_windows.c а в последней нет. Что тогда можно использовать ? Сам пример Form3color-demo.prg ниже: /* * MINIGUI - Harbour Win32 GUI library Demo * Minigui for version 2.1.9 and above * * Copyright 2013 Grigory Filatov <gfilatov@inbox.ru> * * Example: 3-color form and resize the program window * Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> * Copyright 2013 SergKis <http://clipper.borda.ru> */ #include "minigui.ch" #include "i_winuser.ch" #define PROGRAM '3-color form and resize the window' #define VERSION ' version 1.0' #define _Y 1 #define _X 2 #define _W 3 #define _H 4 #define _N 5 #define _T 6 STATIC lEdge := .T. STATIC aLbl STATIC aClr FUNCTION Main() LOCAL hWnd, nCliW, nCliH, cWnd := "MyWnd" DEFINE WINDOW &cWnd ; At 40, 50 ; WIDTH 480 ; HEIGHT 410 ; MINWIDTH 480 MINHEIGHT 410 ; TITLE PROGRAM + VERSION ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() ; ON INIT ReSize() Test_This( cWnd ) aLblClrInit() // initialize array size 3-color box AEval( aLbl, { | a, n | MySayColorLabel( n, n ) } ) hWnd := GetFormHandle ( cWnd ) nCliW := GetClientWidth ( hWnd ) nCliH := GetClientHeight( hWnd ) @ 40 , nCliW - 120 BUTTON Button_1 CAPTION 'Message_1' ; ACTION MsgInfo( "ACTION - Message Button_1 !" ) @ 180 , nCliW - 120 BUTTON Button_2 CAPTION 'Message_2' ; ACTION MsgInfo( "ACTION - Message Button_2 !" ) @ nCliH - 40 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release // change style object LABEL @ 40, 70 BUTTON Button_Style CAPTION 'Label Style' ; ACTION MyBorder( cWnd, aLbl ) @ 80, 70 BUTTON Button_Edge CAPTION 'Label Edge' ; ACTION MyEdge( cWnd, aLbl ) END WINDOW ACTIVATE WINDOW &cWnd RETURN NIL //////////////////////////////////////////////////////////////// // initialize array size 3-color box STATIC FUNCTION aLblClrInit() LOCAL cWnd, hWnd, nCliW, nCliH, nH1, nH2, nH3 cWnd := _HMG_ThisFormName hWnd := GetFormHandle ( cWnd ) nCliW := GetClientWidth ( hWnd ) nCliH := GetClientHeight( hWnd ) nH1 := Int( nCliH / 3 ) nH2 := nH1 * 2 nH3 := nCliH IF aLbl == NIL aLbl := { } AAdd( aLbl, { 0, 0, nCliW, nH1, "LabelColor_1", cWnd + "_Frame_Text1" } ) AAdd( aLbl, { nH1, 0, nCliW, nH2, "LabelColor_2", cWnd + "_Frame_Text2" } ) AAdd( aLbl, { nH2, 0, nCliW, nH3, "LabelColor_3", cWnd + "_Frame_Text3" } ) ELSE aLbl[ 1 ] [ _W ] := nCliW ; aLbl[ 1 ] [ _Y ] := 0 ; aLbl[ 1 ] [ _H ] := nH1 aLbl[ 2 ] [ _W ] := nCliW ; aLbl[ 2 ] [ _Y ] := nH1 ; aLbl[ 2 ] [ _H ] := nH2 aLbl[ 3 ] [ _W ] := nCliW ; aLbl[ 3 ] [ _Y ] := nH2 ; aLbl[ 3 ] [ _H ] := nH3 ENDIF IF aClr == NIL aClr := { } AAdd( aClr, { 178, 227, 137 } ) AAdd( aClr, { 255, 0, 255 } ) AAdd( aClr, { 251, 250, 174 } ) ENDIF RETURN //////////////////////////////////////////////////////////////// FUNCTION Test_This( cWnd ) IF Empty( _HMG_ThisFormName ) _HMG_ThisFormName := cWnd _HMG_ThisFormIndex := GetFormIndex( cWnd ) ELSEIF _HMG_ThisFormName != cWnd _HMG_ThisFormName := cWnd _HMG_ThisFormIndex := GetFormIndex( cWnd ) ENDIF RETURN //////////////////////////////////////////////////////////////// FUNCTION MySayColorLabel( nLabel, nColor ) LOCAL cLabelName, cLabelTitle, aColor LOCAL cWnd, i, j, y, x, w, h, t DEFAULT nColor TO nLabel cWnd := _HMG_ThisFormName aColor := aClr[ nColor ] cLabelName := aLbl[ nLabel ][ _N ] cLabelTitle := aLbl[ nLabel ][ _T ] @ aLbl[ nLabel ][ _Y ], aLbl[ nLabel ][ _X ] LABEL &cLabelName VALUE "" OF &cWnd ; WIDTH aLbl[ nLabel ][ _W ] HEIGHT aLbl[ nLabel ][ _H ] ; BACKCOLOR aColor CLIENTEDGE // BORDER //CLIENTEDGE i := GetControlIndex( cLabelName, cWnd ) j := cWnd + cLabelTitle t := "Hello - " + cLabelName + " { " + Str( aColor[ 1 ], 3 ) + "," t += Str( aColor[ 2 ], 3 ) + "," + Str( aColor[ 3 ], 3 ) + " }" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 220 h := 24 @ y, x LABEL &cLabelTitle VALUE t WIDTH w HEIGHT h BACKCOLOR aColor RETURN NIL //////////////////////////////////////////////////////////////// FUNCTION ReSize() LOCAL i, cWnd, hWnd, nCliW, nCliH cWnd := _HMG_ThisFormName hWnd := GetFormHandle ( cWnd ) nCliW := GetClientWidth ( hWnd ) nCliH := GetClientHeight( hWnd ) aLblClrInit() // initialize array size 3-color box // change the position of the Label-Color FOR i := 1 TO Len( aLbl ) SetProperty( cWnd, aLbl[ i ][ _N ], "Row" , aLbl[ i ][ _Y ] ) SetProperty( cWnd, aLbl[ i ][ _N ], "Width" , aLbl[ i ][ _W ] ) SetProperty( cWnd, aLbl[ i ][ _N ], "Height", aLbl[ i ][ _H ] ) NEXT // change the position of the Label-Text FOR i := 1 TO Len( aLbl ) SetProperty( cWnd, aLbl[ i ][ _T ], "Row" , aLbl[ i ][ _Y ] + 10 ) NEXT // change the position of the buttons SetProperty( cWnd, "Button_1", "Row" , 40 ) SetProperty( cWnd, "Button_1", "Col" , nCliW - 120 ) SetProperty( cWnd, "Button_2", "Row" , aLbl[ 2, _Y ] + 40 ) SetProperty( cWnd, "Button_2", "Col" , nCliW - 120 ) SetProperty( cWnd, "Button_3", "Row" , nCliH - 40 ) SetProperty( cWnd, "Button_3", "Col" , nCliW - 120 ) SETFOCUS Button_3 OF &cWnd RETURN // change the type border Style FUNCTION MyBorder( cWnd, aLbl ) LOCAL i, cLbl, lB, h FOR i := 1 TO Len( aLbl ) cLbl := aLbl[ i ][ _N ] h := GetControlHandle( cLbl, cWnd ) lB := ! IsWindowStyle( h, WS_BORDER ) SetWindowStyle( h, WS_BORDER, lB ) DoMethod( cWnd, cLbl, "Refresh" ) NEXT RETURN Nil // change the type border Style FUNCTION MyEdge( cWnd, aLbl ) LOCAL i, cLbl, h cLbl := aLbl[ 1 ][ _N ] h := GetControlHandle( cLbl, cWnd ) lEdge := ! lEdge IF lEdge ChangeStyle( h, WS_EX_CLIENTEDGE, 0, .T. ) ELSE ChangeStyle( h, 0, WS_EX_CLIENTEDGE, .T. ) ENDIF FOR i := 1 TO Len( aLbl ) cLbl := aLbl[ i ][ _N ] DoMethod( cWnd, cLbl, "Refresh" ) NEXT RETURN Nil //////////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP

gfilatov2002: Andrey пишет: Что тогда можно использовать ? Попробуй [pre2]FUNCTION IsWindowStyle( h, nStyle ) LOCAL nCtlStyle := GetWindowStyle( h ) RETURN( hb_bitAnd( nCtlStyle, nStyle ) != 0 ) [/pre2]

Andrey: gfilatov2002 пишет: Попробуй Спасибо БОЛЬШОЕ !

Vlad04: Если функцию sWindowStyle не добавлять, а закоментировать строку //lB := ! IsWindowStyle( h, WS_BORDER ) программа собирается и по внешнему виду не отличается. Операционка Win 7

Andrey: Vlad04 пишет: программа собирается и по внешнему виду не отличается. Там тогда у LABEL переопределить CLIENTEDGE и BORDER на лету нельзя будет....

Dima: Можно ли прицепить иконку на окно при вызове InputBox , не выдергивая сырец и не правя его руками ?

gfilatov2002: Dima пишет: Можно ли прицепить иконку на окно при вызове InputBox Да, копай команду Set Default Icon To Рабочий пример лежит в папке samples\Basic\InputBox

Dima: gfilatov2002 Спасибо !

Andrey: Использую для окна команду: [pre2]SET INTERACTIVECLOSE OFF DEFINE WINDOW &cFormName ; .... ON RELEASE {|| My(), как здесь дать команду INTERACTIVECLOSE в зависимости от состояния предыдущей команды } [/pre2] Правилен ли будет следующий код ? [pre2]nWinClose := _HMG_InteractiveClose SET INTERACTIVECLOSE OFF DEFINE WINDOW &cFormName ; .... ON RELEASE {|| My(), IIF( nWinClose == 0, , _HMG_InteractiveClose := 1 ) } [/pre2]

SergKis: Andrey пишет Правилен ли будет следующий код ? Если работает правильно, то правильный [pre2] h_events.prg ... //********************************************************************** CASE WM_CLOSE //********************************************************************** ... IF ISBLOCK ( _HMG_aFormInteractiveCloseProcedure [ i ] ) r := _DoWindowEventProcedure ( _HMG_aFormInteractiveCloseProcedure [ i ] , i , 'WINDOW_ONINTERACTIVECLOSE' ) IF ValType ( r ) == 'L' .AND. r == .F. RETURN ( 1 ) ENDIF ENDIF IF lParam <> 1 SWITCH _HMG_InteractiveClose CASE 0 MsgStop ( _HMG_MESSAGE [3] ) RETURN ( 1 ) CASE 2 IF ! MsgYesNo ( _HMG_MESSAGE [1] , _HMG_MESSAGE [2] ) RETURN ( 1 ) ENDIF EXIT CASE 3 IF _HMG_aFormType [ i ] == 'A' IF ! MsgYesNo ( _HMG_MESSAGE [1] , _HMG_MESSAGE [2] ) RETURN ( 1 ) ENDIF ENDIF END SWITCH ENDIF ... IF _HMG_aFormType [ i ] == 'A' ReleaseAllWindows() ELSE IF ISBLOCK( _HMG_aFormReleaseProcedure [ i ] ) _HMG_InteractiveCloseStarted := .T. _DoWindowEventProcedure ( _HMG_aFormReleaseProcedure [ i ] , i , 'WINDOW_RELEASE' ) ENDIF ... [/pre2]

Andrey: SergKis пишет: Если работает правильно, то правильный Да вроде работает ! До этого нельзя было окна другие крестиком закрывать.

Andrey: Как назначить на окно иконку из System.SystemFolder + "\shell32.dll ? Сделал ResEdit листинг shell32dll.rc, там иконка допустим 90-я: 176 ICON "Icon_90.ico" Пробовал сделать так: [pre2] LOCAL hFormIcon := ExtractIcon( System.SystemFolder + "\shell32.dll", 90 ) SET DEFAULT ICON TO "Icon_90.ico" [/pre2] Но это неправильно же. #command SET DEFAULT ICON TO <iconname> имени иконки в ресурсах ехе-ника нет, значит подставлять бесполезно. Можно получить только хендл иконки из shell32.dll А как этот хендл привязать к окну ?

gfilatov2002: Andrey пишет: Как назначить на окно иконку из System.SystemFolder + "\shell32.dll ? Посмотри рабочий пример ниже: [pre2]/* * MiniGUI Demo * */ #include "minigui.ch" Procedure MAIN LOCAL cIconSrc := System.SystemFolder + "\shell32.dll" SET MULTIPLE OFF WARNING SaveThisIcon( cIconSrc, 90 ) SET DEFAULT ICON TO System.TempFolder + '\temp.ico' DEFINE WINDOW Form_1 ; TITLE "Icon from shell32.dll" ; MAIN ; ON RELEASE Ferase( System.TempFolder + '\temp.ico' ) END WINDOW Form_1.Activate() Return ///////////////////////////////////////////////////////////////////////////////// Function SaveThisIcon( cSrcName, nI ) LOCAL cFileName := System.TempFolder + '\temp.ico' IF !SaveIcon( cFileName, cSrcName, nI ) MsgInfo( "Icon NOT saved!", "Error" ) ENDIF Return NIL ///////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" // // ICONS (.ICO type 1) are structured like this: // // ICONHEADER (just 1) // ICONDIR [1...n] (an array, 1 for each image) // [BITMAPINFOHEADER+COLOR_BITS+MASK_BITS] [1...n] (1 after the other, for each image) // // CURSORS (.ICO type 2) are identical in structure, but use // two monochrome bitmaps (real XOR and AND masks, this time). // typedef struct { WORD idReserved; // must be 0 WORD idType; // 1 = ICON, 2 = CURSOR WORD idCount; // number of images (and ICONDIRs) } ICONHEADER; // // An array of ICONDIRs immediately follow the ICONHEADER // typedef struct { BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wPlanes; // for cursors, this field = wXHotSpot WORD wBitCount; // for cursors, this field = wYHotSpot DWORD dwBytesInRes; DWORD dwImageOffset; // file-offset to the start of ICONIMAGE } ICONDIR; // // After the ICONDIRs follow the ICONIMAGE structures - // consisting of a BITMAPINFOHEADER, (optional) RGBQUAD array, then // the color and mask bitmap bits (all packed together // typedef struct { BITMAPINFOHEADER biHeader; // header for color bitmap (no mask header) } ICONIMAGE; // // Write the ICO header to disk // static UINT WriteIconHeader(HANDLE hFile, int nImages) { ICONHEADER iconheader; UINT nWritten; // Setup the icon header iconheader.idReserved = 0; // Must be 0 iconheader.idType = 1; // Type 1 = ICON (type 2 = CURSOR) iconheader.idCount = nImages; // number of ICONDIRs // Write the header to disk WriteFile(hFile, (LPVOID) &iconheader, sizeof(iconheader), (LPDWORD) &nWritten, NULL); // following ICONHEADER is a series of ICONDIR structures (idCount of them, in fact) return nWritten; } // // Return the number of BYTES the bitmap will take ON DISK // static UINT NumBitmapBytes(BITMAP *pBitmap) { int nWidthBytes = pBitmap->bmWidthBytes; // bitmap scanlines MUST be a multiple of 4 bytes when stored // inside a bitmap resource, so round up if necessary if(nWidthBytes & 3) nWidthBytes = (nWidthBytes + 4) & ~3; return nWidthBytes * pBitmap->bmHeight; } // // Return number of bytes written // static UINT WriteIconImageHeader(HANDLE hFile, BITMAP *pbmpColor, BITMAP *pbmpMask) { BITMAPINFOHEADER biHeader; UINT nWritten; UINT nImageBytes; // calculate how much space the COLOR and MASK bitmaps take nImageBytes = NumBitmapBytes(pbmpColor) + NumBitmapBytes(pbmpMask); // write the ICONIMAGE to disk (first the BITMAPINFOHEADER) ZeroMemory(&biHeader, sizeof(biHeader)); // Fill in only those fields that are necessary biHeader.biSize = sizeof(biHeader); biHeader.biWidth = pbmpColor->bmWidth; biHeader.biHeight = pbmpColor->bmHeight * 2; // height of color+mono biHeader.biPlanes = pbmpColor->bmPlanes; biHeader.biBitCount = pbmpColor->bmBitsPixel; biHeader.biSizeImage = nImageBytes; // write the BITMAPINFOHEADER WriteFile(hFile, (LPVOID) &biHeader, sizeof(biHeader), (LPDWORD) &nWritten, NULL); // write the RGBQUAD color table (for 16 and 256 colour icons) if(pbmpColor->bmBitsPixel == 2 || pbmpColor->bmBitsPixel == 8) { } return nWritten; } // // Wrapper around GetIconInfo and GetObject(BITMAP) // static BOOL GetIconBitmapInfo(HICON hIcon, ICONINFO *pIconInfo, BITMAP *pbmpColor, BITMAP *pbmpMask) { if(!GetIconInfo(hIcon, pIconInfo)) return FALSE; if(!GetObject(pIconInfo->hbmColor, sizeof(BITMAP), pbmpColor)) return FALSE; if(!GetObject(pIconInfo->hbmMask, sizeof(BITMAP), pbmpMask)) return FALSE; return TRUE; } // // Write one icon directory entry - specify the index of the image // static UINT WriteIconDirectoryEntry(HANDLE hFile, HICON hIcon, UINT nImageOffset) { ICONINFO iconInfo; ICONDIR iconDir; BITMAP bmpColor; BITMAP bmpMask; UINT nWritten; UINT nColorCount; UINT nImageBytes; GetIconBitmapInfo(hIcon, &iconInfo, &bmpColor, &bmpMask); nImageBytes = NumBitmapBytes(&bmpColor) + NumBitmapBytes(&bmpMask); if(bmpColor.bmBitsPixel >= 8) nColorCount = 0; else nColorCount = 1 << (bmpColor.bmBitsPixel * bmpColor.bmPlanes); // Create the ICONDIR structure iconDir.bWidth = bmpColor.bmWidth; iconDir.bHeight = bmpColor.bmHeight; iconDir.bColorCount = nColorCount; iconDir.bReserved = 0; iconDir.wPlanes = bmpColor.bmPlanes; iconDir.wBitCount = bmpColor.bmBitsPixel; iconDir.dwBytesInRes = sizeof(BITMAPINFOHEADER) + nImageBytes; iconDir.dwImageOffset = nImageOffset; // Write to disk WriteFile(hFile, (LPVOID) &iconDir, sizeof(iconDir), (LPDWORD) &nWritten, NULL); // Free resources DeleteObject(iconInfo.hbmColor); DeleteObject(iconInfo.hbmMask); return nWritten; } static UINT WriteIconData(HANDLE hFile, HBITMAP hBitmap) { BITMAP bmp; int i; BYTE * pIconData; UINT nBitmapBytes; UINT nWritten; GetObject(hBitmap, sizeof(BITMAP), &bmp); nBitmapBytes = NumBitmapBytes(&bmp); pIconData = (BYTE *)malloc(nBitmapBytes); GetBitmapBits(hBitmap, nBitmapBytes, pIconData); // bitmaps are stored inverted (vertically) when on disk.. // so write out each line in turn, starting at the bottom + working // towards the top of the bitmap. Also, the bitmaps are stored in packed // in memory - scanlines are NOT 32bit aligned, just 1-after-the-other for(i = bmp.bmHeight - 1; i >= 0; i--) { // Write the bitmap scanline WriteFile( hFile, pIconData + (i * bmp.bmWidthBytes), // calculate offset to the line bmp.bmWidthBytes, // 1 line of BYTES (LPDWORD) &nWritten, NULL); // extend to a 32bit boundary (in the file) if necessary if(bmp.bmWidthBytes & 3) { DWORD padding = 0; WriteFile(hFile, (LPVOID) &padding, 4 - bmp.bmWidthBytes, (LPDWORD) &nWritten, NULL); } } free(pIconData); return nBitmapBytes; } // // Create a .ICO file, using the specified array of HICON images // BOOL SaveIcon(TCHAR *szIconFile, HICON hIcon[], int nNumIcons) { HANDLE hFile; int i; int * pImageOffset; if(hIcon == 0 || nNumIcons < 1) return FALSE; // Save icon to disk: hFile = CreateFile(szIconFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); if(hFile == INVALID_HANDLE_VALUE) return FALSE; // // Write the iconheader first of all // WriteIconHeader(hFile, nNumIcons); // // Leave space for the IconDir entries // SetFilePointer(hFile, sizeof(ICONDIR) * nNumIcons, 0, FILE_CURRENT); pImageOffset = (int *)malloc(nNumIcons * sizeof(int)); // // Now write the actual icon images! // for(i = 0; i < nNumIcons; i++) { ICONINFO iconInfo; BITMAP bmpColor, bmpMask; GetIconBitmapInfo(hIcon, &iconInfo, &bmpColor, &bmpMask); // record the file-offset of the icon image for when we write the icon directories pImageOffset = SetFilePointer(hFile, 0, 0, FILE_CURRENT); // bitmapinfoheader + colortable WriteIconImageHeader(hFile, &bmpColor, &bmpMask); // color and mask bitmaps WriteIconData(hFile, iconInfo.hbmColor); WriteIconData(hFile, iconInfo.hbmMask); DeleteObject(iconInfo.hbmColor); DeleteObject(iconInfo.hbmMask); } // // Lastly, skip back and write the icon directories. // SetFilePointer(hFile, sizeof(ICONHEADER), 0, FILE_BEGIN); for(i = 0; i < nNumIcons; i++) { WriteIconDirectoryEntry(hFile, hIcon, pImageOffset); } free(pImageOffset); // finished! CloseHandle(hFile); return TRUE; } // // Save the icon resources to disk // HB_FUNC( SAVEICON ) { TCHAR *szIconFile = ( TCHAR* ) hb_parc( 1 ); HICON hLarge; HICON hSmall; HICON hIcon[2]; if( ExtractIconEx( ( LPCSTR ) hb_parc( 2 ), hb_parni( 3 ), &hLarge, &hSmall, 1 ) > 0 ) { hIcon[1] = hLarge; hIcon[0] = hSmall; hb_retl( SaveIcon( szIconFile, hIcon, 2 ) ); // clean up DestroyIcon( hLarge ); DestroyIcon( hSmall ); } else hb_retl( FALSE ); } #pragma ENDDUMP [/pre2] Да, и с тебя - пиво

Andrey: gfilatov2002 пишет: Посмотри рабочий пример ниже: Что-то не собирается... Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland form_ico_dll.c: Warning W8075 form_ico_dll.prg 302: Suspicious pointer conversion in function SaveIcon Error E2349 form_ico_dll.prg 305: Nonportable pointer conversion in function SaveIcon Warning W8075 form_ico_dll.prg 325: Suspicious pointer conversion in function SaveIcon Error E2342 form_ico_dll.prg 325: Type mismatch in parameter 'nImageOffset' (wanted 'unsigned int', got 'int *') in function SaveIcon *** 2 errors in Compile *** Может что-то на этой странице потерялось ? gfilatov2002 пишет: Да, и с тебя - пиво Без вопросов ! Пришлю ! Какую марку любишь ? P.S. Нашел пример MiniGUI\SAMPLES\BASIC\ExtractIcon\demo2.prg ! Собралось !!!

Andrey: Всем привет. Вывожу avi-файл на форму. Что-то фон avi-файла различается на разных ОС. Как можно считать цвет фона этого avi-файла ? Есть ли функция считывания цвета фона пикселя по выбранным координатам ? Вот код: @ nRow, 0 LABEL Label_Full VALUE '' WIDTH nWidth HEIGHT 50 BACKCOLOR {240,240,240 } // фон под avi-файл @ nRow, nCol ANIMATEBOX Avi_1 WIDTH 40 HEIGHT 40 File cResAvi AUTOPLAY TRANSPARENT NOBORDER Под Windows 8 показ нормальный: Под Windows XP или Server 2008 показ НЕ нормальный: Как правильно выводить avi-файл, чтобы фон окна совпадал с фоном самого avi-файл ?

SergKis: Andrey пишет Есть ли функция считывания цвета фона пикселя по выбранным координатам ? Поищи в SAMPLES GetPixel

Andrey: Сделал считывания пикселя с формы, но фигня всё равно получается. Возвращается фон окна, а не avi-файла. Как получить цвет фона avi-файла ? Нужно для показа avi на различных ОС. Если ручками ставить, то цвет можно подобрать, но на разных ОС цвета будут выглядеть по разному. Вот для ХР цвет фона для одного avi-файла подобрал, выглядит красиво, зато на 8-ке ерунда получается: Сам тест здесь - https://cloud.mail.ru/public/MMg6/chzRm4boD

Haz: Andrey пишет: можно подобрать Есть системные цвета. Как выбрать есть в примерах и исходниках, в частности в твоём любимом TSB

Andrey: Haz пишет: Есть системные цвета. Как выбрать есть в примерах и исходниках Спасибо БОЛЬШОЕ ! Нашёл цвета в i_winuser.ch После пробы нашёл нужный цвет: [pre2]COLOR_MENU 4 {192, 192, 192} COLOR_BTNFACE 15 {192, 192, 192} COLOR_3DLIGHT 22 {192, 192, 192} [/pre2] Сделал в исходнике так: [pre2] @ nRow, 0 LABEL Label_Full VALUE '' WIDTH nWidth HEIGHT 50 @ nRow+5, nCol ANIMATEBOX Avi_1 WIDTH 40 HEIGHT 40 File cResAvi AUTOPLAY TRANSPARENT NOBORDER aBackColorAvi := nRGB2Arr( GetSysColor( 4 ) ) // COLOR_MENU из i_winuser.ch Form_1.Label_Full.BackColor := aBackColorAvi // исправим фон как системный цвет [/pre2] Теперь картинки выглядят правильно:

Andrey: А как можно получить ширину AVI-файла ? Есть ли такая функция ? Ну и заодно уж и высоту AVI-файла ?

SergKis: Andrey пишет А как можно получить ширину AVI-файла ? This.Avi_1.Width\Height не подходят ?

Andrey: SergKis пишет: This.Avi_1.Width\Height не подходят ? Да не подходят... Они возвращают что задаёшь при построении... Хотя размер avi-файла совершенно другой... Вычислить размер avi-файла - это что-то. Приходиться делать вывод на форму без TRANSPARENT, потом эту форму выводить, потом захватывать редактором Snagit, потом уж считать размеры avi-файла и полученные цифирки вносить в свой код программы... Нужны функции типа: [pre2] aBmp := GetBitmapSize( _HMG_aControlBrushHandle [ i ] ) aBmp := GetIconSize( _HMG_aControlBrushHandle [ i ] )[/pre2]

Петр: Andrey пишет: Вычислить размер avi-файла - это что-то. Приходиться делать вывод на форму без TRANSPARENT, потом эту форму выводить, потом захватывать редактором Snagit, потом уж считать размеры avi-файла и полученные цифирки вносить в свой код программы А щелкнуть правой клавишей мыши и посмотреть свойства не проще?

Andrey: Петр пишет: А щелкнуть правой клавишей мыши и посмотреть свойства не проще? Да я в Far собираю проекты. Об этом и не подумал. Спасибо за подсказку !



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