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

Ответов - 151, стр: 1 2 3 4 5 6 7 8 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 собираю проекты. Об этом и не подумал. Спасибо за подсказку !

Andrey: Есть классный пример SAMPLES\BASIC\GETFILE А как вызвать такое же меню, только для сохранения файла ? Самому делать такую форму - ужас сколько нужно знать...

Dima: Andrey А ты ленивый шо туши свет Поиск по сырцам GETFILE , оппа нашли а там рядом живет PUFILE , возвращаемся в SAMPLES\BASIC и обнаруживаем пример.

Andrey: Блин... Искал SAVE... Спасибо БОЛЬШОЕ Dima за наводку !

Andrey: Делаю небольшой пример. Если в конце примера добавлю ещё один файл (типа так): [pre2]#include "resource_avi.prg" [/pre2] ТО пример перестаёт собираться вообще ! [pre2]c:\MiniGui\BATCH\compile.bat demo4 /e /Z Harbour 3.2.0dev (r1710180807) Copyright (c) 1999-2016, http://harbour-project.org/ Compiling 'demo4.prg'... 1 error No code generated. Compile error.[/pre2] Вот такая ошибка: C:\MiniGUI\include\miniprint.ch(14) Error E0004 MEMVAR declaration follows executable statement Я вообще не пользуюсь miniprint .... МиниГуи последний... Что делать ? У меня в minigui.ch рас комментированы строки: [pre2]#ifndef _HMG_OUTLOG #define _HMG_OUTLOG #endif[/pre2] Если меняю в заголовке файла #include "minigui.ch" на #include "hmg.ch", то пример собирается нормально !!!

Andrey: Пример SAMPLES\Advanced\RCDataToFile\demo.prg Если поместить в demo.rc: 1001 RCDATA "hello.exe" - файл или несколько файлов общим размеров примерно больше 750 кб то пример не собирается !!! Вылет по ошибке: demo.c: Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Fatal: Access violation. Link terminated. Надо бы указать в самом demo.rc - что нельзя такого делать ! Или ключи можно подобрать для BCC 5.5.1 На bcc 5.8.2 такого нет.

Alex_Cher: Andrey пишет: Пример SAMPLES\Advanced\RCDataToFile\demo.prg А у меня и ошибка ... Application: C:\MiniGUI\SAMPLES\Advanced\RCDataToFile\demo.exe Date: 11/09/17 Time: 09:47:39 Time from start: 0 days 0 hours 0 mins 0 secs Error BASE/4001 Argument error: HB_PROCESSVALUE Called from HB_PROCESSVALUE(0) Called from MAIN(20) in module: demo.prg

Andrey: Проблема на Win10 для последнего МиниГуи, на других системах всё нормально. Вот такая ошибка появляется при запуске программы: Если смотреть по коду Wait_Window(280) - моя функция:[pre2] DEFINE LABEL Message ROW 20 COL nPictCol*2 + nPictHeight WIDTH nMaxWidth - nPictCol*2 - nPictWidth HEIGHT nMessHeight VALUE cMessage TRANSPARENT .T. ACTION MoveActiveWindow() OnMouseHover RC_CURSOR( "hand32" ) END LABEL // строка 280[/pre2] В чём причина ошибки и как избавиться от такого ?

Dima: Andrey пишет: Проблема на Win10 для последнего МиниГуи, на других системах всё нормально. Тоже заметил непонятный глюк с PageScript именно на дясятке , прога на Harbour упала без объяснения причин.......Вероятно что то не сростается в Harbour и win10

Andrey: Использую объект TEXTBOX [pre2] cFormat := REPL("!",35) @ ... TEXTBOX Text_1 ...... ; INPUTMASK cFormat ; .... [/pre2] Работает нормально. А как мне задать формат букв и цифр без перевода в верхний регистр ? Если ставить как в Харборе cFormat := REPL("Х",35) - то в TEXTBOX появляются ХХХХХХХХХХХХХХХХХХХХХ В доке не совсем понятно: [pre2]InputMask String (Numeric Textbox): 9 Displays digits $ Displays a dollar sign in place of a leading space * Displays an asterisk in place of a leading space . Specifies a decimal point position , Specifies a comma position InputMask String (Non-Numeric Textbox): 9 Digits A Alphabetic Characters ! Alphabetic Characters (Uppercase Conversion) and Digits (All other characters are included in text in the position indicated by the mask) Format String (Allowed in Numeric Textbox Only): C: Displays CR after positive numbers X: Displays DB after negative numbers ( : Encloses negative numbers in parentheses E: Displays numbers in British format N: Displays Alphabetic Characters and Digits[/pre2]

Dima: а пример глянуть ? C:\MiniGUI\SAMPLES\BASIC\INPUTMASK\character2.prg

Andrey: Dima пишет: а пример глянуть ? Спасибо Дима ! Понял.

Andrey: Dima пишет: а пример глянуть ? C:\MiniGUI\SAMPLES\BASIC\INPUTMASK\character2.prg Глянул. Нет такого шаблона/маски для ввода одновременно Lower/Upper цифр и букв кроме формата: ! Alphabetic Characters (Uppercase Conversion) and Digits Блин, и как теперь быть ? Опять переделкой заниматься на GETBOX ? Как мне для объекта TEXTBOX задать формат букв и цифр без перевода в верхний регистр ? Ответ - никак, для TEXTBOX тоже устроит....

SergKis: Andrey пишет без перевода в верхний регистр XXXX - обеспечивает ввод как есть для текстов, а для перевода в upper\lower есть установки дополнительно. // TEXTBOX #command @ <row>, <col> TEXTBOX <name> ; ... [ <upper: UPPERCASE> ] ; [ <lower: LOWERCASE> ] ; ... как бы все есть.

Andrey: SergKis пишет: как бы все есть. Да я уже писал об этом. Попробуй в примере BASIC\INPUTMASK\character2.prg изменить: [pre2] @ 110,120 TEXTBOX text_4 ; VALUE '' ; INPUTMASK 'XXXXXXXXXXXX';[/pre2] Получишь на экране вместо ввода строку XXXXXXXXXXXX ... Вот и задаю вопрос: Как мне для объекта TEXTBOX задать формат букв и цифр без перевода в верхний регистр ?

SergKis: Andrey пишет Как мне для объекта TEXTBOX задать формат букв и цифр без перевода в верхний регистр ? INPUTMASK убери совсем.

Andrey: SergKis пишет: INPUTMASK убери совсем. НЕ могу !!! Мне нужно контролировать длину ввода текста в TEXTBOX ! Как это можно сделать без INPUTMASK ?

SergKis: Andrey пишет Как это можно сделать без INPUTMASK ? есть [ MAXLENGTH <maxlength> ] ; если [ FIELD <field> ] ; должно сработать по длине его для [ VALUE <value> ] ; должно сработать по длине space(20) пробуй.

Andrey: Всем привет ! Делаю контекстное меню. Не могу получить значение выбираемого меню. Вот код:[pre2] STATIC nStatRet := 0 ..... DEFINE CONTEXT MENU OF &cForm FOR nI := 1 TO LEN(aMenuItem) cMenu := aMenuItem[nI] cName := "MyMenuItem" + HB_NtoS(nI) bAction := &( '{|| nStatRet := VAL( "' + HB_NtoS(nI) + '" ) }' ) cImg := aMenuImg[nI] lChk := .F. lDis := .F. _DefineMenuItem( cMenu, bAction, cName, cImg, lChk, lDis, , Font1 , , .F., .F. ) NEXT SEPARATOR MENUITEM "Выход" ACTION {|| nStatRet := 0 } FONT Font2 IMAGE aMenuImg[nLen] END MENU _ShowContextMenu(cForm, nY, nX, .f. ) // ПОКАЗ ВЫПАДАЕЩЕГО МЕНЮ InkeyGui(100) ? nStatRet, VALTYPE(nStatRet)[/pre2] Почему то всегда возвращает 0 ?

SergKis: Andrey пишет Почему то всегда возвращает 0 ? Со времен clipper static переменные в макро не доступны. Т.е. пиши прямо в блок кода или исп. private. Т.к. предст. код - функция, то все просто. У себя делаю[pre2] STATIC FUNC wMainStatusBar( nPos, oWn, nKy ) ... aMdiChild := GetWndMdiChildAll( .T. ) nItems := Len( aMdiChild ) If nItems > 0 PRIVATE nMsg := 0 aItems := {} AEval(aMdiChild, {|ow| AAdd(aItems, { ow:Title, .T., .F., ow:GetProp('wMainMsg') }) }) AEval(aItems , {|ai,ni| aItems[ni][4] := 'm->nMsg := '+hb_ntos(ai[4]) }) // text item , image, disable, block hb_AIns(aItems, 1, { 'WINDOWS IN OPERATION :', .F. , .T. , Nil }, .T.) hb_AIns(aItems, 2, { '' }, .T.) nY := oMain:ClientHeight - oMain:StatusBar:Height * nItems nX := oMain:ClientWidth - oMain:StatusBar:Width(5) - ; oMain:StatusBar:Width(4) If WndContextMenu( nY, nX, aItems ) .and. m->nMsg > 0 oMain:PostMsg( m->nMsg ) EndIf EndIf ... там где у тебя bAction := &( '{|| nStatRet := VAL( "' + HB_NtoS(nI) + '" ) }' ) добавь If HB_ISCHAR(bAction); bAction := &( '{|| '+bAction+' }' ) Else ... EndIf короче писать бкдет [/pre2]

Andrey: SergKis пишет: Со времен clipper static переменные в макро не доступны. А кто мне помогал этот код писать ? Я и делал аналогично как в примере Tsb_composite(1.8).7z : [pre2]STATIC nStaticLang ...... Forma_Lang(cForm) InkeyGui(10) // menu работает через очередь ! ? nStaticLang // вернулась из Forma_Lang(cForm) .... FUNCTION Forma_Lang(cForm) ........ DEFINE CONTEXT MENU OF &cForm MENUITEM "Русский / Russian" ACTION {|| nStaticLang := 1 } FONT Font2 IMAGE aFlags[1] MENUITEM "Украинский / Ukrainian" ACTION {|| nStaticLang := 2 } FONT Font2 IMAGE aFlags[2] MENUITEM "Белорусский / Byelorussian" ACTION {|| nStaticLang := 3 } FONT Font2 IMAGE aFlags[3] MENUITEM "Казахский / Kazakh" ACTION {|| nStaticLang := 4 } FONT Font2 IMAGE aFlags[4] MENUITEM "Английский / English" ACTION {|| nStaticLang := 5 } FONT Font2 IMAGE aFlags[5] SEPARATOR MENUITEM "Удалить значение / Delete value" ACTION {|| nStaticLang := 0 } FONT Font1 SEPARATOR MENUITEM "Выход / Exit" ACTION {|| nStaticLang := -1 } FONT Font1 END MENU ....[/pre2] PRIVATE nMsg := 0 m->nMsg А с каких пор для PRIVATE переменных можно ставить m-> ? Я всегда ставил только для PUBLIC .... Остановился на варианте: [pre2] PRIVATE nMsg m->nMsg := 0 .... bAction := &( '{|| m->nMsg := VAL( "' + HB_NtoS(nI) + '" ) }' ) .... [/pre2] При PRIVATE nMsg := 0 - ошибка компиляции: Harbour 3.2.0dev (r1711152234) form_New.prg(340) Warning W0002 Ambiguous reference, assuming memvar 'NMSG' No code generated. СПАСИБО БОЛЬШОЕ !

SergKis: Andrey пишет А кто мне помогал этот код писать ? 1. ACTION {|| nStaticLang := 1 } и 2. &( '{|| m->nMsg := VAL( "' + HB_NtoS(nI) + '" ) }' ) почувствуй разницу SergKis пишет пиши прямо в блок кода или исп. private 1-е прямо в коде 2-е исп. private

SergKis: Andrey пишет При PRIVATE nMsg := 0 - ошибка компиляции: смени режим компиляции или пиши как требует уст. компиляции

SergKis: Andrey пишет А с каких пор для PRIVATE переменных можно ставить m-> ? Я всегда ставил только для PUBLIC .... Со времен Summer 87

Pasha: Andrey пишет: Делаю контекстное меню. Не могу получить значение выбираемого меню. Вот код: STATIC nStatRet := 0 ..... DEFINE CONTEXT MENU OF &cForm FOR nI := 1 TO LEN(aMenuItem) cMenu := aMenuItem[nI] cName := "MyMenuItem" + HB_NtoS(nI) bAction := &( '{|| nStatRet := VAL( "' + HB_NtoS(nI) + '" ) }' ) cImg := aMenuImg[nI] lChk := .F. lDis := .F. _DefineMenuItem( cMenu, bAction, cName, cImg, lChk, lDis, , Font1 , , .F., .F. ) NEXT SEPARATOR MENUITEM "Выход" ACTION {|| nStatRet := 0 } FONT Font2 IMAGE aMenuImg[nLen] END MENU _ShowContextMenu(cForm, nY, nX, .f. ) // ПОКАЗ ВЫПАДАЕЩЕГО МЕНЮ InkeyGui(100) ? nStatRet, VALTYPE(nStatRet) Почему то всегда возвращает 0 ? Вклинюсь в вашу беседу. Маленький совет. Вместо такого кода (я конечно понимаю, что нормальные герои всегда идут в обход, но..) bAction := &( '{|| nStatRet := VAL( "' + HB_NtoS(nI) + '" ) }' ) лучше так: bAction := GetStatBlock(nI) ... Static func GetStatBlock(nI) Return {|| nStatRet := nI} Это прямой путь без всяких макросов и сомнительных конструкций через з.. Val и hb_NTOS

SergKis: Pasha По мне исп. в данном случае static переменной - лишнее. А без макросов можно hb_macroBlock(сVal) использовать

SergKis: PS Если применить вместо [pre2] cName := "MyMenuItem" + HB_NtoS(nI) bAction := &( '{|| nStatRet := VAL( "' + HB_NtoS(nI) + '" ) }' ) это cName := StrZero(nI, 3) bAction := {|| MyContextMenu() } ) то Static Func MyContextMenu() Local cForm := ThisWindow.Name // _HMG_ThisFormName Local cItem := This.Name // _HMG_ThisControlName Local nItem := Val(cItem) ... [/pre2]

Pasha: Макросы, private/public переменные... Это все стиль программирования, который имело смысл использовать до 1990-го года, когда появился клиппер 5 А с тех пор прошло все-таки 27 (двадцать семь, Карл!) лет. Контекстное меню - это, как я понимаю, popup-меню. В bAction заполняется номер выбранного пункта меню. Затем, надо полагать, в зависимости от номера выполняется какое-то действие. Почему бы сразу не задать в bAction это действие ? Т.е., кроме массива aMenuItem с названиями элементов меню передавать еще и массив блоков кода с действиями для этих элементов меню, или двумерный массив: имя и блок кода действие для этого элемента. Это еще более спрямит очень уж долгий путь к нужному результату.

Andrey: Pasha пишет: Почему бы сразу не задать в bAction это действие ? Это у меня функция для 3-х разных кнопок и картинке. При выборе позиций меню, кнопки/картинки перерисовываются. Из-за этого и не захотел дублировать одну функцию.

SergKis: Andrey пишет не захотел дублировать одну функцию Pasha об этом[pre2] ... FOR nI := 1 TO LEN(aMenuItem) cMenu := aMenuItem[nI] cName := "MyMenuItem" + HB_NtoS(nI) bAction := aMenuBlock[nI] // &( '{|| nStatRet := VAL( "' + HB_NtoS(nI) + '" ) }' ) cImg := aMenuImg[nI] ... [/pre2] передавай сразу, что выполнять из 3-х мест и дублироваться не будет.

Andrey: SergKis пишет: передавай сразу, что выполнять из 3-х мест и дублироваться не будет. Это не всегда удобно и необходимо.

Andrey: Сделал небольшой тест - https://cloud.mail.ru/public/74it/5ovNT4GDk Не могу добиться смены фона на КНОПКЕ. Что там не так делаю ? Вот текст кода: [pre2] @ 140, 110 BUTTONEX Button_S1 WIDTH 400 HEIGHT nFontSize*2 ; .......... FONTCOLOR BLACK BACKCOLOR YELLOW ; NOHOTLIGHT NOXPSTYLE HANDCURSOR NOTABSTOP ; On MouseHover {|| BFInvertObject({YELLOW,BLACK}) } ; On MouseLeave {|| BFInvertObject({BLACK,YELLOW}) } ; ACTION { || .... }[/pre2]

gfilatov2002: Andrey пишет: Что там не так делаю ? Убери из определения кнотки класс NOHOTLIGHT [pre2] @ 140, 110 BUTTONEX Button_S1 WIDTH 400 HEIGHT nFontSize*2 ; CAPTION aDim3[nI3] SIZE nFontSize ; FONTCOLOR BLACK BACKCOLOR YELLOW ; /*NOHOTLIGHT*/ NOXPSTYLE HANDCURSOR NOTABSTOP ; [/pre2]и все заработает

Andrey: gfilatov2002 пишет: и все заработает Опять пролетел... А за что он хоть отвечает ? Можно чуток подробнее про него ?

gfilatov2002: Andrey пишет: Можно чуток подробнее про него ? Если указан класс NOHOTLIGHT, то не создается подсветка контура кнопки при наведени мыши на кнопку. Поправил: сделал событие ON MOUSEHOVER независимым от указания класса NOHOTLIGHT для ButtonEx. Благодарю за наводку

Andrey: gfilatov2002 пишет: Поправил: сделал событие ON MOUSEHOVER независимым от указания класса NOHOTLIGHT для ButtonEx. Это будет доступно в следующей версии ?

gfilatov2002: Andrey пишет: Это будет доступно в следующей версии ? Да, конечно. Как раз сегодня подготовил первую бетку для следующей сборки

Andrey: gfilatov2002 пишет: Как раз сегодня подготовил первую бетку для следующей сборки Положи туда пример - Colored_Tab2. Правда его ещё доделать надо на показ/скрытие вкладок Tab. А так этот пример очень показателен. Пока дошёл как нужно работать с Tab, очень много времени потратил. Теперь можно на базе этого примера сразу делать большие программы.

Andrey: Всем привет ! Столкнулся с проблемой, не знаю как решить. Есть у меня в программе окно, создаётся так: [pre2] DEFINE WINDOW Form_Report ; ...... WINDOWTYPE STANDARD TOPMOST ; NOMAXIMIZE NOSIZE NOSYSMENU ; ..... DEFINE WINDOW Win_2 ; ... ; WINDOWTYPE PANEL .......... END WINDOW .... hWnd := GetFormHandle('Win_2') ON KEY PRIOR ACTION SendMessage( hWnd, WM_VSCROLL, SB_PAGEUP, 0 ) ON KEY NEXT ACTION SendMessage( hWnd, WM_VSCROLL, SB_PAGEDOWN, 0 ) ON KEY UP ACTION SendMessage( hWnd, WM_VSCROLL, SB_LINEUP, 0 ) ON KEY DOWN ACTION SendMessage( hWnd, WM_VSCROLL, SB_LINEDOWN, 0 ) END WINDOW[/pre2] Окно прекрасно работает, но если открыто другое окно: [pre2] DEFINE WINDOW &cFormName ; ......... WINDOWTYPE STANDARD TOPMOST ; NOMAXIMIZE NOSIZE ; ... DEFINE TBROWSE oBrw ; .... END TBROWSE .... END WINDOW[/pre2] то программа падает с ошибкой: Error MGERROR/0 Form Win_2 is not defined. Program terminated. Called from MSGMINIGUIERROR(97) in module: h_error.prg Called from GETFORMHANDLE(2209) in module: h_windows.prg Called from SHOW_REPORT2(261) in module: Source\form_report.prg Called from SHOW_REPORT(118) in module: Source\form_report.prg Called from (b)HB_MACROBLOCK(0) Строка 261 в SHOW_REPORT2(261) такая: [pre2] hWnd := GetFormHandle('Win_2') [/pre2] Почему падает ? Или нужно по другому делать ?

Vlad04: А окно объявлено ? Declare window Win_2 А почему не так cFormName:='Win_2'

Andrey: Кажись разобрался... Это еще первые мои наработки были. Говорил же Сергей: всегда нужно объекты положить на форму и ненужные просто скрывать. А у меня по условию - положить объект Win_2. Вот и ищет хендл несуществующего объекта. Спасибо за участие. Пока не спросишь что то - фиг сам разберёшься !

rvu: Такая проблема обнаружилась. У меня есть три программки, в каждой из них ввод данных. По отдельности все работает нормально. Начинаю их соединять вместе. В первой программе сверху кнопки: DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 230,30 FLAT RIGHTTEXT BUTTON UNDO ; CAPTION 'Отменить введеное' ; ACTION ( Refresh() ) BUTTON SAVE ; CAPTION 'Записать и отправить' ; ACTION ( Save(), Refresh() ) BUTTON TABLO_ON ; CAPTION 'Включить ТАБЛО' ; ACTION ( ToOnTablo() ) BUTTON TABLO_OFF ; CAPTION 'Закрыть ТАБЛО' ; ACTION ( ToExitTablo() ) BUTTON SETTINGS01 ; CAPTION 'Настройки' ; ACTION ( ToSettings1() ) BUTTON UPGRADE ; CAPTION 'Обновление' ; ACTION ( ToUpgrade() ) END TOOLBAR Начинаю соединять программы. Кнопка Настройки вызывает другое окно, там тоже есть кнопка, вызывающее третье окно. В третьем окне очередной ввод данных. Пока их немного всё работает, но в какой-то момент времени при добавлении TEXTBOXов в это третье окно, в первом окне кнопки Настройки и Обновление перестают показываться. Т.е. сами кнопки есть, они нажимаются, работают, но надписи в них или пропадают или заменяются абракадаброй. Остальные кнопки показываются нормально. Вот что это и как быть?

SergKis: rvu пишет Вот что это и как быть? Без примера, организации вызовов новых окон, трудно понять суть, можно только фантазировать. Посмотрите пример APP_OOPEvens и попробуйте хотя бы новые окна создавать через сообщения. Возможно TEXTBOX заменять на GETBOX/

rvu: SergKis пишет: Возможно TEXTBOX заменять на GETBOX В свое время чем-то он мне не понравился.

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

Andrey: rvu пишет: Вот что это и как быть? Сделать маленький и самодостаточный пример. А на вызовы функций типа: ToOnTablo() - навесить MsgDebug() ! Тогда можно будет понять свой промах. Без этого примера, ничего не выйдет.

rvu: Andrey пишет: Сделать маленький Так в том и проблема, что пока программа маленькая, она работает. Но я для себя проблему решил, просто отказался от этого тулбара, сделал свои кнопки, с ними все нормально.

Andrey: Пример \MiniGUI\SAMPLES\Advanced\Tsb_filter Добавляю строку показа клавиатуры в пример: [pre2] DEFINE TEXTBOX Text_1 ROW 5 COL 90 WIDTH 345 HEIGHT 21 ON CHANGE {|| RefreshBrowse()} END TEXTBOX @ 5, 450 LABEL Label_KB VALUE '('+KB_LANG()+')' ; WIDTH 50 HEIGHT 21 SIZE 11 BOLD FONTCOLOR BLACK TRANSPARENT // "RUS/LAT" [/pre2] Ну и добавил саму функцию KB_LANG() [pre2]/*------------------------------------------------------------------------------ * http://clipper.borda.ru/?1-4-0-00000995-000-0-0-1408978369 * lis_eng := lis_eng_kbd(@rsl) ... KB_ENG() ... KB_RUS() ... */ Function lis_eng_kbd(rsl) rsl:=RASKLADKA() return (rsl== "00000409") //eng Function lis_rus_kbd(rsl) rsl:=RASKLADKA() return (rsl== "00000419") //rus Function KB_LANG() Local rsl, cRet := "???" rsl:=RASKLADKA() IF rsl == "00000409" cRet := "ENG" ELSEIF rsl == "00000419" cRet := "RUS" ENDIF return cRet #pragma BEGINDUMP #include "Windows.h" #include "hbapi.h" HB_FUNC(KB_RUS) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; } HB_FUNC(KB_ENG) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; } HB_FUNC(RASKLADKA) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; GetKeyboardLayoutName(m_PreviousLayout); hb_retc(m_PreviousLayout); } #pragma ENDDUMP [/pre2] Как заставить правильно отображать клавиатуру находясь в TEXTBOX Text_1 ? А то переходишь на русскую клавиатуру, внизу правильно, а в LABEL Label_KB неправильная, пока не нажмешь любую букву. Для TBROWSE знаю, что нужно добавить: [pre2] // Вывод подсказки с использованием внутреннего цикла TBrowse oBrw:bEvents := { |a,b| MyEventBrowse(a,b) } ....[/pre2] В KeyUserEdit() добавить: [pre2] CASE nKey == 16 .OR. nKey == 17 // Shift+Alt Shift+Ctrl "RUS/LAT" SetProperty(cForm, "Label_KB", "Value", '('+KB_LANG()+')' ) lRet := .F. [/pre2] И внести функцию: [pre2]STATIC FUNCTION MyEventBrowse(oBrw, nMsg) // "RUS/LAT" LOCAL cForm := oBrw:cParentWnd, cAlias := oBrw:cAlias IF _IsControlDefined( "Label_KB", cForm ) .and. !(nMsg==WM_PAINT) SetProperty(cForm, "Label_KB", "Value", '('+KB_LANG()+')' ) ENDIF RETURN 0 [/pre2]

Haz: Andrey пишет: Добавляю строку показа клавиатуры в пример: А зачем? Пример показывает как можно обработать фильтр в бровсе и все. Зачем все в один компот сливать? Хочется поупражняться, есть пример( или аппликуха) LangIndicator кажется, так называется. Или сделай новый, хотя и так от tsb_***** в примерах уже в глазах мелькает.

Dima: Haz пишет: LangIndicator Есть такой в Advanced\LANG_INDICATOR\ но у меня на семерке работает криво. На переключение раскладки не реагирует , пока хотя бы раз не нажать в трее на этом LANG_INDICATOR

Haz: Dima пишет: На переключение раскладки не реагирует , пока хотя бы раз не нажать в трее на этом LANG_INDICATOR Вот тем более. Есть куда приложить руку и приписать свой (с)

Dima: Haz

Andrey: Haz пишет: А зачем? Пример показывает как можно обработать фильтр в бровсе и все. А чтобы понять, как заставить изменить показ клавиатуры для этого фильтра и бровса. Пример выбран специально, чтобы потом посмотреть как это всё вместе будет работать и перенести к себе в проект.

Haz: Andrey пишет: чтобы понять, как заставить Так и спрашивай, как из текстбокса перехватить клаву. С бровсом я так понял проблем нет. А то не понятно, толи ты улучшайзингом примеров занимаешься, толи конкретную свою задачу решаешь. Текстбокс, неполноценный контрол. Замени на гетбокс. Да и способов отобразить какой язык в системе текущий можно без отлова везде горячей комбинации. Самый простой и надёжный это таймер, сложнее это поток. А так появится на форме датапикер, будешь здесь писать как на нем поймать.

Andrey: Haz пишет: Так и спрашивай, как из текстбокса перехватить клаву. С бровсом я так понял проблем нет. А то не понятно, толи ты улучшайзингом примеров занимаешься, толи конкретную свою задачу решаешь. В этом примере с бровсом разобрался, думал не смогу. Вот и остался один объект (текстбокс) где не смог перехватить клаву. Чтобы другой пример не плодить, остался на этом примере. Насчёт гетбокс понял, буду смотреть. Спасибо !

Haz: Andrey пишет: Вот и остался один объект (текстбокс) где не смог перехватить клаву. А если на форме будет 100 контролов, все перехватывать будешь.? Проще повесить таймер на форму с интервалом 1000 в котором сравнивать текущй язык с твоей лейбой. Не совпало, значит что то из них надо поменять и скорее всего это лейба.

Vlad04: Как заставить правильно отображать клавиатуру находясь в TEXTBOX Text_1 Я при входе в Box сам устанавливаю нужную раскладку, чтобы юзер и не парился

Andrey: Vlad04 пишет: Я при входе в Box сам устанавливаю нужную раскладку, чтобы юзер и не парился Справочник оборудования, список на русском и английском. Какую тогда раскладку ставить ?

Alex_Cher: Vlad04 пишет: Я при входе в Box сам устанавливаю нужную раскладку чем, не подскажешь ...

Dima: Вопрос по примеру WEBCAM_2 Жму кнопку Capture , картинка после первого нажатия не меняется , хотя файл снимок и появляется. Проверял hBitmap в процедуре CaptureImage и он не пустой. Жму повторно на Capture , картинка под этой кнопкой поменялась. Далее сворачиваю окно и после снова его поднимаю а картинки под Capture уже нет. Как лечить ?

SergKis: Dima пробни так [pre2] *-----------------------------------------------------------------------------* Procedure Main *-----------------------------------------------------------------------------* SET OOP ON ... ON INIT ( (This.Object):PostMsg(1), DoEvents(), ; (This.Object):PostMsg(1) ) ; // CaptureImage() ; // capture initialization ON RELEASE CloseWebCam() ; ON RESTORE ( (This.Object):PostMsg(1), DoEvents(), ; (This.Object):PostMsg(1) ) (This.Object):Event( 1, {|| CaptureImage() }) ... DEFINE BUTTON Button_3 ROW 80 COL 315 WIDTH 80 CAPTION 'Capture' ACTION ( (ThisWindow.Object):PostMsg(1), DoEvents() ) END BUTTON [/pre2]

Dima: SergKis пишет: пробни так Не помогло однако ON INIT сделал такой , но картинка сразу не появляется. [pre2] ON INIT ( (This.Object):PostMsg(1), DoEvents(CaptureImage()) ,(This.Object):PostMsg(1)) [/pre2] Фокус с ON RESTORE не сработал .... ACTION в Button_3 сделал такой , работает теперь нормально [pre2] ACTION ( (ThisWindow.Object):PostMsg(1),DoEvents(CaptureImage()) ) [/pre2] PS По большому счету в ON INIT можно и убрать CaptureImage() , как и сам ON INIT

SergKis: Dima пишет По большому счету в ON INIT можно и убрать поставить тиймер с сообщением на время и будет долбить фото. Не помогло однако у меня работает нормально, 1-раз инициализация, 2-раз пошла фото, так же и при restore ok

Dima: SergKis Я тупанул , сорри. Не придал значения этой строке и не добавлял ее (This.Object):Event( 1, {|| CaptureImage() }) Все работает отлично Спасибо !

SergKis: Dima С событиями, такой пример получается [pre2] *-----------------------------------------------------------------------------* Procedure Main *-----------------------------------------------------------------------------* SET OOP ON IF StatusOk != GdiplusInitExt( _GDI_GRAPHICS ) MsgStop( "Init GDI+ Error", "Error" ) RETURN ENDIF _GdiplusInitLocal() DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 440 + GetBorderWidth() ; HEIGHT 300 + GetTitleHeight() + GetBorderHeight() ; TITLE 'WebCam Preview Demo' ; MAIN ; NOMAXIMIZE NOSIZE ; ON INIT ( wPost(3), wPost(3) ) ; // capture initialization ON RELEASE CloseWebCam() ; ON RESTORE ( wPost(3), wPost(3) ) ; // capture initialization (This.Object):Event( 1, {| | CreateWebCam() }) (This.Object):Event( 2, {| | CloseWebCam(), ; This.Image_1.hBitmap := Nil }) (This.Object):Event( 3, {| | CaptureImage() }) (This.Object):Event( 9, {|ow| ow:Release() }) @ 20,60 WEBCAM WebCam_1 ; WIDTH 250 HEIGHT 210 ; RATE 20 ; START DEFINE IMAGE Image_1 ROW 120 COL 280 WIDTH 150 HEIGHT 110 STRETCH .T. END IMAGE DEFINE BUTTON Button_1 ROW 10 COL 20 WIDTH 120 CAPTION 'Start WebCam' ACTION wPost(1) // CreateWebCam() END BUTTON DEFINE BUTTON Button_2 ROW 10 COL 150 WIDTH 120 CAPTION 'Stop WebCam' ACTION wpost(2) // CloseWebCam() END BUTTON DEFINE BUTTON Button_3 ROW 80 COL 315 WIDTH 80 CAPTION 'Capture' ACTION wPost(3) // CaptureImage() END BUTTON DEFINE LABEL Label_1 ROW 59 COL 19 WIDTH 252 HEIGHT 212 BORDER .T. END LABEL DEFINE LABEL Label_2 ROW 119 COL 279 WIDTH 152 HEIGHT 112 BORDER .T. END LABEL ON KEY ESCAPE ACTION wPost(9) // ThisWindow.Release END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return *-----------------------------------------------------------------------------* FUNC wPost( nEvent, nIndex ) *-----------------------------------------------------------------------------* (ThisWindow.Object):PostMsg(nEvent, nIndex) DO EVENTS RETURN Nil *-----------------------------------------------------------------------------* FUNC wSend( nEvent, nIndex ) *-----------------------------------------------------------------------------* (ThisWindow.Object):SendMsg(nEvent, nIndex) DO EVENTS RETURN Nil ... [/pre2]

SergKis: PS пропустил, вместо ON RELEASE CloseWebCam() ; надо ON RELEASE wPost(2) ; и (This.Object):Event( 1, {| | CreateWebCam(), wPost(3) })

SergKis: Плюс в пример пульт управления [pre2] *-----------------------------------------------------------------------------* Procedure Main *-----------------------------------------------------------------------------* SET OOP ON IF StatusOk != GdiplusInitExt( _GDI_GRAPHICS ) MsgStop( "Init GDI+ Error", "Error" ) RETURN ENDIF _GdiplusInitLocal() DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 440 + GetBorderWidth() ; HEIGHT 300 + GetTitleHeight() + GetBorderHeight() ; TITLE 'WebCam Preview Demo' ; MAIN ; NOMAXIMIZE NOSIZE ; ON INIT ( wPost(3), wPost(3) ) ; // capture initialization ON RELEASE wPost(2) ; ON RESTORE ( wPost(3), wPost(3) ) ; // capture initialization (This.Object):Event( 1, {| | CreateWebCam(), wPost(3) }) // +capture initialization (This.Object):Event( 2, {| | CloseWebCam(), ; This.Image_1.hBitmap := Nil }) (This.Object):Event( 3, {| | CaptureImage() }) (This.Object):Event( 4, {|ow| RemoteControl(ow) }) (This.Object):Event( 9, {|ow| ow:Release() }) @ 20,60 WEBCAM WebCam_1 ; WIDTH 250 HEIGHT 210 ; RATE 20 ; START DEFINE IMAGE Image_1 ROW 120 COL 280 WIDTH 150 HEIGHT 110 STRETCH .T. END IMAGE DEFINE BUTTON Button_1 ROW 10 COL 20 WIDTH 120 CAPTION 'Start WebCam' ACTION wPost(1) // CreateWebCam() END BUTTON DEFINE BUTTON Button_2 ROW 10 COL 150 WIDTH 120 CAPTION 'Stop WebCam' ACTION wPost(2) // CloseWebCam() END BUTTON DEFINE BUTTON Button_3 ROW 80 COL 315 WIDTH 80 CAPTION 'Capture' ACTION wPost(3) // CaptureImage() END BUTTON DEFINE LABEL Label_1 ROW 59 COL 19 WIDTH 252 HEIGHT 212 BORDER .T. END LABEL DEFINE LABEL Label_2 ROW 119 COL 279 WIDTH 152 HEIGHT 112 BORDER .T. END LABEL DEFINE BUTTON Button_4 ROW This.Label_2.Row + This.Label_2.Height + 10 COL This.Label_2.Col + 40 WIDTH 80 CAPTION 'Remote' ACTION wPost(4) // RemoteControl() END BUTTON ON KEY ESCAPE ACTION wPost(9) // ThisWindow.Release END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return *-----------------------------------------------------------------------------* FUNC wPost( nEvent, nIndex ) *-----------------------------------------------------------------------------* (ThisWindow.Object):PostMsg(nEvent, nIndex) DO EVENTS RETURN Nil *-----------------------------------------------------------------------------* FUNC wSend( nEvent, nIndex ) *-----------------------------------------------------------------------------* (ThisWindow.Object):SendMsg(nEvent, nIndex) DO EVENTS RETURN Nil *-----------------------------------------------------------------------------* STATIC FUNC RemoteControl( oWnd ) *-----------------------------------------------------------------------------* LOCAL nY := 10, nX := 20, nW := 120 DEFINE WINDOW Pult ; AT App.Row + App.Height + 2 + GetBorderHeight(), App.Col ; WIDTH App.Width ; HEIGHT 50 + GetTitleHeight() + GetBorderHeight() ; TITLE 'Remote Control' ; MODAL NOSIZE; ON RELEASE Nil (This.Object):Event( 1, {| | oWnd:PostMsg(1) }) (This.Object):Event( 2, {| | oWnd:PostMsg(2) }) (This.Object):Event( 3, {| | oWnd:PostMsg(3) }) (This.Object):Event( 9, {|ow| ow:Release() }) DEFINE BUTTON Button_1 ROW nY COL nX WIDTH nW CAPTION 'Start WebCam' ACTION wPost(1) // CreateWebCam() END BUTTON nX += This.Button_1.Width + 10 DEFINE BUTTON Button_2 ROW nY COL nX WIDTH nW CAPTION 'Stop WebCam' ACTION wPost(2) // CloseWebCam() END BUTTON nX += This.Button_2.Width + 10 DEFINE BUTTON Button_3 ROW nY COL nX WIDTH nW CAPTION 'Capture' ACTION wPost(3) // CaptureImage() END BUTTON ON KEY ESCAPE ACTION wPost(9) // ThisWindow.Release END WINDOW ACTIVATE WINDOW Pult RETURN Nil [/pre2]

Dima: SergKis Пример понятен. Спасибо. Не понятно почему без такого подхода глючил Image_1 на Form_1 Ведь не должен. Ведь в других примерах с IMAGE , при сворачивании окна и последующем поднятии ни чего ведь не глючит.....

SergKis: Dima пишет Ведь не должен. Надо расставить DO EVENTS и заработает, очередь не успевает обработаться, сообщения теряются. Я не хотел лезть во все функции, потому перевел пример на SET OOP ON. Подправил родной пример, вроде пошел [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2011-2017 Grigory Filatov <gfilatov@inbox.ru> */ #include "minigui.ch" #include "hbgdip.ch" *-----------------------------------------------------------------------------* Procedure Main *-----------------------------------------------------------------------------* IF StatusOk != GdiplusInitExt( _GDI_GRAPHICS ) MsgStop( "Init GDI+ Error", "Error" ) RETURN ENDIF _GdiplusInitLocal() DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 440 + GetBorderWidth() ; HEIGHT 300 + GetTitleHeight() + GetBorderHeight() ; TITLE 'WebCam Preview Demo' ; MAIN ; NOMAXIMIZE NOSIZE ; ON INIT ( ; CaptureImage() ; // capture initialization ) ; ON RELEASE ( ; CloseWebCam() ; ) ; ON RESTORE ( ; CaptureImage() ; // capture initialization ) @ 20,60 WEBCAM WebCam_1 ; WIDTH 250 HEIGHT 210 ; RATE 20 ; START DEFINE IMAGE Image_1 ROW 120 COL 280 WIDTH 150 HEIGHT 110 STRETCH .T. END IMAGE DEFINE BUTTON Button_1 ROW 10 COL 20 WIDTH 120 CAPTION 'Start WebCam' ACTION CreateWebCam() END BUTTON DEFINE BUTTON Button_2 ROW 10 COL 150 WIDTH 120 CAPTION 'Stop WebCam' ACTION CloseWebCam() END BUTTON DEFINE BUTTON Button_3 ROW 80 COL 315 WIDTH 80 CAPTION 'Capture' ACTION CaptureImage() END BUTTON DEFINE LABEL Label_1 ROW 59 COL 19 WIDTH 252 HEIGHT 212 BORDER .T. END LABEL DEFINE LABEL Label_2 ROW 119 COL 279 WIDTH 152 HEIGHT 112 BORDER .T. END LABEL ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return *-----------------------------------------------------------------------------* Procedure CreateWebCam *-----------------------------------------------------------------------------* If ! IsControlDefined( WebCam_1, Form_1 ) @ 20,60 WEBCAM WebCam_1 OF Form_1 ; WIDTH 250 HEIGHT 210 ; RATE 20 Form_1.WebCam_1.Start() DO EVENTS Form_1.Button_3.Enabled := .T. EndIf Return *-----------------------------------------------------------------------------* Procedure CloseWebCam *-----------------------------------------------------------------------------* If IsControlDefined( WebCam_1, Form_1 ) Form_1.WebCam_1.Release() DO EVENTS Form_1.Button_3.Enabled := .F. EndIf Return *-----------------------------------------------------------------------------* Procedure CaptureImage *-----------------------------------------------------------------------------* Local hBitmap Local nWidth Local nHeight If cap_EditCopy( GetControlHandle ( 'WebCam_1', 'Form_1' ) ) DO EVENTS nWidth := GetProperty( "Form_1", "Image_1", "Width" ) nHeight := GetProperty( "Form_1", "Image_1", "Height" ) hBitmap := LoadFromClpbrd( GetFormHandle( 'Form_1' ), nWidth, nHeight ) DO EVENTS If !Empty( hBitmap ) Form_1.Image_1.hBitmap := hBitmap System.Clipboard := "" DO EVENTS gPlusSaveHBitmapToFile( hBitmap, "webcam.png", nWidth, nHeight, "image/png", 100 ) DO EVENTS EndIf Else MsgAlert( 'Capture is failure!', 'Error' ) EndIf Return #define CF_BITMAP 2 *-----------------------------------------------------------------------------* Static Function LoadFromClpbrd( hWnd, w, h ) *-----------------------------------------------------------------------------* Local hBmp If OpenClipboard( hWnd ) hBmp := GetClipboardData( CF_BITMAP, w, h ) CloseClipboard() DO EVENTS EndIf Return( hBmp ) #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HBITMAP StretchBitmap( HBITMAP hbmpSrc, int New_Width, int New_Height ) { HBITMAP hbmpOldSrc, hbmpOldDest, hbmpNew; HDC hdcSrc, hdcDest; BITMAP bmp; POINT Point; hdcSrc = CreateCompatibleDC( NULL ); hdcDest = CreateCompatibleDC( hdcSrc ); GetObject( hbmpSrc, sizeof( BITMAP ), &bmp ); hbmpOldSrc = (HBITMAP) SelectObject( hdcSrc, hbmpSrc ); hbmpNew = CreateCompatibleBitmap( hdcSrc, New_Width, New_Height ); hbmpOldDest = (HBITMAP) SelectObject( hdcDest, hbmpNew ); GetBrushOrgEx( hdcDest, &Point ); SetStretchBltMode( hdcDest, HALFTONE ); SetBrushOrgEx( hdcDest, Point.x, Point.y, NULL ); StretchBlt( hdcDest, 0, 0, New_Width, New_Height, hdcSrc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SelectObject( hdcDest, hbmpOldDest ); SelectObject( hdcSrc, hbmpOldSrc ); DeleteDC( hdcDest ); DeleteDC( hdcSrc ); return hbmpNew; } HB_FUNC( CLOSECLIPBOARD ) { hb_retl( CloseClipboard() ); } HB_FUNC( OPENCLIPBOARD ) { hb_retl( OpenClipboard( ( HWND ) hb_parnl( 1 ) ) ) ; } HB_FUNC( GETCLIPBOARDDATA ) { WORD wType = hb_parni( 1 ); HGLOBAL hMem; switch( wType ) { case CF_TEXT: hMem = GetClipboardData( CF_TEXT ); if( hMem ) { hb_retc( ( char * ) GlobalLock( hMem ) ); GlobalUnlock( hMem ); } else hb_retc( "" ); break; case CF_BITMAP: if( IsClipboardFormatAvailable( CF_BITMAP ) ) hb_retnl( ( LONG ) StretchBitmap( ( HBITMAP ) GetClipboardData( CF_BITMAP ), hb_parni( 2 ), hb_parni( 3 ) ) ); else hb_retnl( 0 ); } } #pragma ENDDUMP ////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP /* * This source file is part of the hbGdiPlus library source * Copyright 2007-2017 P.Chornyj <myorg63@mail.ru> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include <mgdefs.h> #include "hbapiitm.h" #ifndef __XHARBOUR__ # include "hbwinuni.h" #else typedef wchar_t HB_WCHAR; #endif typedef enum { Ok = 0, GenericError = 1, InvalidParameter = 2, OutOfMemory = 3, ObjectBusy = 4, InsufficientBuffer = 5, NotImplemented = 6, Win32Error = 7, WrongState = 8, Aborted = 9, FileNotFound = 10, ValueOverflow = 11, AccessDenied = 12, UnknownImageFormat = 13, FontFamilyNotFound = 14, FontStyleNotFound = 15, NotTrueTypeFont = 16, UnsupportedGdiplusVersion = 17, GdiplusNotInitialized = 18, PropertyNotFound = 19, PropertyNotSupported = 20, } GpStatus; typedef struct { CLSID Clsid; GUID FormatID; const unsigned short * CodecName; const unsigned short * DllName; const unsigned short * FormatDescription; const unsigned short * FilenameExtension; const unsigned short * MimeType; ULONG Flags; ULONG Version; ULONG SigCount; ULONG SigSize; const unsigned char * SigPattern; const unsigned char * SigMask; } ImageCodecInfo; typedef struct { GUID Guid; ULONG NumberOfValues; ULONG Type; void * Value; } ENCODER_PARAMETER; typedef struct { unsigned int Count; ENCODER_PARAMETER Parameter[ 1 ]; } EncoderParameters; #define WINGDIPAPI __stdcall #define GDIPCONST const typedef DWORD ARGB; typedef void GpBitmap; typedef void GpImage; #ifndef IStream typedef struct IStream IStream; #endif typedef GpStatus ( WINGDIPAPI * GetThumbnailImageAbort )( void * ); typedef GpStatus ( WINGDIPAPI * GdipCreateBitmapFromFile_ptr )( GDIPCONST HB_WCHAR *, GpBitmap ** ); typedef GpStatus ( WINGDIPAPI * GdipCreateHBITMAPFromBitmap_ptr )( GpBitmap *, HBITMAP *, ARGB ); typedef GpStatus ( WINGDIPAPI * GdipCreateBitmapFromResource_ptr )( HINSTANCE, GDIPCONST HB_WCHAR *, GpBitmap ** ); typedef GpStatus ( WINGDIPAPI * GdipCreateBitmapFromStream_ptr )( IStream *, GpBitmap ** ); typedef GpStatus ( WINGDIPAPI * GdipDisposeImage_ptr )( GpImage * ); #define EXTERN_FUNCPTR( name ) extern name##_ptr fn_##name #define DECLARE_FUNCPTR( name ) name##_ptr fn_##name = NULL #define ASSIGN_FUNCPTR( module, name ) fn_##name = ( name##_ptr )GetProcAddress( module, #name ) #define _EMPTY_PTR( module, name ) NULL == ( ASSIGN_FUNCPTR( module, name ) ) EXTERN_FUNCPTR( GdipCreateBitmapFromFile ); EXTERN_FUNCPTR( GdipCreateBitmapFromResource ); EXTERN_FUNCPTR( GdipCreateBitmapFromStream ); EXTERN_FUNCPTR( GdipCreateHBITMAPFromBitmap ); EXTERN_FUNCPTR( GdipDisposeImage ); typedef GpStatus ( WINGDIPAPI * GdipGetImageEncodersSize_ptr )( UINT * numEncoders, UINT * size ); typedef GpStatus ( WINGDIPAPI * GdipGetImageEncoders_ptr )( UINT numEncoders, UINT size, ImageCodecInfo * encoders ); typedef GpStatus ( WINGDIPAPI * GdipGetImageThumbnail_ptr )( GpImage * image, UINT thumbWidth, UINT thumbHeight, GpImage ** thumbImage, GetThumbnailImageAbort callback, VOID * callbackData ); typedef GpStatus ( WINGDIPAPI * GdipCreateBitmapFromHBITMAP_ptr )( HBITMAP hbm, HPALETTE hpal, GpBitmap ** bitmap ); typedef GpStatus ( WINGDIPAPI * GdipSaveImageToFile_ptr )( GpImage * image, GDIPCONST HB_WCHAR * filename, GDIPCONST CLSID * clsidEncoder, GDIPCONST EncoderParameters * encoderParams ); DECLARE_FUNCPTR( GdipGetImageEncodersSize ); DECLARE_FUNCPTR( GdipGetImageEncoders ); DECLARE_FUNCPTR( GdipGetImageThumbnail ); DECLARE_FUNCPTR( GdipCreateBitmapFromHBITMAP ); DECLARE_FUNCPTR( GdipSaveImageToFile ); BOOL SaveHBitmapToFile( void * HBitmap, const char * FileName, unsigned int Width, unsigned int Height, const char * MimeType, ULONG JpgQuality ); extern HMODULE g_GpModule; unsigned char * MimeTypeOld; /* * GDI+ Local Init */ static GpStatus _LoadExt( void ) { if( NULL == g_GpModule ) return FALSE; if( _EMPTY_PTR( g_GpModule, GdipGetImageEncodersSize ) ) return NotImplemented; if( _EMPTY_PTR( g_GpModule, GdipGetImageEncoders ) ) return NotImplemented; if( _EMPTY_PTR( g_GpModule, GdipCreateBitmapFromHBITMAP ) ) return NotImplemented; if( _EMPTY_PTR( g_GpModule, GdipSaveImageToFile ) ) return NotImplemented; if( _EMPTY_PTR( g_GpModule, GdipGetImageThumbnail ) ) return NotImplemented; return TRUE; } HB_FUNC( _GDIPLUSINITLOCAL ) { hb_retl( Ok != _LoadExt() ? HB_TRUE : HB_FALSE ); } /* * Get encoders */ HB_FUNC( GPLUSGETENCODERSNUM ) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes fn_GdipGetImageEncodersSize( &num, &size ); hb_retni( num ); } HB_FUNC( GPLUSGETENCODERSSIZE ) { UINT num = 0; UINT size = 0; fn_GdipGetImageEncodersSize( &num, &size ); hb_retni( size ); } HB_FUNC( GPLUSGETENCODERSMIMETYPE ) { UINT num = 0; UINT size = 0; UINT i; ImageCodecInfo * pImageCodecInfo; PHB_ITEM pResult = hb_itemArrayNew( 0 ); PHB_ITEM pItem; char * RecvMimeType; fn_GdipGetImageEncodersSize( &num, &size ); if( size == 0 ) { hb_itemReturnRelease( pResult ); return; } pImageCodecInfo = ( ImageCodecInfo * ) hb_xalloc( size ); if( pImageCodecInfo == NULL ) { hb_itemReturnRelease( pResult ); return; } RecvMimeType = LocalAlloc( LPTR, size ); if( RecvMimeType == NULL ) { hb_xfree( pImageCodecInfo ); hb_itemReturnRelease( pResult ); return; } fn_GdipGetImageEncoders( num, size, pImageCodecInfo ); pItem = hb_itemNew( NULL ); for( i = 0; i < num; ++i ) { WideCharToMultiByte( CP_ACP, 0, pImageCodecInfo[ i ].MimeType, -1, RecvMimeType, size, NULL, NULL ); pItem = hb_itemPutC( NULL, RecvMimeType ); hb_arrayAdd( pResult, pItem ); } // free resource LocalFree( RecvMimeType ); hb_xfree( pImageCodecInfo ); hb_itemRelease( pItem ); // return a result array hb_itemReturnRelease( pResult ); } static BOOL GetEnCodecClsid( const char * MimeType, CLSID * Clsid ) { UINT num = 0; UINT size = 0; ImageCodecInfo * pImageCodecInfo; UINT CodecIndex; char * RecvMimeType; BOOL bFounded = FALSE; hb_xmemset( Clsid, 0, sizeof( CLSID ) ); if( ( MimeType == NULL ) || ( Clsid == NULL ) || ( g_GpModule == NULL ) ) return FALSE; if( fn_GdipGetImageEncodersSize( &num, &size ) ) return FALSE; if( ( pImageCodecInfo = hb_xalloc( size ) ) == NULL ) return FALSE; hb_xmemset( pImageCodecInfo, 0, sizeof( ImageCodecInfo ) ); if( fn_GdipGetImageEncoders( num, size, pImageCodecInfo ) || ( pImageCodecInfo == NULL ) ) { hb_xfree( pImageCodecInfo ); return FALSE; } if( ( RecvMimeType = LocalAlloc( LPTR, size ) ) == NULL ) { hb_xfree( pImageCodecInfo ); return FALSE; } for( CodecIndex = 0; CodecIndex < num; ++CodecIndex ) { WideCharToMultiByte( CP_ACP, 0, pImageCodecInfo[ CodecIndex ].MimeType, -1, RecvMimeType, size, NULL, NULL ); if( strcmp( MimeType, RecvMimeType ) == 0 ) { bFounded = TRUE; break; } } if( bFounded ) CopyMemory( Clsid, &pImageCodecInfo[ CodecIndex ].Clsid, sizeof( CLSID ) ); hb_xfree( pImageCodecInfo ); LocalFree( RecvMimeType ); return bFounded ? TRUE : FALSE; } /* * Save bitmap to file */ HB_FUNC( GPLUSSAVEHBITMAPTOFILE ) { HBITMAP hbmp = ( HBITMAP ) hb_parnl( 1 ); hb_retl( SaveHBitmapToFile( ( void * ) hbmp, hb_parc( 2 ), ( UINT ) hb_parnl( 3 ), ( UINT ) hb_parnl( 4 ), hb_parc( 5 ), ( ULONG ) hb_parnl( 6 ) ) ); } BOOL SaveHBitmapToFile( void * HBitmap, const char * FileName, unsigned int Width, unsigned int Height, const char * MimeType, ULONG JpgQuality ) { void * GBitmap; void * GBitmapThumbnail; LPWSTR WFileName; static CLSID Clsid; EncoderParameters EncoderParameters; if( ( HBitmap == NULL ) || ( FileName == NULL ) || ( MimeType == NULL ) || ( g_GpModule == NULL ) ) { MessageBox( NULL, "Wrong Param", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } if( MimeTypeOld == NULL ) { if( ! GetEnCodecClsid( MimeType, &Clsid ) ) { MessageBox( NULL, "Wrong MimeType", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } MimeTypeOld = LocalAlloc( LPTR, strlen( MimeType ) + 1 ); if( MimeTypeOld == NULL ) { MessageBox( NULL, "LocalAlloc Error", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } strcpy( MimeTypeOld, MimeType ); } else { if( strcmp( MimeTypeOld, MimeType ) != 0 ) { LocalFree( MimeTypeOld ); if( ! GetEnCodecClsid( MimeType, &Clsid ) ) { MessageBox( NULL, "Wrong MimeType", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } MimeTypeOld = LocalAlloc( LPTR, strlen( MimeType ) + 1 ); if( MimeTypeOld == NULL ) { MessageBox( NULL, "LocalAlloc Error", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } strcpy( MimeTypeOld, MimeType ); } } ZeroMemory( &EncoderParameters, sizeof( EncoderParameters ) ); EncoderParameters.Count = 1; EncoderParameters.Parameter[ 0 ].Guid.Data1 = 0x1d5be4b5; EncoderParameters.Parameter[ 0 ].Guid.Data2 = 0xfa4a; EncoderParameters.Parameter[ 0 ].Guid.Data3 = 0x452d; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 0 ] = 0x9c; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 1 ] = 0xdd; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 2 ] = 0x5d; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 3 ] = 0xb3; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 4 ] = 0x51; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 5 ] = 0x05; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 6 ] = 0xe7; EncoderParameters.Parameter[ 0 ].Guid.Data4[ 7 ] = 0xeb; EncoderParameters.Parameter[ 0 ].NumberOfValues = 1; EncoderParameters.Parameter[ 0 ].Type = 4; EncoderParameters.Parameter[ 0 ].Value = ( void * ) &JpgQuality; GBitmap = 0; if( fn_GdipCreateBitmapFromHBITMAP( HBitmap, NULL, &GBitmap ) ) { MessageBox( NULL, "CreateBitmap Operation Error", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } WFileName = LocalAlloc( LPTR, ( strlen( FileName ) * sizeof( WCHAR ) ) + 1 ); if( WFileName == NULL ) { MessageBox( NULL, "WFile LocalAlloc Error", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } MultiByteToWideChar( CP_ACP, 0, FileName, -1, WFileName, ( strlen( FileName ) * sizeof( WCHAR ) ) - 1 ); if( ( Width > 0 ) && ( Height > 0 ) ) { GBitmapThumbnail = NULL; if( Ok != fn_GdipGetImageThumbnail( GBitmap, Width, Height, &GBitmapThumbnail, NULL, NULL ) ) { fn_GdipDisposeImage( GBitmap ); LocalFree( WFileName ); MessageBox( NULL, "Thumbnail Operation Error", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } fn_GdipDisposeImage( GBitmap ); GBitmap = GBitmapThumbnail; } if( Ok != fn_GdipSaveImageToFile( GBitmap, WFileName, &Clsid, &EncoderParameters ) ) { fn_GdipDisposeImage( GBitmap ); LocalFree( WFileName ); MessageBox( NULL, "Save Operation Error", "GPlus error", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL ); return FALSE; } fn_GdipDisposeImage( GBitmap ); LocalFree( WFileName ); return TRUE; } #pragma ENDUMP[/pre2]

Dima: SergKis пишет: Надо расставить DO EVENTS и заработает, очередь не успевает обработаться, сообщения теряются. Понял тебя. Есть еще вопрос. Имеем запись в файл gPlusSaveHBitmapToFile( hBitmap, "webcam.jpg", nWidth, nHeight, "image/jpeg", 100 ) (переделал на JPG) Хотелка: что бы в качестве nWidth и nHeight подставлялись значения исходя из максимального разрешения самой камеры. Как то можно дернуть характеристики камеры ?

Dima: Пробнул тест снятия скриншота математикой что шла с камерой. Фоткал документ. На выходе получил картинку с разрешением 2048 на 1536. Текст довольно читаем. Попробовал сделать скриншот с помощью webcam_2 где в LoadFromClpbrd подправил nWidth, nHeight на 2048 и 1536 И в gPlusSaveHBitmapToFile тоже подправил nWidth, nHeight на 2048 и 1536. Текст на картине получил не такой читаемый и расплывчатый. С 6-м параметром в gPlusSaveHBitmapToFile , игрался , не помогает. Разве что ухудшить можно качество делая его меньше 100. Больше 100 , не пашет и видимо и не должно. В чем прикол ? Еще поигрался и вроде все дело в cap_EditCopy , именно она ложит в буфер такое корявое изображение. Поставил паузу после cap_EditCopy и слямздил из буфера картинку в PAINT , так и есть.......

Dima: Может кто то портировать в Harbour функцию capSetVideoFormat ?

gfilatov2002: Dima пишет: портировать в Harbour функцию capSetVideoFormat Лови [pre]#pragma BEGINDUMP #include <hbapi.h> #include <windows.h> #include <vfw.h> #if defined( __BORLANDC__ ) #pragma warn -use /* unused var */ #endif HB_FUNC( CAPSETVIDEOFORMAT ) { BITMAPINFO binf; HWND hCapWnd = (HWND) hb_parnl(1); capGetVideoFormat(hCapWnd, &binf, sizeof(BITMAPINFO)); binf.bmiHeader.biWidth = hb_parni(2); binf.bmiHeader.biHeight = hb_parni(3); binf.bmiHeader.biPlanes = 1; binf.bmiHeader.biBitCount = 24; binf.bmiHeader.biCompression = BI_RGB; binf.bmiHeader.biSizeImage = 0; binf.bmiHeader.biClrUsed = 0; binf.bmiHeader.biClrImportant = 0; hb_retl( capSetVideoFormat(hCapWnd, &binf, sizeof(BITMAPINFO)) ); } #pragma ENDDUMP [/pre] Использовать : capSetVideoFormat(This.WebCam_1.Handle, 640, 480)

Dima: gfilatov2002 Спасибо Странный меседж получил во время сборки Warning W8019 demo.prg 784: Code has no effect in function HB_FUN_CAPSETVIDEOFORMAT

gfilatov2002: Dima пишет: Warning W8019 Просто добавь подавление этого предупреждения; #pragma BEGINDUMP #include <hbapi.h> #include <windows.h> #include <vfw.h> #if defined( __BORLANDC__ ) #pragma warn -use /* unused var */ #pragma warn -eff /* no effect */ #endif ...

Dima: Поменяли вебкамеру на Logitech c920 , разрешение у нее конечно приличное по сравнению c270. Поменял разрешение с помощью capSetVideoFormat на 2304 x 1536 и оба примера WEBCAM и WEBCAM_2 начали жутко тормозить , когда иногда удается нажать кнопку снять капчу , то картинка реально нормальная , правда размер в BMP (если) , то почти 11 метров ))) Попробовал фокус с https://github.com/michael4jonas/capcam , снимает норм и тормозов таких нет. Запускал командой capcam.exe 0 -r18 -fjpg -odd2.jpg Где r18 ( 18: 2304 x 1536) PS Что то не пруха с этой камерой ))

Dima: Dima пишет: Поменял разрешение с помощью capSetVideoFormat Кажись этого и не надо было делать так как тормоза....... А надо юзать capCaptureSetSetup (а может и нет) , но понятно что с её написанием ни кто не поможет :) Хотелось бы что б видео как отображалось так и отображается а вот что бы Капча снялась с нужным разрешением и не 640 на 480 (и не преобразованное из 640 на 480 в большее)

Haz: Dima пишет: о понятно что с её написанием ни кто не поможет Ну прям и никто Сюда глянь http://forums.fivetechsupport.com/viewtopic.php?t=5695 там есть это и многое другое [pre2] HB_FUNC( CAPCAPTURESETSETUP ) { CAPTUREPARMS Capture; hb_retl( capCaptureSetSetup( (HWND) hb_parnl( 1 ), &Capture, sizeof( CAPTUREPARMS ) )); } [/pre2]

Andrey: Использую функцию из МиниГуи CreateFolder(). Проблем не было. Но под работой Win2008 Server не удаётся создать папку для пользователя. Как получить код ошибки для этой функции ? Или нужно делать старый клиперовский вариант MakeDir(), где есть обработка ошибок. Или можно использовать DosError() и всё ? Мне просто проверить негде такую ситуацию.

PSP: Andrey пишет: под работой Win2008 Server не удаётся создать папку для пользователя Где пытаешься создать папку?

Andrey: PSP пишет: Где пытаешься создать папку? Функция GetUserTempFolder() по пути C:\Users\ЮЗЕР\AppData\Local\Temp У всех нормально, а у этого сервера ошибка - папку не создаёт !

Pasha: Наверное надо сделать обертку для GetLastError() Примерно так: [pre2]HB_FUNC( GETLASTERROR ) { hb_retnl( GetLastError() ); }[/pre2]

Andrey: Pasha пишет: Наверное надо сделать обертку для GetLastError() А в МиниГуи нет разве стандартной обработки для функций типа CreateFolder() ?

Pasha: CreateFolder() возвращает логическое значение. При неудаче надо анализировать GetLastError, а обертки для нее похоже нет. Ее надо воткнуть куда-нибудь вроде c_winapimisc.c, можно в конец файла

Pasha: Andrey пишет: Или нужно делать старый клиперовский вариант MakeDir(), где есть обработка ошибок. С точки зрения winapi функции hb_dirCreate aka MakeDir и CreateFolder работают одинаково. Кроме анализа результата конечно. Так что лучше использовать MakeDir.

Andrey: Pasha пишет: Ее надо воткнуть куда-нибудь вроде c_winapimisc.c, можно в конец файла Спасибо БОЛЬШОЕ !

Andrey: Эта функция уже реализована в Харбор библиотеке hbwin под именем wapi_GetLastError () /Григорий/ Оказывается есть такая проверка ! Pasha пишет: Так что лучше использовать MakeDir. Да уже привык в МиниГуи писать везде CreateFolder().

Pasha: Andrey пишет: Эта функция уже реализована в Харбор библиотеке hbwin под именем wapi_GetLastError () Для minigui эта функция не прокатит. wapi_GetLastError возвращает код ошибки, которая возникла при выполнении другой функции из библиотеки hbwin. Эта функция должна установить ошибку вызовом hbwapi_SetLastError / wapi_SetLastError. Функции из minigui это не делают.

Vlad04: Я использую DISKCHANGE(Left(sDir,1)) DIRCHANGE(sDir) nErrorCode:=DIRMAKE(sTxt2) Это одно и тоже с MakeDir? Ошибки обрабатываются, т.е выдаются. Два раза одну и ту же директорию не создашь. А коды ошибок где почитать ?

Pasha: DirMake - это функция из ct. DiskChange/DirChange - функции харбора. Поскольку DirMake из ct, как и MakeDir из ядра харбора, реализованы через харборовский файловый api, то и обработка ошибок у них одинаковая. Функции из minigui - это отдельное независимое государство, даже если в конце концов они выполняют те же самые вызовы winapi, поэтому средства обработки ошибок харбора они не используют. Должны быть свои средства. Достаточно маленькой обертки для GetLastError.

Pasha: Pasha пишет: А коды ошибок где почитать ? Поскольку харбор многоплатформенный, то функция HB_OSERROR возвращает код ошибки соответствующей ОС, в нашем случае Windows. Эти коды надо искать в winapi Но есть еще функция DosError, которая транслирует коды ошибок каждой ОС в старые коды MS DOS.

Pasha: Кстати, можно легко интегрировать файловые функции minigui в harbour file api таким образом: HB_FUNC( CREATEFOLDER ) { // вместо // hb_retl( CreateDirectory( ( LPCTSTR ) hb_parc( 1 ), NULL ) ); hb_retl( hb_fsMkDir( hb_parc( 1 ) ) ); } тоже самое можно сделать еще с несколькими подобными функциями. Работать они будут так же, но появится возможность анализа ошибок стандартными средствами харбора.

gfilatov2002: Pasha пишет: Для minigui эта функция не прокатит. Спасибо за разъяснение этого вопроса Pasha пишет: воткнуть куда-нибудь вроде c_winapimisc.c Добавмл функцию-обертку GetLastError() в этот файл. Vlad04 пишет: коды ошибок где почитать ? Они есть в файле bcc55\include\error.h

Andrey: Вопрос возник... Можно ли показать прозрачный PNG-файл произвольной формы (допустип круг) сразу на рабочем столе ? Или на форме, только убрать (сделать невидимым) само окно, оставив картинку. Где то пример видел в библиотеке с вводом пароля, там окно было не стандартное, фигурное. Искал и не нашёл.

Dima: Andrey пишет: Искал и не нашёл. А искал вообще ? C:\MiniGUI\SAMPLES\BASIC\Login_2\ ЗЫ Как пить дать Андрей скажет что искал только по слову Pass

Andrey: Dima пишет: А искал вообще ? Все папки вручную перерыл. Помню, видел такой пример. Спасибо Дима !

Andrey: Всем привет ! Как можно получить размер PNG-файла из ресурсов ? Есть функция типа - GetImageSizeFromRes() ? Или нужно в коде выгрузить PNG-файл из ресурсов на диск, а потом уже узнавать размер файла: nResult := RCDataToFile( "IMAGE1", cDiskFile, "PNG" ) aSize := hb_GetImageSize( cDiskFile )

gfilatov2002: Andrey пишет: Как можно получить размер PNG-файла из ресурсов ? Это возможно сделать в примере из папки Basic\Login_2, если изменить функцию GetImageInfo() таким образом: [pre]FUNCTION GetImageInfo( cPicFile, nPicWidth, nPicHeight ) LOCAL hBitmap, aSize hBitmap := C_GetResPicture( cPicFile ) aSize := GetBitmapSize( hBitmap ) DeleteObject( hBitmap ) nPicWidth := aSize [1] nPicHeight := aSize [2] RETURN (nPicWidth > 0) // GetImageInfo() [/pre]

Andrey: gfilatov2002 пишет: если изменить функцию GetImageInfo() таким образом: Спасибо БОЛЬШОЕ ! Буду использовать ! Может всё таки добавите ЯВНО функцию в библиотеку, чтобы можно было потом ею пользоваться ? GetImageSizeFromRes() - понятное название функции. Вот такой код примерно - [pre2]FUNCTION GetImageSizeFromRes( cResName ) LOCAL cMsg, hBitmap, aSize := {0,0} hBitmap := C_GetResPicture( cResName ) aSize := GetBitmapSize( hBitmap ) DeleteObject( hBitmap ) If aSize[1] == 0 .OR. aSize[2] == 0 cMsg := "Calling from: " + ProcName(0) + "(" + hb_ntos(ProcLine(0)) + ") -> " + ProcFile(0) + CRLF + CRLF cMsg += "There is no such resource in the exe file!" + CRLF + CRLF cMsg += "Invalid name: " + cResName + CRLF + CRLF MsgStop( cMsg , "Error" ) endif RETURN aSize // GetImageSizeFromRes()[/pre2] Тем более встречал такое - METHOD GetImageSizeFromFile( ... )

Dima: Andrey пишет: Тем более встречал такое - METHOD GetImageSizeFromFile( ... ) Вероятно тут C:\MiniGUI\SAMPLES\Advanced\RMChart_DLL_2\

Haz: Dima пишет: Вероятно тут C:\MiniGUI\SAMPLES\Advanced\RMChart_DLL_2\ c DLL мутить не очень хочется ради одной функции. Тем более , что все и так есть причем в сырцах минмгуя MiniGUI\SOURCE\c_bitmap.c [pre2] HB_FUNC( HB_GETIMAGESIZE ) { int x = 0, y = 0; GetImageSize( hb_parcx( 1 ), &x, &y ); hb_reta( 2 ); HB_STORNI( x, -1, 1 ); HB_STORNI( y, -1, 2 ); } /* Harbour MiniGUI 1.3 Extended (Build 33) Author P.Chornyj Function BitmapSize() --------------------- Syntax BitmapSize( xBitmap ) --> aTarget Arguments <xBitmap> is the NAME of the bitmap file or resource or <xBitmap> is the handle to OBJ_BITMAP Returns BitmapSize() returns an array has the following structure: ---------------------------------------------------------- Position Metasymbol i_bitmap.ch ---------------------------------------------------------- 1 nWidth BM_WIDTH 2 nHeight BM_HEIGHT 3 nBitsPerPixel BM_BITSPIXEL ---------------------------------------------------------- If file or resource are not found or corrupt, or is not OBJ_BITMAP, BitmapSize returns an array {0, 0, 4} for compatibility */ [/pre2] Андрей предложил обертку для этого, но ведь функция читает не только из ресурса , и как минимум название предложенного это не отражает PS Причем , эта обертка всего лишь добавляет сообщение об ошибке PPS. Кроме того в библиотеке бостаурос есть аналоги ВT_BITMAPWIDTH и пр. Думаю плодить сущности не стоит, достаточно для работы.

Andrey: Всем привет ! Взял сделал свой пример на базе примера SAMPLES\BASIC\Login_2. В нём команда [pre2] SET WINDOW frmCheckUser TRANSPARENT TO COLOR aPicBackColor[/pre2] не компилируется... Выдаёт ошибку при компиляции. Harbour 3.2.0dev (r1803161710) Copyright (c) 1999-2018, https://harbour.github.io/ form_LoginPassw.prg(161) Error E0030 Syntax error "syntax error at 'WINDOW'" 1 error No code generated. Исправил на команду [pre2] SetLayeredWindowAttributes( GetFormHandle( "frmCheckUser" ), ( aPicBackColor[1] + ( aPicBackColor[2] * 256 ) + ( aPicBackColor[3] * 65536 ) ), 0, 0x01 )[/pre2] Компиляция прошла, всё работает... Одна незадача - чёрный цвет вообще пропал, стал прозрачным. Поменял черный цвет на темно-синий. Терпимо. Окантовка кнопок на форме черная поменялась на прозрачную. Как менять окантовку кнопок на темно-синий не знаю как ... И вообще, можно ли изменить aPicBackColor := BLACK на другой цвет, который чаще всего не используется ? Допустим на FUCHSIA ? Но чтобы форма оставалась прозрачной !

PSP: Andrey пишет: SetLayeredWindowAttributes( GetFormHandle( "frmCheckUser" ), ( aPicBackColor[1] + ( aPicBackColor[2] * 256 ) + ( aPicBackColor[3] * 65536 ) ), 0, 0x01 ) Я не утверждаю, но может 255 и 65535 надо?

Dima: Andrey пишет: SetLayeredWindowAttributes( GetFormHandle( "frmCheckUser" ), ( aPicBackColor[1] + ( aPicBackColor[2] * 256 ) + ( aPicBackColor[3] * 65536 ) ), 0, 0x01 ) Что то не то ты намутил , примеры то смотрел ? По ходу если такое полупрозрачное окно будет лежать на других окнах с достаточно большим кол-вом контролов (например Tsbrowse как новогодняя ёлка) , то будут тормоза.

Andrey: Dima пишет: Что то не то ты намутил , примеры то смотрел ? Конечно смотрел. Dima пишет: По ходу если такое полупрозрачное окно будет лежать на других окнах с достаточно большим кол-вом контролов (например Tsbrowse как новогодняя ёлка) , то будут тормоза. Я одно окно использую, при логине в программу !

Dima: Andrey Так не устраивает ? #define LWA_ALPHA 0x02 SetLayeredWindowAttributes( GetFormHandle( "frmCheckUser" ) , 0, 150 , LWA_ALPHA )

Andrey: Dima пишет: Так не устраивает ? Нет, не то... Окно целиком видно, т.е. нет прозрачности и сама картинка блёклая выводится...

Andrey: Andrey пишет: И вообще, можно ли изменить aPicBackColor := BLACK на другой цвет, который чаще всего не используется ? Допустим на FUCHSIA ? Но чтобы форма оставалась прозрачной ! Оказывается это можно сделать (Григорий подсказал) ! Добавляем к примеру новую картинку и эти строчки:[pre2] // Другой вариант цветовой палитры для показа картинки без формы окна cPictFNm := "res\FolderLock2.png" aPicBackColor := FUCHSIA[/pre2] Картинку нужно исправить на такую:

Andrey: Опять баг нашёл. Или что-то неправильно делаю. Есть у меня окно для обновления программы. С главного меню вызывается нормально, а с другого меню нет вообще реакции, не вызывается окно. Что только не переделал, MsgDebug() показывается из окна обновления программы, а самого окна нет. Убился пока нашёл в чём дело. Размер высоты окна задаю через переменную: [pre2]nMaxHeight := GetProperty( "Form_Main", "Height" ) - 80[/pre2] В случае вызова окна обновления размер получается правильным, а в случае вызова из другого окна размер получается неправильным, равным -79 ???? Из-за этого окно это и не видно... Почему так ? Что я неправильно делаю ?

Andrey: Всем привет ! Подскажите пожалуйста: 1) Как из самой программы узнать имя - окна процесса, которое есть в диспетчере задач ? 2) Как это имя можно задать/изменить из программы ? Знаю, что это задаётся в ресурсном файле в секции: [pre2] VALUE "FileDescription", "Имя моей программы"[/pre2] 3) Почему в моей программе, я задаю имя MAIN окна, а в Диспетчере задач имя совсем другое - "MiniGUI Extended" ? вот картинка:

Andrey: gfilatov2002 пишет: Я написал для этого функцию FileVersInfo(), которая есть в примере Process Killer Используется она следующим образом: А кроме этого метода есть другие варианты, как узнать имя запущенной программы в Диспетчере задач ? Можно ли по хендлу окна определить Имя программы в Диспетчере задач ? Вот нашёл код для С++ (в самом конце страницы) https://rsdn.org/forum/winapi/2843651.all Кто поможет переделать под Харбор ?

Haz: Andrey пишет: Кто поможет переделать под Харбор ? Все давно переделано и описано в форуме http://clipper.borda.ru/?1-4-0-00001225-000-0-0 Плюс конечно же примеры Григория с его функцией GetExeName( HWND hWnd, char *szFileName )

Andrey: Haz пишет: Все давно переделано и описано в форуме Да не понял я как там написано. Кода нет полного или частичного. Читаешь что вы там писали и НИ ЧЕГО не понимаешь !!! Уровень ещё не тот... Haz пишет: Плюс конечно же примеры Григория с его функцией GetExeName( HWND hWnd, char *szFileName ) Но это же не совсем то что нужно. По пути запуска программы читать ехе-файл и вытаскивать из него имя программы (где то пишут процесса). Программа же загружена в памяти, есть хендл этой программы - вот и прочитать его нужно. Это же более правильно.



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