Ao contrário do que eu pensava, o fonte GUI não é totalmente em PRG, depende de rotinas em C.
Pelo que mexi em VB6, qualquer controle era um FORM - uma janela.
Pra criar um controle era só usar uma janela, a mesma de criar um módulo.
Fiz um simulado básico, mas não tem controle de janela pai/filho, ou retirada das bordas, ou controle de evento, e muito menos a "conversação" entre janelas pra avisar sobre redesenhar a tela.
É um simulado básico.
Pra quem testar, saiba que dentro da janela principal criei 10 janelas filhas, mas as 10 janelas filhas ficam uma encima da outra, precisa mover.
E ao mover, como não tem o aviso entre as janelas, o "redesenho" não é instantâneo.
Só estou querendo saber se estou entendendo errado, ou se as LIBs GUI é que complicam tudo.
Porque se for do jeito que penso, seria só criar os controles com métodos padrão pra poder juntar tudo em qualquer GUI.
Teoricamente, cada janela é um programa, e cada programa é responsável pelo seu próprio desenho/funcionamento, que pode executar uma ação ou se comunicar com as outras janelas.
Segue o teste bem primário, de quem ainda está tentando entender esse troço.
Obs: A propósito... reparem que passo valores entre as threads de um jeito simples: classes.
Obs2: Queria postar isso no grupo harbour, mas não sei se meu inglês vai ser suficiente pra explicar isto direito.
Código: Selecionar todos
#include "hbclass.ch"
#include "inkey.ch"
PROCEDURE Main
LOCAL oThisWindow, oWindow := Array(10), nCont, hWnd
SetMode( 25, 80 )
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
CLS
hWnd := wvgSetAppWindow():hWnd
FOR nCont = 1 TO 10
oThisWindow := WindowClass():New()
oThisWindow:oParent := hWnd
oThisWindow:oMain := wvgSetAppWindow()
hb_ThreadStart( { || oThisWindow:Execute() } )
oWindow[ nCont ] := oThisWindow
NEXT
WaitForEsc()
RETURN
CREATE CLASS WindowClass
VAR oParent
VAR oMain
METHOD Execute()
END CLASS
METHOD Execute()
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
hb_gtReload( "WVG" )
SetMode( 5, 60 )
CLS
wapi_SetParent( wvgSetAppWindow():hWnd, ::oParent )
WaitForEsc( ::oMain )
RETURN NIL
FUNCTION wapi_SetParent( hWndChild, hWnd )
CallDll32( "SetParent", "user32.dll", hWndChild, hWnd )
RETURN NIL
FUNCTION WaitForEsc( oMain )
DO WHILE Inkey(0) != K_ESC
IF oMain != NIL
oMain:Refresh()
ENDIF
ENDDO
RETURN .T.

