Ola!
Na Hwgui temos algumas funções genéricas, tanto para Linux ou Windows, mas no nível mais baixo, usando o C, temos praticamente duas HWGUI´s.
Até nas funções que usamos tem parâmetros para usarmos na GTK e que não tem no Windows e vice-versa.
Temos a pasta \source\winapi e outra de nome \source\GTK.
Por exemplo o fonte menu.prg para GTK:
Código: Selecionar todos
/*
* $Id: menu.prg 2497 2015-11-18 15:05:34Z alkresin $
*
* HWGUI - Harbour Linux (GTK) GUI library source code:
* Prg level menu functions
*
* Copyright 2004 Alexander S.Kresin <alex@kresin.ru>
* www - http://www.kresin.ru
*/
#include "hbclass.ch"
#include "hwgui.ch"
#define MENU_FIRST_ID 32000
#define CONTEXTMENU_FIRST_ID 32900
#define FLAG_DISABLED 1
#define FLAG_CHECK 2
STATIC _aMenuDef, _oWnd, _aAccel, _nLevel, _Id, _oMenu, _oBitmap, _lContext, hLast
/*
STATIC aKeysTable := { { VK_F1,GDK_F1 }, { VK_F2,GDK_F2 }, { VK_F3,GDK_F3 }, ;
{ VK_F4, GDK_F4 }, { VK_F5, GDK_F5 }, { VK_F6, GDK_F6 }, { VK_F7, GDK_F7 }, ;
{ VK_F8, GDK_F8 }, { VK_F9, GDK_F9 }, { VK_F10, GDK_F10 }, { VK_F11, GDK_F11 }, ;
{ VK_F12, GDK_F12 }, { VK_HOME, GDK_Home }, { VK_LEFT, GDK_Left }, { VK_END, GDK_End }, ;
{ VK_RIGHT, GDK_Right }, { VK_DOWN, GDK_Down }, { VK_UP, GDK_Up } }
*/
CLASS HMenu INHERIT HObject
DATA handle
DATA aMenu
METHOD New() INLINE Self
METHOD End() INLINE Hwg_DestroyMenu( ::handle )
METHOD Show( oWnd, xPos, yPos, lWnd )
ENDCLASS
METHOD Show( oWnd ) CLASS HMenu
IF oWnd == Nil
oWnd := HWindow():GetMain()
ENDIF
oWnd:oPopup := Self
Hwg_trackmenu( ::handle )
RETURN Nil
FUNCTION Hwg_CreateMenu
LOCAL hMenu
IF ( Empty( hMenu := hwg__CreateMenu() ) )
RETURN Nil
ENDIF
RETURN { {}, , , hMenu }
FUNCTION Hwg_SetMenu( oWnd, aMenu )
IF !Empty( oWnd:handle )
IF hwg__SetMenu( oWnd:handle, aMenu[5] )
oWnd:menu := aMenu
ELSE
RETURN .F.
ENDIF
ELSE
oWnd:menu := aMenu
ENDIF
RETURN .T.
/*
* AddMenuItem( aMenu,cItem,nMenuId,lSubMenu,[bItem] [,nPos] ) --> aMenuItem
*
* If nPos is omitted, the function adds menu item to the end of menu,
* else it inserts menu item in nPos position.
*/
FUNCTION Hwg_AddMenuItem( aMenu, cItem, nMenuId, lSubMenu, bItem, nPos )
LOCAL hSubMenu
IF nPos == Nil
nPos := Len( aMenu[1] ) + 1
ENDIF
hSubMenu := hLast := aMenu[5]
hSubMenu := hwg__AddMenuItem( hSubMenu, cItem, nPos - 1, hwg_Getactivewindow(), nMenuId, , lSubMenu )
IF nPos > Len( aMenu[1] )
IF lSubmenu
AAdd( aMenu[1], { {}, cItem, nMenuId, 0, hSubMenu } )
ELSE
AAdd( aMenu[1], { bItem, cItem, nMenuId, 0, hSubMenu } )
ENDIF
RETURN ATail( aMenu[1] )
ELSE
AAdd( aMenu[1], Nil )
AIns( aMenu[1], nPos )
IF lSubmenu
aMenu[ 1,nPos ] := { {}, cItem, nMenuId, 0, hSubMenu }
ELSE
aMenu[ 1,nPos ] := { bItem, cItem, nMenuId, 0, hSubMenu }
ENDIF
RETURN aMenu[ 1,nPos ]
ENDIF
RETURN Nil
FUNCTION Hwg_FindMenuItem( aMenu, nId, nPos )
LOCAL nPos1, aSubMenu
nPos := 1
DO WHILE nPos <= Len( aMenu[1] )
IF aMenu[ 1,npos,3 ] == nId
RETURN aMenu
ELSEIF ValType( aMenu[ 1,npos,1 ] ) == "A"
IF ( aSubMenu := Hwg_FindMenuItem( aMenu[ 1,nPos ] , nId, @nPos1 ) ) != Nil
nPos := nPos1
RETURN aSubMenu
ENDIF
ENDIF
nPos ++
ENDDO
RETURN Nil
FUNCTION Hwg_GetSubMenuHandle( aMenu, nId )
LOCAL aSubMenu := Hwg_FindMenuItem( aMenu, nId )
RETURN iif( aSubMenu == Nil, 0, aSubMenu[5] )
FUNCTION hwg_BuildMenu( aMenuInit, hWnd, oWnd, nPosParent, lPopup )
LOCAL hMenu, nPos, aMenu, i, oBmp
IF nPosParent == Nil
IF lPopup == Nil .OR. !lPopup
hMenu := hwg__CreateMenu()
ELSE
hMenu := hwg__CreatePopupMenu()
ENDIF
aMenu := { aMenuInit, , , , hMenu }
ELSE
hMenu := aMenuInit[5]
nPos := Len( aMenuInit[1] )
aMenu := aMenuInit[ 1,nPosParent ]
hMenu := hwg__AddMenuItem( hMenu, aMenu[2], nPos + 1, hWnd, aMenu[3], aMenu[4], .T. )
IF Len( aMenu ) < 5
AAdd( aMenu, hMenu )
ELSE
aMenu[5] := hMenu
ENDIF
ENDIF
nPos := 1
DO WHILE nPos <= Len( aMenu[1] )
IF ValType( aMenu[ 1,nPos,1 ] ) == "A"
hwg_BuildMenu( aMenu, hWnd, , nPos )
ELSE
IF aMenu[ 1,nPos,1 ] == Nil .OR. aMenu[ 1,nPos,2 ] != Nil
IF Len( aMenu[1,npos] ) == 4
AAdd( aMenu[1,npos], Nil )
ENDIF
aMenu[1,npos,5] := hwg__AddMenuItem( hMenu, aMenu[1,npos,2], ;
nPos, hWnd, aMenu[1,nPos,3], aMenu[1,npos,4], .F. )
ENDIF
ENDIF
nPos ++
ENDDO
IF !_lContext .AND. hWnd != Nil .AND. oWnd != Nil
Hwg_SetMenu( oWnd, aMenu )
ELSEIF _oMenu != Nil
_oMenu:handle := aMenu[5]
_oMenu:aMenu := aMenu
ENDIF
RETURN Nil
FUNCTION Hwg_BeginMenu( oWnd, nId, cTitle )
LOCAL aMenu, i
IF oWnd != Nil
_lContext := .F.
_aMenuDef := {}
_aAccel := {}
_oBitmap := {}
_oWnd := oWnd
_oMenu := Nil
_nLevel := 0
_Id := iif( nId == Nil, MENU_FIRST_ID, nId )
ELSE
nId := iif( nId == Nil, ++ _Id, nId )
aMenu := _aMenuDef
FOR i := 1 TO _nLevel
aMenu := Atail( aMenu )[1]
NEXT
_nLevel ++
IF !Empty( cTitle )
cTitle := StrTran( cTitle, "\t", "" )
cTitle := StrTran( cTitle, "&", "_" )
ENDIF
AAdd( aMenu, { {}, cTitle, nId, 0 } )
ENDIF
RETURN .T.
FUNCTION Hwg_ContextMenu()
_lContext := .T.
_aMenuDef := {}
_oBitmap := {}
_oWnd := Nil //HWindow():GetMain()
_nLevel := 0
_Id := CONTEXTMENU_FIRST_ID
_oMenu := HMenu():New()
RETURN _oMenu
FUNCTION Hwg_EndMenu()
IF _nLevel > 0
_nLevel --
ELSE
hwg_BuildMenu( AClone( _aMenuDef ), iif( _oWnd != Nil,_oWnd:handle,HWindow():Getmain():handle ), ;
_oWnd, , _lContext )
IF _oWnd != Nil .AND. !Empty( _aAccel )
_oWnd:hAccel := hwg_Createacceleratortable( _oWnd )
ENDIF
_aMenuDef := Nil
_oBitmap := Nil
_aAccel := Nil
_oWnd := Nil
_oMenu := Nil
ENDIF
RETURN .T.
FUNCTION Hwg_DefineMenuItem( cItem, nId, bItem, lDisabled, accFlag, accKey, lBitmap, lResource, lCheck )
LOCAL aMenu, i, oBmp, nFlag
lCheck := iif( lCheck == Nil, .F. , lCheck )
lDisabled := iif( lDisabled == Nil, .T. , !lDisabled )
nFlag := Hwg_BitOr( iif( lCheck,FLAG_CHECK,0 ), iif( lDisabled,0,FLAG_DISABLED ) )
aMenu := _aMenuDef
FOR i := 1 TO _nLevel
aMenu := Atail( aMenu )[1]
NEXT
nId := iif( nId == Nil .AND. cItem != Nil, ++ _Id, nId )
IF !Empty( cItem )
cItem := StrTran( cItem, "\t", "" )
cItem := StrTran( cItem, "&", "_" )
ENDIF
AAdd( aMenu, { bItem, cItem, nId, nFlag, 0 } )
IF accFlag != Nil .AND. accKey != Nil
AAdd( _aAccel, { accFlag, accKey, nId } )
ENDIF
/*
IF lBitmap!=Nil .or. !Empty(lBitmap)
if lResource==Nil ;lResource:=.F.; Endif
if !lResource
oBmp:=HBitmap():AddFile(lBitmap)
else
oBmp:=HBitmap():AddResource(lBitmap)
endif
Aadd( _oBitmap, {.t., oBmp:Handle,cItem,nId} )
Else
Aadd( _oBitmap, {.F., "",cItem, nID})
Endif
*/
RETURN .T.
FUNCTION Hwg_DefineAccelItem( nId, bItem, accFlag, accKey )
LOCAL aMenu, i
aMenu := _aMenuDef
FOR i := 1 TO _nLevel
aMenu := Atail( aMenu )[1]
NEXT
nId := iif( nId == Nil, ++ _Id, nId )
AAdd( aMenu, { bItem, Nil, nId, .T., 0 } )
AAdd( _aAccel, { accFlag, accKey, nId } )
RETURN .T.
STATIC FUNCTION hwg_Createacceleratortable( oWnd )
LOCAL hTable := hwg__Createacceleratortable( oWnd:handle )
LOCAL i, nPos, aSubMenu, nKey, n
FOR i := 1 TO Len( _aAccel )
IF ( aSubMenu := Hwg_FindMenuItem( oWnd:menu, _aAccel[i,3], @nPos ) ) != Nil
IF ( nKey := _aAccel[i,2] ) >= 65 .AND. nKey <= 90
nKey += 32
ELSE
nKey := hwg_gtk_convertkey( nKey )
ENDIF
hwg__AddAccelerator( hTable, aSubmenu[1,nPos,5], _aAccel[i,1], nKey )
ENDIF
NEXT
RETURN hTable
STATIC FUNCTION GetMenuByHandle( hWnd )
LOCAL i, aMenu, oDlg
IF hWnd == Nil
aMenu := HWindow():GetMain():menu
ELSE
IF ( oDlg := HDialog():FindDialog( hWnd ) ) != Nil
aMenu := oDlg:menu
ELSEIF ( i := Ascan( HDialog():aModalDialogs,{ |o|Valtype(o:handle)==Valtype(hwnd) .AND. o:handle == hWnd } ) ) != 0
aMenu := HDialog():aModalDialogs[i]:menu
ELSEIF ( i := Ascan( HWindow():aWindows,{ |o|Valtype(o:handle)==Valtype(hwnd) .AND. o:handle==hWnd } ) ) != 0
aMenu := HWindow():aWindows[i]:menu
ENDIF
ENDIF
RETURN aMenu
FUNCTION hwg_CheckMenuItem( hWnd, nId, lValue )
LOCAL aMenu, aSubMenu, nPos
aMenu := GetMenuByHandle( hWnd )
IF aMenu != Nil
IF ( aSubMenu := Hwg_FindMenuItem( aMenu, nId, @nPos ) ) != Nil
hwg__CheckMenuItem( aSubmenu[1,nPos,5], lValue )
ENDIF
ENDIF
RETURN Nil
FUNCTION hwg_IsCheckedMenuItem( hWnd, nId )
LOCAL aMenu, aSubMenu, nPos, lRes := .F.
aMenu := GetMenuByHandle( hWnd )
IF aMenu != Nil
IF ( aSubMenu := Hwg_FindMenuItem( aMenu, nId, @nPos ) ) != Nil
lRes := hwg__IsCheckedMenuItem( aSubmenu[1,nPos,5] )
ENDIF
ENDIF
RETURN lRes
FUNCTION hwg_EnableMenuItem( hWnd, nId, lValue )
LOCAL aMenu, aSubMenu, nPos
IF Valtype( hWnd ) == "O" .AND. __ObjHasMsg( hWnd, "AMENU" )
aMenu := hWnd:aMenu
ELSE
aMenu := GetMenuByHandle( iif( hWnd == Nil,HWindow():GetMain():handle,hWnd ) )
ENDIF
IF aMenu != Nil
IF ( aSubMenu := Hwg_FindMenuItem( aMenu, nId, @nPos ) ) != Nil
hwg__EnableMenuItem( aSubmenu[1,nPos,5], lValue )
ENDIF
ENDIF
RETURN Nil
FUNCTION hwg_IsEnabledMenuItem( hWnd, nId )
LOCAL aMenu, aSubMenu, nPos
aMenu := GetMenuByHandle( iif( hWnd == Nil,HWindow():GetMain():handle,hWnd ) )
IF aMenu != Nil
IF ( aSubMenu := Hwg_FindMenuItem( aMenu, nId, @nPos ) ) != Nil
hwg__IsEnabledMenuItem( aSubmenu[1,nPos,5] )
ENDIF
ENDIF
RETURN Nil
/*
* hwg_SetMenuCaption( hMenu, nMenuId, cCaption )
*/
FUNCTION hwg_SetMenuCaption( hWnd, nId, cText )
LOCAL aMenu, aSubMenu, nPos
aMenu := GetMenuByHandle( hWnd )
IF aMenu != Nil
IF ( aSubMenu := Hwg_FindMenuItem( aMenu, nId, @nPos ) ) != Nil
hwg__SetMenuCaption( aSubmenu[1,nPos,5], cText )
ENDIF
ENDIF
RETURN Nil
FUNCTION hwg_DeleteMenuItem( oWnd, nId )
LOCAL aSubMenu, nPos
IF ( aSubMenu := Hwg_FindMenuItem( oWnd:menu, nId, @nPos ) ) != Nil
hwg__DeleteMenu( aSubmenu[1,nPos,5], nId )
ADel( aSubMenu[ 1 ], nPos )
ASize( aSubMenu[ 1 ], Len( aSubMenu[ 1 ] ) - 1 )
ENDIF
RETURN Nil
FUNCTION hwg_gtk_convertkey( nKey )
LOCAL n
IF nKey >= 65 .AND. nKey <= 90
nKey += 32
/*
ELSEIF ( n := Ascan( aKeysTable, { |a|a[1] == nKey } ) ) > 0
nKey := aKeysTable[n,2]
ELSE
nKey += 0xFF00
*/
ENDIF
RETURN nKey
[/code]
E o menu.prg para API do windows:
Código: Selecionar todos
/*
* $Id: menu.prg 2086 2013-06-23 12:57:56Z alkresin $
*
* HWGUI - Harbour Win32 GUI library source code:
* Prg level menu functions
*
* Copyright 2001 Alexander S.Kresin <alex@kresin.ru>
* www - http://www.kresin.ru
*/
#include "windows.ch"
#include "hbclass.ch"
#include "guilib.ch"
#define MENU_FIRST_ID 32000
#define CONTEXTMENU_FIRST_ID 32900
#define FLAG_DISABLED 1
#define FLAG_CHECK 2
STATIC _aMenuDef, _oWnd, _aAccel, _nLevel, _Id, _oMenu, _oBitmap
CLASS HMenu INHERIT HObject
DATA handle
DATA aMenu
METHOD New() INLINE Self
METHOD END() INLINE Hwg_DestroyMenu( ::handle )
METHOD Show( oWnd, xPos, yPos, lWnd )
ENDCLASS
METHOD Show( oWnd, xPos, yPos, lWnd ) CLASS HMenu
LOCAL aCoor
oWnd:oPopup := Self
IF PCount() == 1 .OR. lWnd == Nil .OR. ! lWnd
IF PCount() == 1
aCoor := hwg_GetCursorPos()
xPos := aCoor[ 1 ]
yPos := aCoor[ 2 ]
ENDIF
Hwg_trackmenu( ::handle, xPos, yPos, oWnd:handle )
ELSE
aCoor := hwg_Clienttoscreen( oWnd:handle, xPos, yPos )
Hwg_trackmenu( ::handle, aCoor[ 1 ], aCoor[ 2 ], oWnd:handle )
ENDIF
RETURN Nil
FUNCTION Hwg_CreateMenu
LOCAL hMenu
IF Empty( hMenu := hwg__CreateMenu() )
RETURN Nil
ENDIF
RETURN { { },,, hMenu }
FUNCTION Hwg_SetMenu( oWnd, aMenu )
IF ! Empty( oWnd:handle )
IF hwg__SetMenu( oWnd:handle, aMenu[ 5 ] )
oWnd:menu := aMenu
ELSE
RETURN .F.
ENDIF
ELSE
oWnd:menu := aMenu
ENDIF
RETURN .T.
/*
* AddMenuItem( aMenu,cItem,nMenuId,lSubMenu,[bItem] [,nPos] ) --> aMenuItem
*
* If nPos is omitted, the function adds menu item to the end of menu,
* else it inserts menu item in nPos position.
*/
FUNCTION Hwg_AddMenuItem( aMenu, cItem, nMenuId, lSubMenu, bItem, nPos )
LOCAL hSubMenu
IF nPos == Nil
nPos := Len( aMenu[ 1 ] ) + 1
ENDIF
hSubMenu := aMenu[ 5 ]
hSubMenu := hwg__AddMenuItem( hSubMenu, cItem, nPos - 1, .T., nMenuId,, lSubMenu )
IF nPos > Len( aMenu[ 1 ] )
IF lSubMenu
AAdd( aMenu[ 1 ], { { }, cItem, nMenuId, 0, hSubMenu } )
ELSE
AAdd( aMenu[ 1 ], { bItem, cItem, nMenuId, 0 } )
ENDIF
RETURN ATail( aMenu[ 1 ] )
ELSE
AAdd( aMenu[ 1 ], Nil )
AIns( aMenu[ 1 ], nPos )
IF lSubMenu
aMenu[ 1, nPos ] := { { }, cItem, nMenuId, 0, hSubMenu }
ELSE
aMenu[ 1, nPos ] := { bItem, cItem, nMenuId, 0 }
ENDIF
RETURN aMenu[ 1, nPos ]
ENDIF
RETURN Nil
FUNCTION Hwg_FindMenuItem( aMenu, nId, nPos )
LOCAL nPos1, aSubMenu
nPos := 1
DO WHILE nPos <= Len( aMenu[ 1 ] )
IF aMenu[ 1, nPos, 3 ] == nId
RETURN aMenu
ELSEIF Len( aMenu[ 1, nPos ] ) > 4
IF ( aSubMenu := Hwg_FindMenuItem( aMenu[ 1, nPos ] , nId, @nPos1 ) ) != Nil
nPos := nPos1
RETURN aSubMenu
ENDIF
ENDIF
nPos ++
ENDDO
RETURN Nil
FUNCTION Hwg_GetSubMenuHandle( aMenu, nId )
LOCAL aSubMenu := Hwg_FindMenuItem( aMenu, nId )
RETURN IIf( aSubMenu == Nil, 0, aSubMenu[ 5 ] )
FUNCTION hwg_BuildMenu( aMenuInit, hWnd, oWnd, nPosParent, lPopup )
LOCAL hMenu, nPos, aMenu, oBmp
IF nPosParent == Nil
IF lPopup == Nil .OR. ! lPopup
hMenu := hwg__CreateMenu()
ELSE
hMenu := hwg__CreatePopupMenu()
ENDIF
aMenu := { aMenuInit,,,, hMenu }
ELSE
hMenu := aMenuInit[ 5 ]
nPos := Len( aMenuInit[ 1 ] )
aMenu := aMenuInit[ 1, nPosParent ]
/* This code just for sure menu runtime hfrmtmpl.prg is enable */
IIf( ValType( aMenu[ 4 ] ) == "L", aMenu[ 4 ] := .f., )
hMenu := hwg__AddMenuItem( hMenu, aMenu[ 2 ], nPos + 1, .T., aMenu[ 3 ], aMenu[ 4 ], .T. )
IF Len( aMenu ) < 5
AAdd( aMenu, hMenu )
ELSE
aMenu[ 5 ] := hMenu
ENDIF
ENDIF
nPos := 1
DO WHILE nPos <= Len( aMenu[ 1 ] )
IF ValType( aMenu[ 1, nPos, 1 ] ) == "A"
hwg_BuildMenu( aMenu,,, nPos )
ELSE
IF aMenu[ 1, nPos, 1 ] == Nil .OR. aMenu[ 1, nPos, 2 ] != Nil
/* This code just for sure menu runtime hfrmtmpl.prg is enable */
IIf( ValType( aMenu[ 1, nPos, 4 ] ) == "L", aMenu[ 1, nPos, 4 ] := .f., )
hwg__AddMenuItem( hMenu, aMenu[ 1, nPos, 2 ], nPos, .T., ;
aMenu[ 1, nPos, 3 ], aMenu[ 1, nPos, 4 ], .F. )
oBmp := Hwg_SearchPosBitmap( aMenu[ 1, nPos, 3 ] )
IF oBmp[ 1 ]
hwg__Setmenuitembitmaps( hMenu, aMenu[ 1, nPos, 3 ], oBmp[ 2 ], "" )
ENDIF
ENDIF
ENDIF
nPos ++
ENDDO
IF hWnd != Nil .AND. oWnd != Nil
Hwg_SetMenu( oWnd, aMenu )
ELSEIF _oMenu != Nil
_oMenu:handle := aMenu[ 5 ]
_oMenu:aMenu := aMenu
ENDIF
RETURN Nil
FUNCTION Hwg_BeginMenu( oWnd, nId, cTitle )
LOCAL aMenu, i
IF oWnd != Nil
_aMenuDef := { }
_aAccel := { }
_oBitmap := { }
_oWnd := oWnd
_oMenu := Nil
_nLevel := 0
_Id := IIf( nId == Nil, MENU_FIRST_ID, nId )
ELSE
nId := IIf( nId == Nil, ++ _Id, nId )
aMenu := _aMenuDef
FOR i := 1 TO _nLevel
aMenu := ATail( aMenu )[ 1 ]
NEXT
_nLevel ++
AAdd( aMenu, { { }, cTitle, nId, 0 } )
ENDIF
RETURN .T.
FUNCTION Hwg_ContextMenu()
_aMenuDef := { }
_oBitmap := { }
_oWnd := Nil
_nLevel := 0
_Id := CONTEXTMENU_FIRST_ID
_oMenu := HMenu():New()
RETURN _oMenu
FUNCTION Hwg_EndMenu()
IF _nLevel > 0
_nLevel --
ELSE
hwg_BuildMenu( AClone( _aMenuDef ), IIf( _oWnd != Nil, _oWnd:handle, Nil ), ;
_oWnd,, IIf( _oWnd != Nil, .F., .T. ) )
IF _oWnd != Nil .AND. _aAccel != Nil .AND. ! Empty( _aAccel )
_oWnd:hAccel := hwg_Createacceleratortable( _aAccel )
ENDIF
_aMenuDef := Nil
_oBitmap := Nil
_aAccel := Nil
_oWnd := Nil
_oMenu := Nil
ENDIF
RETURN .T.
FUNCTION Hwg_DefineMenuItem( cItem, nId, bItem, lDisabled, accFlag, accKey, lBitmap, lResource, lCheck )
LOCAL aMenu, i, oBmp, nFlag
lCheck := IIf( lCheck == Nil, .F., lCheck )
lDisabled := IIf( lDisabled == Nil, .f., lDisabled )
nFlag := Hwg_BitOr( IIf( lCheck, FLAG_CHECK, 0 ), IIf( lDisabled, FLAG_DISABLED, 0 ) )
aMenu := _aMenuDef
FOR i := 1 TO _nLevel
aMenu := ATail( aMenu )[ 1 ]
NEXT
IF ! Empty( cItem )
cItem := StrTran( cItem, "\t", Chr( 9 ) )
ENDIF
nId := IIf( nId == Nil .AND. cItem != Nil, ++ _Id, nId )
AAdd( aMenu, { bItem, cItem, nId, nFlag } )
IF lBitmap != Nil .or. ! Empty( lBitmap )
IF lResource == Nil ;lResource := .F. ; ENDIF
IF ! lResource
oBmp := HBitmap():AddFile( lBitmap )
ELSE
oBmp := HBitmap():AddResource( lBitmap )
ENDIF
AAdd( _oBitmap, { .t., oBmp:Handle, cItem, nId } )
ELSE
AAdd( _oBitmap, { .F., "", cItem, nId } )
ENDIF
IF accFlag != Nil .AND. accKey != Nil
AAdd( _aAccel, { accFlag, accKey, nId } )
ENDIF
RETURN .T.
FUNCTION Hwg_DefineAccelItem( nId, bItem, accFlag, accKey )
LOCAL aMenu, i
aMenu := _aMenuDef
FOR i := 1 TO _nLevel
aMenu := ATail( aMenu )[ 1 ]
NEXT
nId := IIf( nId == Nil, ++ _Id, nId )
AAdd( aMenu, { bItem, Nil, nId, 0 } )
AAdd( _aAccel, { accFlag, accKey, nId } )
RETURN .T.
FUNCTION Hwg_SetMenuItemBitmaps( aMenu, nId, abmp1, abmp2 )
LOCAL aSubMenu := Hwg_FindMenuItem( aMenu, nId )
LOCAL oMenu := aSubMenu
oMenu := IIf( aSubMenu == Nil, 0, aSubMenu[ 5 ] )
hwg__Setmenuitembitmaps( oMenu, nId, abmp1, abmp2 )
RETURN Nil
FUNCTION Hwg_InsertBitmapMenu( aMenu, nId, lBitmap, oResource )
LOCAL aSubMenu := Hwg_FindMenuItem( aMenu, nId )
LOCAL oMenu := aSubMenu, oBmp
//Serge(seohic) sugest
IF oResource == Nil .or. ! oResource
oBmp := HBitmap():AddFile( lBitmap )
ELSE
oBmp := HBitmap():AddResource( lBitmap )
ENDIF
oMenu := IIf( aSubMenu == Nil, 0, aSubMenu[ 5 ] )
HWG__InsertBitmapMenu( oMenu, nId, oBmp:handle )
RETURN Nil
FUNCTION Hwg_SearchPosBitmap( nPos_Id )
LOCAL nPos := 1, lBmp := { .F., "" }
IF _oBitmap != Nil
DO WHILE nPos <= Len( _oBitmap )
IF _oBitmap[ nPos ][ 4 ] == nPos_Id
lBmp := { _oBitmap[ nPos ][ 1 ], _oBitmap[ nPos ][ 2 ], _oBitmap[ nPos ][ 3 ] }
ENDIF
nPos ++
ENDDO
ENDIF
RETURN lBmp
FUNCTION hwg_DeleteMenuItem( oWnd, nId )
LOCAL aSubMenu, nPos
IF ( aSubMenu := Hwg_FindMenuItem( oWnd:menu, nId, @nPos ) ) != Nil
ADel( aSubMenu[ 1 ], nPos )
ASize( aSubMenu[ 1 ], Len( aSubMenu[ 1 ] ) - 1 )
hwg_DeleteMenu( hwg_Getmenuhandle( oWnd:handle ), nId )
ENDIF
RETURN Nil
Fora os dois programas em C, menu.c que tem para windows e para Linux...
Resumindo, fazer dois, três programas para poder o programador final não ficar limitado a somente um sistema operacional... Eu ainda continuo apostando no HTML e nos navegadores para fazer isso, pois cada fabricante quer dominar tudo, mas sempre criando mais divisões...
No Linux temos os pessoal do QT e do GTK, Gnome x KDE... no Windows temos as API´s, no Androide o Java... a divisão ou dificuldade já vem dos OS´s e não dos criadores de IDE´s...
Quem deseja criar uma IDE multiplataforma tem que saber disso tudo e mais um pouco... Somente LIB´s gráficas e semi gráficas que usam as API´s do "OS" Windows já temos muitas e nem assim conseguem unificar em uma só, imagine no outro nível que é o dos OS´s Linux x Windows x Android x OSX... ?
Poderiam trabalhar na Hwgui por exemplo e melhorarem ela pois já tem muita coisa pronta, mas...
Sem falar na visão equivocada de querer tratar (programar) no Windows como se fosse no (DOS)clipper... tornar a GTWVG por exemplo compatível (igual) a Hwgui ou Minigui ou OOHG, que não tem nada a ver.
Saudações,
Itamar M. Lins Jr.