tal es así que creo que su desarrollo fue abandonado
Quando chega em conhecimento de linguagem C, não tenho como fazer.
O que fiz pra Harbour 3.4 não funciona no 3.2, simplesmente porque precisa conversão C.
No Harbour 3.4 funciona tamanho * 0.8, mas no Harbour 3.2 não, por causa do tipo numérico que é retornado.
lo realmente importante en el desarrollo de una lib GUI es como recepciona los msg de Windows, los procesa y los dirige a la ventana o al control apropiado, esta es la parte más difícil e importante en una lib GUI
Se esssa é a parte mais difícil... ótimo... talvez esteja adiantado na GTWVG.
Talvez até de uma forma até mais interessante do que na HMG.
Os controles wvg* usam API, tal qual os controles HMG
Código: Selecionar todos
METHOD WvgTabPage:handleEvent( nMessage, aNM )
LOCAL aHdr
DO CASE
CASE nMessage == HB_GTE_SETFOCUS
IF HB_ISEVALITEM( ::sl_tabActivate )
RETURN EVENT_HANDLED
ENDIF
CASE nMessage == HB_GTE_COMMAND
CASE nMessage == HB_GTE_RESIZED
::sendMessage( WIN_WM_SIZE, 0, 0 )
RETURN EVENT_HANDLED
CASE nMessage == HB_GTE_NOTIFY
aHdr := wvg_GetNMHdrInfo( aNM[ 2 ] )
DO CASE
CASE aHdr[ NMH_code ] == -551 /* TCN_SELCHANGE */
ENDCASE
CASE nMessage == HB_GTE_CTLCOLOR
RETURN wapi_GetStockObject( WIN_NULL_BRUSH )
ENDCASE
RETURN EVENT_UNHANDLED
É isso que venho falando faz tempo.
A GTWVG tem a resposta pra tudo.
NÃO ADIANTA OLHAR OS EXEMPLOS. Eles não mostram NADA do que ela é capaz de fazer.
Apenas não foi dada importância à parte GUI, mas está lá.
Por exemplo, esse tabpage, nem sequer existe exemplo de uso.
Antes existia a GTWVT, que era bem mais estilo console.
Ela faz parte da lib GTWVG, e a maioria dos exemplos faz uso dela.
Pode ser interessante dar uma olhada, talvez começando pelo wnd.prg, que é a base de tudo, a criação de janelas.
Talvez falte uma DIALOG, pra gerenciar todos os controles que já existem, e os próximos, em ambiente realmente GUI.
Outro fonte, parthldr.prg (part handler) veja se não lhe é familiar
Código: Selecionar todos
/* This will be called by the WvgCrt() console for various events to be propogated to child controls */
METHOD WvgPartHandler:notifier( nEvent, xParams )
LOCAL aPos, aMenuItem, nIndex, nCtrlID, oObj
LOCAL nReturn := 0
DO CASE
CASE nEvent == HB_GTE_MOUSE
DO CASE
CASE xParams[ 1 ] == WIN_WM_MOUSEHOVER
aPos := { xParams[ 3 ], xParams[ 4 ] }
CASE xParams[ 1 ] == WIN_WM_MOUSELEAVE
/* Nothing */
OTHERWISE
aPos := iif( ::mouseMode == 2, { xParams[ 3 ], xParams[ 4 ] }, { xParams[ 5 ], xParams[ 6 ] } )
ENDCASE
SWITCH xParams[ 1 ]
CASE WIN_WM_MOUSEHOVER
IF HB_ISEVALITEM( ::sl_enter )
Eval( ::sl_enter, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_MOUSELEAVE
IF HB_ISEVALITEM( ::sl_leave )
Eval( ::sl_leave, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_RBUTTONDOWN
IF HB_ISEVALITEM( ::sl_rbDown )
Eval( ::sl_rbDown, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_LBUTTONDOWN
IF HB_ISEVALITEM( ::sl_lbDown )
Eval( ::sl_lbDown, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_RBUTTONUP
IF HB_ISEVALITEM( ::sl_rbUp )
Eval( ::sl_rbUp, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_LBUTTONUP
IF HB_ISEVALITEM( ::sl_lbUp )
Eval( ::sl_lbUp, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_RBUTTONDBLCLK
IF HB_ISEVALITEM( ::sl_rbDblClick )
Eval( ::sl_rbDblClick, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_LBUTTONDBLCLK
IF HB_ISEVALITEM( ::sl_lbDblClick )
Eval( ::sl_lbDblClick, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_MBUTTONDOWN
IF HB_ISEVALITEM( ::sl_mbDown )
Eval( ::sl_mbDown, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_MBUTTONUP
IF HB_ISEVALITEM( ::sl_mbClick )
Eval( ::sl_mbClick, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_MBUTTONDBLCLK
IF HB_ISEVALITEM( ::sl_mbDblClick )
Eval( ::sl_mbDblClick, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_MOUSEMOVE
IF HB_ISEVALITEM( ::sl_motion )
Eval( ::sl_motion, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_MOUSEWHEEL
IF HB_ISEVALITEM( ::sl_wheel )
Eval( ::sl_wheel, aPos, , Self )
ENDIF
EXIT
CASE WIN_WM_NCMOUSEMOVE
EXIT
ENDSWITCH
No final, trata-se de ambiente GUI sub-utilizado.
Se olhar os exemplos da GTWVG, nem dá pra ver que tudo isso existe.
Fizeram muitos exemplos da parte "não gui", que acabam escondendo o que realmente interessa.