Página 1 de 1

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 12:16
por JoséQuintas
Estou fazendo testes com WVG.

Código: Selecionar todos

#include "wvgparts.ch"
#include "hbgtwvg.ch"
#include "wvtwin.ch"

PROCEDURE Main

   LOCAL oCrt, aSize

   SetColor("W/B")
   CLS
   Altd()
   WITH OBJECT oCrt := wvgStatic():new( , , { 0, 0 }, { -19, -60 } )
      :Style += SS_ICON
      :Create()
      :SetColorFG("W/B")
      :SetColorBG("W/B")
      aSize := :CurrentSize()
      :hBitmap := wvg_LoadImage( "icojpatecnologia", 1, IMAGE_ICON, aSize[1], aSize[2], LR_SHARED )
      wvg_SendMessage( :hWnd, STM_SETIMAGE, IMAGE_ICON, oCrt:hBitmap )
      :InvalidateRect()
   ENDWITH
   Inkey(0)

   RETURN
tela.png
É tudo encima do wvgStatic.
Achei muito fonte pra pouca coisa, então aplicar herança, pra ver o que dá.

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 12:34
por JoséQuintas
Nova classe por herança, MyWvgIcon(), baseada no wvgStatic()

Código: Selecionar todos

CREATE CLASS MyWvgIcon INHERIT WVGSTATIC

   METHOD Create( ... )
   METHOD SetIcon( cIcon )
   ENDCLASS

METHOD Create( ... ) CLASS MyWvgIcon

   ::Style += SS_ICON
   ::wvgStatic:Create( ... )
   ::SetColorFG( SetColor() )
   ::SetColorBG( SetColor() )

   RETURN Nil

METHOD SetIcon( cIcon ) CLASS MyWvgIcon

   LOCAL aSize

   aSize := ::CurrentSize()
   ::hBitmap := wvg_LoadImage( cIcon, 1, IMAGE_ICON, aSize[1], aSize[2], LR_SHARED )
   wvg_SendMessage( ::hWnd, STM_SETIMAGE, IMAGE_ICON, ::hBitmap )
   ::InvalidateRect()

   RETURN Nil
Agora o fonte ficou assim:

Código: Selecionar todos

PROCEDURE Main

   LOCAL oCrt

   SetColor("W/B")
   CLS
   Altd()
   oCrt := MyWvgIcon():new( , , { 0, 0 }, { -19, -60 } )
   oCrt:Create()
   oCrt:SetIcon( "icojpatecnologia" )

   Inkey(0)

   RETURN
Esse conceito pode ser aplicado aos controles HWGUI, FIVEWIN, etc.
Ao invés de ficar enchendo de código fonte em tudo que é lugar, pra modificar o default, já definir os controles do jeito que vamos usar.

Nota:
::wvgStatic:Create() garante que vai ser usado o Create() de wvgStatic()
É porque wvgStatic usa herança de wvgWindow() que também tem seu Create(), o ::Super: poderia pegar o método da classe errada.

Só comentário: SetColorFG() e SetColorBG() podem usar as cores RGB do Windows, mas também aceitam as cores do Harbour.

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 12:48
por JoséQuintas
Não terminou.....
tá parecendo controle da hwgui kkkkk

Código: Selecionar todos

METHOD PROCEDURE WvgStatic:destroy()

   IF ::hBitmap != NIL
      wvg_DeleteObject( ::hBitmap )
   ENDIF
   ::wvgWindow:destroy()

   RETURN
DeleteObject() é pra bitmap e não pra ícone.
Vai precisar tratamento de ícone na nova classe, um novo Destroy() ou algo mais

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 12:57
por JoséQuintas
dest.png
Ferrou.
No Harbour 3.4 tem isso padronizado na hbwin.
No Harbour 3.2 até usa bastante, mas tudo em fonte C.

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 13:05
por JoséQuintas
Criei outra variável pra ícone

Código: Selecionar todos

CREATE CLASS MyWvgIcon INHERIT WVGSTATIC

   VAR hIcon
E como coloquei LR_SHARED no wvg_LoadImage() quando é ícone de resource, deve resolver.
Com a variável diferente não vai acionar DeleteObject(), que não é pra ícone.

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 13:28
por JoséQuintas
Versão final:

Código: Selecionar todos

#include "wvgparts.ch"
#include "hbgtwvg.ch"
#include "wvtwin.ch"
#include "hbclass.ch"

PROCEDURE Main

   LOCAL oCrt

   SetColor("W/B")
   CLS
   Altd()
   oCrt := zeWvgIcon():new( , , { 0, 0 }, { -19, -60 } )
   oCrt:Create()
   oCrt:SetIcon( "icojpatecnologia" )

   Inkey(0)

   RETURN

CREATE CLASS zeWvgIcon INHERIT WVGSTATIC

   VAR hIcon
   METHOD Create( ... )
   METHOD SetIcon( cIcon )
   ENDCLASS

METHOD zeWvgIcon:Create( ... )

   ::Style += SS_ICON
   ::wvgStatic:Create( ... )
   ::SetColorFG( SetColor() )
   ::SetColorBG( SetColor() )

   RETURN Nil

METHOD zeWvgIcon:SetIcon( cIcon )

   LOCAL aSize

   aSize := ::CurrentSize()
   ::hIcon := wvg_LoadImage( cIcon, 1, IMAGE_ICON, aSize[1], aSize[2], LR_SHARED )
   wvg_SendMessage( ::hWnd, STM_SETIMAGE, IMAGE_ICON, ::hIcon )
   ::InvalidateRect()

   RETURN Nil
Agora é mover a classe zeWvgIcon() pra uma LIB.

Harbour 3.2 oficial.
Exceto que está pendente lá pra atualizar wvg_LoadImage() pra aceitar mais 2 parâmetros.
Sem isso, vai precisar um ícone diferente pra cada resolução de tela.

Quem usa GUI sabe isso, e na maioria dos casos não deixa usuário redimensionar tela.

Exemplo de herança / limpeza de fonte

Enviado: 16 Mar 2023 13:58
por JoséQuintas
De novo: é API Windows, JANELA SOBRE JANELA

Passo a passo com DEBUG

Até aqui, normal
wvg1.png

Código: Selecionar todos

METHOD zeWvgIcon:Create( ... )

   ::Style += SS_ICON
   ::wvgStatic:Create( ... )
cria a janela default do windows, cor default do windows
Não importa que é debug, é uma janela encima da janela padrão (digamos DIALOG, mas não é DIALOG)
wvg2.png

Código: Selecionar todos

   ::SetColorFG( SetColor() )
   ::SetColorBG( SetColor() )
Mudou a cor da janela
wvg3.png

Código: Selecionar todos

METHOD zeWvgIcon:SetIcon( cIcon )

   LOCAL aSize

   aSize := ::CurrentSize()
   ::hIcon := wvg_LoadImage( cIcon, 1, IMAGE_ICON, aSize[1], aSize[2], LR_SHARED )
   wvg_SendMessage( ::hWnd, STM_SETIMAGE, IMAGE_ICON, ::hIcon )
   ::InvalidateRect()

   RETURN Nil
Enviou o ícone pro Windows pintar
wvg4.png
A janela do controle wvgStatic é só essa parte em azul.

Aqui é uma coisa interessante:
Em GUI, usando DIALOG, DIALOG é como a GETSYS do Windows, é tudo montado de uma vez pelo Windows, não dá pra acompanhar passo a passo.
Em GTWVG dá pra treinar API Windows, e ver passo a passo o que acontece.
Isso quando o controle não cobre o fonte do debug, porque aí não vemos qual a parte do fonte que está sendo executada.