Clipper On Line • Ver Tópico - LIB console imitando gráfico

LIB console imitando gráfico

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

LIB console imitando gráfico

Mensagempor JoséQuintas » 18 Fev 2016 00:45

Não sei se interessa pra alguém.
Acabei indo parar nessa página hoje.

Além do manual do Harbour, tem essa LIB, com fontes no github.
Parece ser modo texto, sem LIB gráfica.

tui1.png


tui2.png


http://harbour.edu.pl/hbtui/en/menu.html
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LIB console imitando gráfico

Mensagempor ANDRIL » 18 Fev 2016 07:20

Interessante, lembra o visual do Windows 3.1, será que não tem nada de gráfico? No Clipper até 5.2 sempre quisemos ter esse visual e somente a visual.lib assemelhava-se.
Até+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar de usuário

ANDRIL
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1270
Data de registro: 06 Jul 2004 00:44
Curtiu: 12 vezes
Mens.Curtidas: 46 vezes

LIB console imitando gráfico

Mensagempor Ruben Dario » 19 Fev 2016 10:00

Interesante, el Harbour Text User Interface , pero no hay documentacion de como se usa, estan los titulos pero no muestra, nada, los ejemplos son pantallas y no hay codigo de ejemplo.

Alguine tiene, ejemplos practicos, y documentacion.
Ruben Dario
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 115
Data de registro: 14 Jun 2015 23:19
Cidade/Estado: Colombia
Curtiu: 3 vezes
Mens.Curtidas: 0 vez

LIB console imitando gráfico

Mensagempor viniciuspc » 14 Mar 2016 09:20

Achei bem interessante tbm! ficou bonito!

Ficando de olho nas futuras alterações (#-)

Tem um papo rolando aqui https://groups.google.com/forum/#!topic/harbour-users/tvnTZUjYCqc

Imagem

:xau
Clipper 5.2e + Blinker 5.10
Harbour 3.0.0 (Rev. 16951) + Microsoft Visual C++ 16.0.40219 (32-bit)
Avatar de usuário

viniciuspc
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 40
Data de registro: 19 Dez 2006 16:18
Cidade/Estado: Rio de Janeiro
Curtiu: 40 vezes
Mens.Curtidas: 4 vezes

LIB console imitando gráfico

Mensagempor asimoes » 25 Mar 2016 12:47

Olá Quintas,

Qual é a página no github que contém os fontes e lib?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

LIB console imitando gráfico

Mensagempor sygecom » 26 Mar 2016 21:54

Muito legal,
Estive acompanhando a assunto do Harbour ter sua própria LIB GRAFICA, está quase saindo... se todas as LIB reunidas em força tarefa em um projeto só, teria uma ótima LIB gráfica no Harbour.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

LIB console imitando gráfico

Mensagempor viniciuspc » 28 Mar 2016 12:39

Asimoes :

tem neste link https://groups.google.com/forum/#!topic/harbour-users/tvnTZUjYCqc

mas especificamente :

This is part of a project that Rafal and I started, it's aimed to have a full TUI for Harbour, the project is hosted in github, and everyone is invited to participate:

https://github.com/tfonrouge/HBTui

:xau
Clipper 5.2e + Blinker 5.10
Harbour 3.0.0 (Rev. 16951) + Microsoft Visual C++ 16.0.40219 (32-bit)
Avatar de usuário

viniciuspc
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 40
Data de registro: 19 Dez 2006 16:18
Cidade/Estado: Rio de Janeiro
Curtiu: 40 vezes
Mens.Curtidas: 4 vezes

LIB console imitando gráfico

Mensagempor Itamar M. Lins Jr. » 29 Mar 2016 14:35

Ola!

se todas as LIB reunidas em força tarefa em um projeto só, teria uma ótima LIB gráfica no Harbour.


Não tem como agradar a todos.
O mais promissor para mim é baseado na QT, HBQT... mas temos também a mais velha Hwgui, que roda no Linux via GTK, Android via classe java...
Esta é mais uma que surgiu e é nova. A Minigui tem também mas só para windows... e outras tantas mais velhas como a OOHG e a Marinas Gui via HBQT...
E essa é mais simples somente texto, mas não roda em todos os OS's, iguais a essa tem a GTWVG,GTWIN,GTWVW... bem mais velhas e com muitos problemas resolvidos, lembrando que só rodam no ambiente Windows.
O calcanhar de Aquiles de todas elas é a portabilidade...e a facilidade de uso, a tal IDE que usamos para desenhar as telas.
Como os gurus do Harbour usam Linux para desenvolver e o GCC como compilador padrão... Criar uma LIB gráfica padrão no Harbour é difícil, temos que verificar outras que já estão a mais tempo nesse caminho, observarmos por exemplo o pessoal do Lazarus pois a IDE deles é multiplataforma.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LIB console imitando gráfico

Mensagempor asimoes » 29 Mar 2016 15:14

Resumindo, tudo é uma questão de gosto, hmg, minigui extended, hwgui e demais.... utilize a que mais lhe convém.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

LIB console imitando gráfico

Mensagempor JoséQuintas » 29 Mar 2016 17:38

Depois de olhar GTWVG, OOHG, HWGUI, e outras...

Meu ponto de vista atual é o seguinte:
Não precisa LIB, precisa funções de API prontas pra uso com Harbour.
A partir daí, qualquer um poderia criar sua própria LIB usando apenas Harbour.

Claro, dizer isso é exagero, porque não é fácil criar uma LIB.
Mas seria o ponto de partida pra unificar todas as LIBs, ou pelo menos deixar tudo disponível pra todos.

Vi isso ao alterar algumas coisas da GTWVG.
No Harbour 3.2 não consegui fazer as alterações que havia feito no Harbour 3.4.

No Harbour 3.2:
A GTWVG usa rotinas genéricas em C, não compatíveis com Habour.
Daria pra alterar, com mais rotinas em C, mas não tenho conhecimento pra isso.

No Harbour 3.4:
O Viktor passou várias funções em C pra hbwin, compatíveis com Harbour.
Usei apenas fonte PRG nas alterações.

Usar a API do Windows requer o uso de conteúdos não existentes no Harbour.
Por isso precisa conversão de algumas coisas.
Ou se usam funções C pra isso, o que limita ao conhecimento de um programador C
Ou se usam funções C compatíveis, onde um programador C cria essa função compatível e fica liberada pra usar no PRG.
Ou, não sei se é possível, a cada chamada da API usar essa conversão no PRG.
Tudo bem, continua complicado criar uma LIB, mas abre a possibilidade do próprio usuário "brincar" com isso.

Sem a função compatível, mesmo que esteja tudo certo, pode não funcionar, porque o tipo de parâmetro é inválido.

Nota: este é meu ponto de vista atual, não sei a quantidade de funções compatíveis que seriam necessárias, ou se todas podem ficar compatíveis.

Só sei que o esqueleto de GTWVG, OOHG, e HWGUI são parecidos.
Como cada uma tem suas próprias funções em C, e meu conhecimento de C é zero, não consigo aproveitar funções de uma pra outra.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LIB console imitando gráfico

Mensagempor asimoes » 29 Mar 2016 17:54

Na minha opinião, o que é legado clipper tenta converter para harbour e deixa do jeito que tá, se tem tempo construa um novo ai pode ser qq lib
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

LIB console imitando gráfico

Mensagempor Itamar M. Lins Jr. » 31 Mar 2016 16:29

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:
/*
* $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:
/*
* $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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LIB console imitando gráfico

Mensagempor JoséQuintas » 01 Abr 2016 09:21

A história sempre foi essa.

Já tem até linguagem de programação da Microsoft pra Linux.
Daqui a pouco vai ter Windows pra Linux.

O problema é um só:
No Harbour evitam código Windows.
Nas LIBs, elas acabam criando seu próprio código C, não compatível com Harbour, pra fazer o que precisa.
Além disso, mesmo que o Harbour tenha essas funções, as LIBs precisam ter compatibilidade com Harbour antigo, xHarbour, etc.
Vão continuar precisando código fonte em C específico.

Citei a GTWVG porque ela faz parte do Harbour, e por estar "crua", dá pra decidir pra que lado avançar.

Esse negócio de Open Source não dá muito certo, porque ao invés de centralizar os esforços, eles se espalham.

No final o Viktor fez mais pra essa centralização do que qualquer um, mesmo não sendo pra essa finalidade.
Fez isso ao centralizar muita coisa na hbwin.

Mas se isso nem sequer foi aproveitado no Harbour 3.2, o que dizer sobre as LIBs.

Por isso na escolha das LIBs eu decidi por MySQL e ADO.
Porque é compatível com qualquer LINGUAGEM DE PROGRAMAÇÃO.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LIB console imitando gráfico

Mensagempor JoséQuintas » 03 Abr 2016 20:18

control.png
control.png (2.63 KiB) Visualizado 6222 vezes


Meu conhecimento é limitado, então não dá pra fazer grandes avanços.
Quando chega na parte que precisa inteiro, inteiro longo, etc.... isso não tem no Harbour, mas a API precisa disso.
Não é nenhum controle existente, criei um multicontrole e estou fazendo testes.
O progressbar ainda não funcionou, apesar da criação no fonte, não aparece na tela.



PROCEDURE Main

   LOCAL nCont

   SetColor( "W/B,W/GR+,,,W/B" )
   SetMode( 33, 80 )
   CLS

   FOR nCont = 1 TO 5
      CreateControl( nCont )
   NEXT
   Inkey(0)
   RETURN

STATIC FUNCTION CreateControl( nCont )

   LOCAL oControl

   oControl := wvgControl():New()
   DO CASE
   CASE nCont == 1; oControl:WindowsControlName := "GROUPBOX";    oControl:Caption := "Groupbox"
   CASE nCont == 2; oControl:WindowsControlName := "FRAME"
   CASE nCont == 3; oControl:WindowsControlName := "PUSHBUTTON";  oControl:Caption := "PushButton"
   CASE nCont == 4; oControl:WindowsControlName := "IMAGE";       oControl:Caption := "Image"
   CASE nCont == 5; oControl:WindowsControlName := "PROGRESSBAR"; oControl:Caption := "ProgressBar"
   ENDCASE
   oControl:Create( , , { -( nCont * 5 ), -5 }, { -3, -20 } )
   RETURN NIL


E eu nunca mexi com isso. Deve ser moleza pra quem conhece.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LIB console imitando gráfico

Mensagempor asimoes » 03 Abr 2016 21:11

Olá Quintas,

Onde está wvgControl ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro