Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

SergKis: Петр пишет Это можно сделать и изящнее, см.BASIC\WindowProperty О вкусах не спорю. SET WINDOWPROPERTY "PROP_2" OF Win1 VALUE 2 SET WINDOWPROPERTY "PROP_3" OF Win1 VALUE 3.14 SET WINDOWPROPERTY "PROP_4" OF Win1 VALUE .T. SET WINDOWPROPERTY "PROP_5" OF Win1 VALUE Date() SetProp( Win1.Handle, "PROP_6", hb_serialize( { "One" => 1, 2 => "Two", "Today" => Date(), 5 => NIL, 6 => { .T., .F. } } ) ) а потом RELEASE WINDOWPROPERTY "PROP_2" OF Win1 RELEASE WINDOWPROPERTY "PROP_3" OF Win1 RELEASE WINDOWPROPERTY "PROP_4" OF Win1 RELEASE WINDOWPROPERTY "PROP_5" OF Win1 RELEASE WINDOWPROPERTY "PROP_6" OF Win1 Проходили с MDI интерфейсом - следить за что поставил, что снял - еще то занятие. Не понравилось и отказались. К примеру, если message входит в диапазон WM_USER.., оконная процедура с помощью GetProp получает связанный обьект и выполняет нужный метод или просто вызывает процедуру/выполняет блок кода, функция Events в этом случае не вызывается. Совершенно не возражаю, а даже был бы благодарен, за такую реализацию. Кто бы сделал. Был уже в истории такой период "hmg objects", чем закончился - не знаю Вроде была жива, но там тот же минус - база на _HMG_... переменных, обернутая в объекты (они сверху), не так как hwg (просто летает в сравнении, но там другое ...). А когда работают днями не выходя из проги (hmg), при больших кол-вах контролов и окон, становится заметнее прорисовки на глаз, что вызывает вопросы, у клиента, т.к. псевдо ООП крутит макро и ascan. "hmg objects" реализовывать не собираюсь, просто мне так привычнее, после VO (с C не очень дружу).

SergKis: gfilatov2002 пишет У меня сейчас эта функция выглядит так: Хотелось бы, чтобы объект получался и от Handle окна, не только от имени. Потому и изменения предложил.

Петр: SergKis пишет: Проходили с MDI интерфейсом - следить за что поставил, что снял - еще то занятие. Наверное вы проходили до включения в MiniGUI EnumProps(). Потому, что с EnumProps все эти манипуляции становятся рутинными.

SergKis: Петр пишет Наверное вы проходили до включения в MiniGUI EnumProps(). Потому, что с EnumProps все эти манипуляции становятся рутинными. Это был 2009 год. Добавив в окно простое _HMG_aFormMiscData1 - решили проблемы наращивания функционала"естественным" способом, аналогичный контролам hmg, т.е. поведение псвесдо объектов контролов и окон одинаково. Сами включали в свою версию EnumProc и это работало, пока не наткнулись (с разрастанием программы) на плавающий завис на нем. Убрали - все стало ok.

gfilatov2002: SergKis пишет: Хотелось бы, чтобы объект получался и от Handle окна, не только от имени. Не вопрос, уже переписал эту функцию так: [pre]*-----------------------------------------------------------------------------* FUNCTION _GetWindowObj( FormName ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) IF i > 0 RETURN _HMG_aFormMiscData1 [ i ][ 1 ] ENDIF RETURN NIL [/pre] И рабочий код для проверки [pre]@ 100,100 BUTTON Button_11 CAPTION "Click " WIDTH 100 HEIGHT 30 ; ACTION ( ThisWindow.Cargo := inputbox('Enter text' , 'New Title' , ; _GetWindowObj( ThisWindow.Handle ):Title ), ; ThisWindow.Title := (ThisWindow.Cargo) ) [/pre]

Петр: SergKis пишет: Сами включали в свою версию EnumProc и это работало, пока не наткнулись (с разрастанием программы) на плавающий завис на нем. Убрали - все стало ok. Я не видел сообщений об ошибке на этом форуме. К сожалению, это почти практика для пользователей MiniGUI - смастерить костыль, а не искать причину.

SergKis: Петр пишет смастерить костыль, а не искать причину. Когда костыль вылазит только у некоторых клиентов и случ. образом, как то не до практики искать истинную причину. А о сообщениях писать ... не всегда есть смыл. Писал я, что столкнулись, у клиентов, не работает совсем или частично уст. клавишь HotKey и что ... ? Переделали под себя на CLASS hmgBrowseKey, подсунули вместо HotKey и с 10-го работает как часы + в тсб KeyDown ... Как там было "Думать некогда, стучать надо."

SergKis: gfilatov2002 пишет уже переписал эту функцию так Пример может и так выглядеть. DEFINE WINDOW ... PRIVATE oWnd := _GetWindowObj(This.Name) ... ACTION ... oWnd:Title и так везде. Если в объект добавить ASSIGNы, то oWnd:Title := '...' с использованием WITH OBJECT oWnd :Title и т.д.

SergKis: gfilatov2002 Вариант с UserKeys на окно (TWndData на старом варианте) [pre2] FUNCTION GetProperty ( Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 ) CASE Arg2 == "CARGO" RetVal := _WindowCargo ( Arg1 ) CASE Arg2 == "OBJECT" RetVal := _GetWindowObj ( Arg1 ) i_this.ch line 48 // WINDOWS (THIS) #xtranslate This . <p:Title,NotifyIcon,NotifyTooltip,FocusedControl,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,HelpButton,Cargo,Object> => GetProperty ( _HMG_THISFORMNAME , <"p"> ) line 111 #xtranslate ThisWindow . <p:Title,NotifyIcon,NotifyTooltip,FocusedControl,BackColor,Name,Handle,Type,Index,Row,Col,Width,Height,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,Cargo,Object> => GetProperty ( _HMG_THISFORMNAME , <"p"> ) i_windows.ch line 63 #xtranslate <w> . \<p:Name,Handle,Type,Index,Title,Height,Width,ClientHeight,ClientWidth,Col,Row,NotifyIcon,NotifyToolTip,FocusedControl,BackColor,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Closable,Topmost,HelpButton,Cargo,Object\> => GetProperty ( <"w">, \<"p"\> ) ;; ////////////////////////////////////////////////////////////////////////////////////////////// CLASS TWndData PROTECTED: VAR cVar VAR cName VAR cType VAR nIndex VAR nHandle VAR nParent EXPORTED: VAR oUserKeys METHOD New( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::nIndex := nIndex, ::cName := cName, ::nHandle := nHandle, ; ::nParent := nParent, ::cType := cType, ::cVar := cVar, ; ::oUserKeys := TKeyData():New(), ; Self ) CONSTRUCTOR ACCESS Index INLINE ::nIndex ACCESS Name INLINE ::cName ACCESS Handle INLINE ::nHandle ACCESS Parent INLINE ::nParent ACCESS Type INLINE ::cType ACCESS VarName INLINE ::cVar ACCESS Row INLINE GetWindowRow ( ::nHandle ) ACCESS Col INLINE GetWindowCol ( ::nHandle ) ACCESS Width INLINE GetWindowWidth ( ::nHandle ) ACCESS Height INLINE GetWindowHeight( ::nHandle ) ACCESS ClientWidth INLINE _GetClientRect ( ::nHandle )[ 3 ] ACCESS ClientHeight INLINE _GetClientRect ( ::nHandle )[ 4 ] METHOD UserKeys( Key, Block ) INLINE iif( HB_ISBLOCK( Block ), ; ::oUserKeys:Set( Key, Block ), ; ::oUserKeys:Do ( Key, Block ) ) ENDCLASS ////////////////////////////////////////////////////////////////////////////////////////////// CLASS TKeyData PROTECTED: VAR oObj VAR aKey INIT hb_Hash() VAR bBlk EXPORTED: VAR Cargo METHOD New( o ) INLINE ( ::Obj := o, Self ) CONSTRUCTOR METHOD Set( Key, Block ) INLINE hb_HSet( ::aKey, Key, Block ) METHOD Get( Key ) INLINE hb_HGetDef( ::aKey, Key, Nil ) METHOD Del( Key ) INLINE iif( hb_hHasKey( ::aKey, Key ), hb_HDel( Key ), ) METHOD Do ( Key, Param ) INLINE ( ::bBlk := ::Get(Key), iif( HB_ISBLOCK(::bBlk), ; EVal(::bBlk, ::Obj, Key, Param), Nil ) ) ACCESS Obj INLINE ::oObj ASSIGN Obj( o ) INLINE ::oObj := iif( HB_ISOBJECT(o), o, Self ) ENDCLASS ////////////////////////////////////////////////////////////////////////////////////////////// Пример с :UserKeys дополнить ... ON RELEASE dbCloseAll() PRIV oWnd := This.Object oWnd:UserKeys('M_1_1', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_2', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_3', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_4', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_5', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_6', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_7', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_8', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_9', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_1_0', {| | ThisWindow.Release() }) oWnd:UserKeys('M_2_1', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_2_2', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_2_3', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) oWnd:UserKeys('M_3_1', {| | MsgBox( ( This.Name )+"|"+( ThisWindow.Name ) , oWnd:Name ) }) oWnd:UserKeys('M_3_2', {| | MsgBox( ( This.Name )+"|"+( ThisWindow.Name ) , oWnd:Name ) }) oWnd:UserKeys('M_3_3', {| | MsgBox( ( This.Name )+"|"+( ThisWindow.Name ) , oWnd:Name ) }) DEFINE MAIN MENU POPUP 'MENU_1' ITEM 'Item main menu 1.1' ACTION oWnd:UserKeys( This.Name, {3,2,1,0} ) NAME M_1_1 IMAGE 'n1' ITEM 'Item main menu 1.2' ACTION oWnd:UserKeys( This.Name, {1,2,3,4} ) NAME M_1_2 IMAGE 'n2' ITEM 'Item main menu 1.3' ACTION oWnd:UserKeys( This.Name, {'A','B'} ) NAME M_1_3 IMAGE 'n3' ITEM 'Item main menu 1.4' ACTION oWnd:UserKeys( This.Name, {'C'} ) NAME M_1_4 IMAGE 'n4' ITEM 'Item main menu 1.5' ACTION oWnd:UserKeys( This.Name ) NAME M_1_5 IMAGE 'n5' ITEM 'Item main menu 1.6' ACTION oWnd:UserKeys( This.Name ) NAME M_1_6 IMAGE 'n6' ITEM 'Item main menu 1.7' ACTION oWnd:UserKeys( This.Name ) NAME M_1_7 IMAGE 'n7' ITEM 'Item main menu 1.8' ACTION oWnd:UserKeys( This.Name ) NAME M_1_8 IMAGE 'n8' ITEM 'Item main menu 1.9' ACTION oWnd:UserKeys( This.Name ) NAME M_1_9 IMAGE 'n9' SEPARATOR ITEM 'Exit' ACTION oWnd:UserKeys( This.Name ) NAME M_1_0 END POPUP POPUP 'MENU_2' ITEM 'Item main menu 2.1' ACTION oWnd:UserKeys( This.Name, 2.1 ) NAME M_2_1 IMAGE 'n1' ITEM 'Item main menu 2.2' ACTION oWnd:UserKeys( This.Name, 2.2 ) NAME M_2_2 IMAGE 'n2' ITEM 'Item main menu 2.3' ACTION oWnd:UserKeys( This.Name, 2.3 ) NAME M_2_3 IMAGE 'n3' END POPUP POPUP 'MENU_3' ITEM 'Item main menu 3.1' ACTION oWnd:UserKeys( This.Name ) NAME M_3_1 IMAGE 'n1' ITEM 'Item main menu 3.2' ACTION oWnd:UserKeys( This.Name ) NAME M_3_2 IMAGE 'n2' ITEM 'Item main menu 3.3' ACTION oWnd:UserKeys( This.Name ) NAME M_3_3 IMAGE 'n3' END POPUP END MENU DEFINE STATUSBAR ... [/pre2]

SergKis: PS Если ACTION контрола не задам, по умолчанию, можно выполнять oWnd:UserKeys( This.Name ) Проще писать.

gfilatov2002: SergKis пишет: Вариант с UserKeys на окно Благодарю за помощь! Буду разбираться... P.S. Супер! Все работает как надо

SergKis: gfilatov2002 В пример по использованию Cargo добавьте строки [pre2] PRIV oWnd := This.Object oWnd:oUserKeys:Cargo := TKeyData():New() oWnd:oUserKeys:Cargo:Set(1, "Harbour") oWnd:oUserKeys:Cargo:Set(2, "MiniGui") oWnd:oUserKeys:Cargo:Set(3, "OK !") oWnd:UserKeys('M_1_1', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) }) ... oWnd:UserKeys('M_2_4', {|o | MsgBox( o:Cargo:Get(1)+" "+o:Cargo:Get(3) , This.Name ) }) oWnd:UserKeys('M_2_5', {|o | MsgBox( o:Cargo:Get(2)+" "+o:Cargo:Get(3) , This.Name ) }) [/pre2]

SergKis: PS. промахнулся по кнопке. Еще [pre2] ITEM 'Item main menu 2.3' ACTION oWnd:UserKeys( This.Name, 2.3 ) NAME M_2_3 IMAGE 'n3' ITEM 'Item main menu 2.4' ACTION oWnd:UserKeys( This.Name ) NAME M_2_4 IMAGE 'n4' ITEM 'Item main menu 2.5' ACTION oWnd:UserKeys( This.Name ) NAME M_2_5 IMAGE 'n5' [/pre2]

gfilatov2002: SergKis пишет: В пример по использованию Cargo Благодарю за Вашу помощь! Добавил такое описание в текущий changelog: [pre2] * New: Added the simple TWndData class for a storing of the windows data. There are the following access variables in the above class now: - Index, Name, Handle, ParentHandle, Type, VarName; - Title, Row, Col, Width, Height, ClientWidth, ClientHeight. Added the readonly property 'Object' for the all windows. Usage: - function syntax: oWin := GetProperty( ThisWindow.Name, "Object" ) - pseudo-OOP syntax: oWin := ThisWindow.Object MsgInfo( oWin:Title, oWin:Name ) Added the method UserKeys( Key, Block ) and the associated set/get TKeyData class for assigning and executing a codeblock for the objects. The above classes are guarded by the constant _DEBUG_ in the sources (look at minigui.ch in folder \include). Suggested and contributed by SergKis. (see demo in folder \samples\Advanced\Tsb_UserKeys) [/pre2] Всем пока - убегаю в отпуск

Петр: SergKis пишет: у клиентов, не работает совсем или частично уст. клавишь HotKey и что ... ? Это нормально, к Минигуи претензий не может быть никаких (почти). HotKey в библиотеке построены на RegisterHotKey(), описание которой с указанием причин отказа в регистрации можно легко найти в нете. К тому же HotKey system-wide. Вот интересно почему в MiniGUI не реализована поддержка акселераторов (accelerators)?

Петр: Ваше решение (UserKeys), базированное на WM_KEYDOWN, - это нормальное рабочее решение. Но вот что пишет msdn You could implement keyboard shortcuts by handling individual WM_KEYDOWN messages, but accelerator tables provide a better solution that: -Requires less coding; -Consolidates all of your shortcuts into one data file; -Supports localization into other languages; -Enables shortcuts and menu commands to use the same application logic.

Петр: Ограниченную поддержку акселераторов в MiniGUI организовать просто Пример (only Harbour): [pre2]/* * Harbour MiniGUI Accelerators Demo * (c) 2017 P.Ch. */ #include "minigui.ch" #include "i_winuser.ch" #include "demo.ch" MEMVAR hMenu, hAccel init procedure App_OnInit() PUBLIC hMenu := LoadMenu( Nil, 'MainMenu' ) PUBLIC hAccel := LoadAccelerators( Nil, 'FontAccel' ) if Empty( hAccel ) quit endif SetGlobalListener( 'App_OnEvents' ) return ////////////////////////////////////////////////////////////////////////////// function Main() DEFINE WINDOW Win_1 ; CLIENTAREA 400, 400 ; BACKCOLOR BLACK ; TITLE 'Accelerators Demo' ; MAIN ; ON INIT ; ( ; SetMenu( ThisWindow.Handle, hMenu ), ; SetAccelerators( ThisWindow.Handle, hAccel ) ; ) ; ON RELEASE ; ( ; DestroyMenu( hMenu ), ; DestroyAcceleratorTable( hAccel ) ; ) END WINDOW Win_1.Center Win_1.Activate return 0 ////////////////////////////////////////////////////////////////////////////// function App_OnEvents( hWnd, nMsg, wParam, lParam ) local nResult switch nMsg case WM_COMMAND switch LoWord( wParam ) case IDM_REGULAR case IDM_BOLD case IDM_ITALIC case IDM_ULINE MsgInfo( 'ID:' + hb_NtoS( LoWord( wParam ) ), iif( 0 == HiWord( wParam ), 'Menu', 'Accelerator' ) ) nResult := 0 exit otherwise nResult := Events( hWnd, nMsg, wParam, lParam ) end exit otherwise nResult := Events( hWnd, nMsg, wParam, lParam ) end return nResult ////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP /* Parts of this code is contributed and used here under permission of his author: Copyright 2016 (C) P.Chornyj <myorg63@mail.ru> */ #include <hbwinuni.h> #include <mgdefs.h> #include "hbapiitm.h" extern HINSTANCE g_hInstance; // BOOL WINAPI DestroyAcceleratorTable( HACCEL hAccel ) HB_FUNC( DESTROYACCELERATORTABLE ) { HACCEL hAccel = ( HACCEL ) ( LONG_PTR ) HB_PARNL( 1 ); hb_retl( DestroyAcceleratorTable( hAccel ) ? HB_TRUE : HB_FALSE ); } // HACCEL WINAPI LoadAccelerators( HINSTANCE hInstance, LPCTSTR lpTableName ) HB_FUNC( LOADACCELERATORS ) { HACCEL hAccel = ( HACCEL ) NULL; HINSTANCE hInstance = HB_ISNUM( 1 ) ? ( HINSTANCE ) HB_PARNL( 1 ) : g_hInstance; LPCTSTR lpTableName; if( HB_ISNUM( 2 ) ) { lpTableName = MAKEINTRESOURCE( ( WORD ) hb_parnl( 2 ) ); hAccel = LoadAccelerators( hInstance, lpTableName ); } else if( HB_ISCHAR( 2 ) ) { void * hTableName; lpTableName = HB_PARSTR( 2, &hTableName, NULL ); hAccel = LoadAccelerators( hInstance, lpTableName ); hb_strfree( hTableName ); } HB_RETNL( ( LONG_PTR ) hAccel ); } // HMENU WINAPI LoadMenu( HINSTANCE hInstance, LPCTSTR lpMenuName ) HB_FUNC( LOADMENU ) { HMENU hMenu = ( HMENU ) NULL; HINSTANCE hInstance = HB_ISNUM( 1 ) ? ( HINSTANCE ) HB_PARNL( 1 ) : g_hInstance; LPCTSTR lpMenuName; if( HB_ISNUM( 2 ) ) { lpMenuName = MAKEINTRESOURCE( ( WORD ) hb_parnl( 2 ) ); hMenu = LoadMenu( hInstance, lpMenuName ); } else if( HB_ISCHAR( 2 ) ) { void * hMenuName; lpMenuName = HB_PARSTR( 2, &hMenuName, NULL ); hMenu = LoadMenu( hInstance, lpMenuName ); hb_strfree( hMenuName ); } HB_RETNL( ( LONG_PTR ) hMenu ); } #pragma ENDDUMP [/pre2]

Петр: Для того, чтобы пример заработал нужны еще 2 файла [pre2]// demo.ch #define IDM_REGULAR 1100 #define IDM_BOLD 1200 #define IDM_ITALIC 1300 #define IDM_ULINE 1400[/pre2] [pre2]// demo.rc #include "demo.ch" MainMenu MENU { POPUP "&Character" { MENUITEM "&Regular\tF5", IDM_REGULAR MENUITEM "&Bold\tCtrl+B", IDM_BOLD MENUITEM "&Italic\tCtrl+I", IDM_ITALIC MENUITEM "&Underline\tCtrl+U", IDM_ULINE } } FontAccel ACCELERATORS { VK_F5, IDM_REGULAR, VIRTKEY "B", IDM_BOLD, CONTROL, VIRTKEY "I", IDM_ITALIC, CONTROL, VIRTKEY "U", IDM_ULINE, CONTROL, VIRTKEY }[/pre2]

Петр: Также нужно внести изменения в библиотеку (c_windowsAPI.c) и пересобрать ее [pre2] static HWND hWndMain = NULL; static HACCEL hAccel = NULL; HB_FUNC( SETACCELERATORS ) { hWndMain = ( HWND ) ( LONG_PTR ) HB_PARNL( 1 ); hAccel = ( HACCEL ) ( LONG_PTR ) HB_PARNL( 2 ); } HB_FUNC( DOMESSAGELOOP ) { MSG Msg; BOOL bRet; while( ( bRet = GetMessage( &Msg, NULL, 0, 0 ) ) != 0 ) { hDlgModeless = GetActiveWindow(); if( bRet == -1 ) { // handle the error and possibly exit hmg_ErrorExit( TEXT( "DOMESSAGELOOP" ), 0, TRUE ); } else { if( hDlgModeless == ( HWND ) NULL || ! TranslateAccelerator( hWndMain, hAccel, &Msg ) ) { if( ! IsDialogMessage( hDlgModeless, &Msg ) ) { TranslateMessage( &Msg ); DispatchMessage( &Msg ); } } } } }[/pre2]

gfilatov2002: Петр пишет: поддержку акселераторов в MiniGUI организовать просто Благодарю за Ваш весомый вклад в развитие библиотеки! Отдельное спасибо за реализацию функции LoadMenu



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