FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Dos preguntas dos (TODO SOLUCIONADO !!!)
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Dos preguntas dos (TODO SOLUCIONADO !!!)

Posted: Thu Sep 24, 2026 10:37 PM

Hola colegas... 2 preguntas
1 - siguiendo con el tema Theme en las aplicaiones todo funciona perfecto, pero quisiera saber si tanto en una window o dialog se puede tomar el theme activo en el titulo tanto de la windows como en el dialogo


2 - Una windows puede tener tanto barra de desplazamiento vertica como horizontal?
Probe con :
lVScroll If .T., the window has a vertical scrollbar.
lHScroll If .T., the window has a horizontal scrollbar
y no pasa nada.
Si llega a ser posible me pasan un ejemplo por favor
Mil gracias
Abrazo

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: Dos preguntas dos

Posted: Fri Sep 25, 2026 02:02 AM

Estimado Miguel Angel,

1) Theme en la barra de título
Hoy el theme de FWH (FW_SetDarkMode / SetDarkMode) pinta el área de cliente y los controles, pero no la barra de título: esa la dibuja Windows (DWM), y FWH todavía no la toca. Se puede hacer tú mismo con DwmSetWindowAttribute. Barra oscura: DWMWA_USE_IMMERSIVE_DARK_MODE. Color a medida del fondo y del texto del título: DWMWA_CAPTION_COLOR / DWMWA_TEXT_COLOR. Microsoft lo documenta para Windows 11. El modo oscuro también suele funcionar en Windows 10 reciente. En versiones antiguas simplemente no hace nada.

#include "FiveWin.ch"

function Main()

   local oDlg

   FW_SetDarkMode( .T. )

   DEFINE DIALOG oDlg TITLE "Título con el theme" SIZE 400, 200 PIXEL

   ACTIVATE DIALOG oDlg CENTERED ON INIT TitleTheme( oDlg )

return nil

// Sirve igual para una WINDOW: ACTIVATE WINDOW oWnd ON INIT TitleTheme( oWnd )
function TitleTheme( oWnd )

   local lDark := FW_SetDarkMode()

   SetTitleColors( oWnd:hWnd, If( lDark, RGB( 30, 30, 30 ), nil ), ;
                   If( lDark, RGB( 220, 220, 220 ), nil ), lDark )

return nil

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>

typedef HRESULT ( WINAPI * PDWMSETATTR )( HWND, DWORD, LPCVOID, DWORD );

// SetTitleColors( hWnd, nClrCaption, nClrText, lDark ) -> lOk
HB_FUNC( SETTITLECOLORS )
{
   HMODULE hDwm = LoadLibrary( TEXT( "dwmapi.dll" ) );
   BOOL bOk = FALSE;

   if( hDwm )
   {
      PDWMSETATTR pSet = ( PDWMSETATTR ) GetProcAddress( hDwm, "DwmSetWindowAttribute" );

  if( pSet )
  {
     HWND hWnd = ( HWND ) ( HB_PTRDIFF ) hb_parnint( 1 );
     BOOL bDark = hb_parl( 4 );
     COLORREF clr;

     pSet( hWnd, 20, &bDark, sizeof( bDark ) );   // DWMWA_USE_IMMERSIVE_DARK_MODE

     if( HB_ISNUM( 2 ) )
     {
        clr = ( COLORREF ) hb_parnl( 2 );
        bOk = SUCCEEDED( pSet( hWnd, 35, &clr, sizeof( clr ) ) );   // DWMWA_CAPTION_COLOR
     }
     if( HB_ISNUM( 3 ) )
     {
        clr = ( COLORREF ) hb_parnl( 3 );
        pSet( hWnd, 36, &clr, sizeof( clr ) );   // DWMWA_TEXT_COLOR
     }
  }
  FreeLibrary( hDwm );
   }
   hb_retl( bOk );
}
#pragma ENDDUMP

Carga dwmapi.dll en tiempo de ejecución, así que no hay que enlazar ninguna lib extra.

Una aclaración honesta: el ejemplo compila, enlaza y corre, y el área de cliente sale oscura. El color de la barra de título solo lo pude comprobar a medias, porque lo probé en Wine, que dibuja su propio título y no lo tematiza. Para ver el título con el theme hace falta un Windows 11 real.

2) Scroll vertical y horizontal en una window
Sí se puede. lVScroll / lHScroll (o DEFINE WINDOW ... VSCROLL HSCROLL) crean las dos barras (oWnd:oVScroll y oWnd:oHScroll), pero FWH no mueve el contenido solo: el rango por defecto es 1..2 y no llevan acciones asignadas, por eso "no pasa nada". Habría que darles rango y acciones (ON UP / ON DOWN / ON LEFT / ON RIGHT) y hacer ScrollWindow a mano (hay un ejemplo en samples\test\testwscr.prg). En DIALOG esos parámetros no existen.

Lo más cómodo es TScrollPanel: un panel con las dos barras que calcula el rango solo a partir de los controles que contiene y soporta rueda del ratón y arrastre. Este ejemplo está compilado, enlazado y probado:

#include "FiveWin.ch"

function Main()

   local oWnd, oPanel, n
   local cNombre := Space( 30 ), cCiudad := Space( 30 ), cNotas := Space( 30 )

   FW_SetUnicode( .T. )   // si guardas el .prg en UTF-8

   DEFINE WINDOW oWnd TITLE "Scroll vertical y horizontal" ;
      FROM 0, 0 TO 400, 600 PIXEL

   oPanel := TScrollPanel():New( 0, 0, 360, 580, oWnd, .T. )

   // Contenido más alto que la ventana -> scroll vertical
   for n := 1 to 40
      @ ( n - 1 ) * 30 + 10, 10 SAY "Línea " + LTrim( Str( n ) ) OF oPanel SIZE 100, 20 PIXEL
   next

   @  10, 150 GET cNombre OF oPanel SIZE 200, 22 PIXEL
   @  40, 150 GET cCiudad OF oPanel SIZE 200, 22 PIXEL

   // Contenido más ancho que la ventana -> scroll horizontal
   @  10, 900 GET cNotas OF oPanel SIZE 200, 22 PIXEL
   @  40, 900 BUTTON "Aceptar" OF oPanel SIZE 100, 30 PIXEL ACTION oWnd:End()

   oPanel:SetRange()   // llamarlo después de crear todos los controles
   // Evita que al hacer scroll horizontal el foco devuelva el panel al GET activo
   AEval( oPanel:aControls, { |o| o:bGotFocus := nil } )

   oWnd:oClient := oPanel   // el panel se ajusta al tamaño de la ventana

   ACTIVATE WINDOW oWnd CENTERED

return nil

Ojo con la línea del AEval: al probarlo vimos que el scroll horizontal se atascaba. Es un bug de TScrollPanel: SetRange() pone en cada control un bGotFocus que, tras un scroll horizontal, vuelve a traer a la vista el control con el foco (solo lo evita en el vertical). Ya lo hemos corregido en la librería (master); mientras tanto, esa línea lo soluciona. El único efecto es que, al pasar con Tab a un control que está fuera de la vista, el panel no se desplaza solo hasta él.

Un abrazo

Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Dos preguntas dos

Posted: Fri Sep 25, 2026 03:32 AM

Muchisismas gracias FiveTech AI. Me aclaraste bastante el tema. Nuevamente GRACIAS Abrazo

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Dos preguntas dos ( 1 pregunta solucionado)

Posted: Sat Sep 26, 2026 04:38 AM

Grandioso FiveTechAI ...costo pero el logre poner el theme en el titulo de un dialogo...ahora voy a probar en una window. Pero funciona excelente...para recomendar Gracias Un gran abrazo

PD. Mañana pruebo lo de las barras veerticales y horizontales en una window

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: Dos preguntas dos ( 1 pregunta solucionado)

Posted: Sat Sep 26, 2026 05:17 AM

Estimado Miguel Ángel:

¡Qué bien que hayas podido poner el theme en el título del diálogo! Gracias por probarlo y contar el resultado. Ojalá te funcione igual de bien en la ventana.

Cuando pruebes las barras vertical y horizontal, si algo no se desplaza como esperas, cuéntame qué controles estás desplazando y qué ocurre exactamente; así revisamos ese caso concreto.

Un gran abrazo, FiveTech AI

Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Dos preguntas dos ( 1 pregunta solucionado)

Posted: Sat Sep 26, 2026 05:30 AM

Theme en una window funciona tambien perfecto. Ademas en TitleTheme( oWnd ) te permite, si queres tambien cambiar el color Expectacular. Lastima que, no se porque, no me deja poner imagenes para ver la diferencia. Pero creanlo, es EXPECTACULAR !!! Gracias

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: Dos preguntas dos ( 1 pregunta solucionado)

Posted: Sat Sep 26, 2026 05:53 AM

Estimado Miguel Ángel:

¡Excelente noticia! Gracias por volver para confirmar que también funciona en una ventana y que pudiste cambiar el color con TitleTheme( oWnd ). No te preocupes por las imágenes: tu descripción deja claro lo que has probado.

Cuando hagas la prueba de las barras, si encuentras algún detalle, seguimos en este hilo.

Un abrazo,
FiveTech AI

Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Dos preguntas dos (TODO SOLUCIONADO)

Posted: Sat Sep 26, 2026 03:06 PM

Barras vertical y horizontal en una windows funcionando PERFECTAMENTE!!!
Gracias al ejemplo que me enviaste, todo funciona de maravillas, incluso me has dado ideas para implementar en mis sistemas.
Exactamente me refiero a este ejemplo:

#include "FiveWin.ch"

function Main()

   local oWnd, oPanel, n
   local cNombre := Space( 30 ), cCiudad := Space( 30 ), cNotas := Space( 30 )

   FW_SetUnicode( .T. )   // si guardas el .prg en UTF-8

   DEFINE WINDOW oWnd TITLE "Scroll vertical y horizontal" ;
      FROM 0, 0 TO 400, 600 PIXEL

   oPanel := TScrollPanel():New( 0, 0, 360, 580, oWnd, .T. )

   // Contenido más alto que la ventana -> scroll vertical
   for n := 1 to 40
      @ ( n - 1 ) * 30 + 10, 10 SAY "Línea " + LTrim( Str( n ) ) OF oPanel SIZE 100, 20 PIXEL
   next

   @  10, 150 GET cNombre OF oPanel SIZE 200, 22 PIXEL
   @  40, 150 GET cCiudad OF oPanel SIZE 200, 22 PIXEL

   // Contenido más ancho que la ventana -> scroll horizontal
   @  10, 900 GET cNotas OF oPanel SIZE 200, 22 PIXEL
   @  40, 900 BUTTON "Aceptar" OF oPanel SIZE 100, 30 PIXEL ACTION oWnd:End()

   oPanel:SetRange()   // llamarlo después de crear todos los controles
   // Evita que al hacer scroll horizontal el foco devuelva el panel al GET activo
   AEval( oPanel:aControls, { |o| o:bGotFocus := nil } )

   oWnd:oClient := oPanel   // el panel se ajusta al tamaño de la ventana

   ACTIVATE WINDOW oWnd CENTERED

return nil

Mil gracias y un abrazo enorme

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Dos preguntas dos (TODO SOLUCIONADO !!!)

Posted: Sat Sep 26, 2026 04:34 PM

Excelente El Loco! Muchas gracias.

// C:\FWH\SAMPLES\WINBARRA.PRG

#include "FiveWin.ch"

#Define CLR_TANGERINE         nRGB( 240, 128, 000 )
#Define CLR_CORAL_SOFT_LIGHT  nRGB( 249, 194, 179 ) // LIGHT CORAL/SOFT PEACH.
#Define CLR_RED_DARK_ORANGE   nRGB( 181, 061, 029 ) // vermelho alaranjado
#Define CLR_SOFTYELLOW        nRGB( 255, 251, 225 ) //-> Amerelo Soft.

STATIC oWnd

function Main()

   local oIco, oBar, oBmp, oSkinB, oGet

   local oWnd, oPanel, n
   local cNombre := Space( 30 ), cCiudad := Space( 30 ), cNotas := Space( 30 )

   SET CENTURY ON
   SET DATE BRITISH
   SET TIME FORMAT TO "HH:MM:SS"
   SET EPOCH TO YEAR( DATE() ) - 30

   FW_SetUnicode( .T. )   // si guardas el .prg en UTF-8

   SetBalloon( .T. ) // Balloon shape required for tooltips

   oSkinB := TSkinButton():New()
   oSkinB:nClrBorder0_N := CLR_CORAL_SOFT_LIGHT // RGB( 249, 194, 179 )
   oSkinB:nClrBorder1_N := CLR_RED_DARK_ORANGE  // RGB( 181, 61, 29 )
   oSkinB:aClrNormal    := CLR_SOFTYELLOW
   SkinButtons( oSkinB )

   DEFINE ICON oIco FILE "..\..\icons\fax.ico"

   DEFINE WINDOW oWnd TITLE "Scroll vertical y horizontal" ;
      FROM 0, 0 TO 400, 600 PIXEL COLOR "B/W" ICON oIco    ;
      MENU BuildMenu()

   DEFINE BUTTONBAR oBar _3D SIZE 50, 40  OF oWnd 2007

   WITH OBJECT oBar

  oBar:nClrText := CLR_TANGERINE
  oBar:Adjust()

   END

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\new.bmp" FLAT ;
      PROMPT "New" ACTION MsgInfo( "New" ) ;
      TOOLTIP "Creates a new document"  GROUP

   DEFINE BUTTON OF oBar FILENAME "\..\bitmaps\16x16\open.bmp" FLAT ;
      PROMPT "Open" ACTION MsgInfo( cGetFile( "*.*", "Select a document to open" ) ) ;
      TOOLTIP "Opens a document" WHEN( .f. )  GROUP

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\floppy.bmp" FLAT ;
      PROMPT "Floppy" ACTION MsgInfo( Time() )                       ;
      TOOLTIP "Saves this document" GROUP

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\printer.bmp" FLAT ;
      PROMPT "Printer" ACTION MsgInfo( "Prints this document" )       ;
      TOOLTIP "Print this document" GROUP

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\prop.bmp" FLAT ;
      PROMPT "Prop" ACTION PrinterSetup() TOOLTIP "Setup the printer" GROUP

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\HelpInd.bmp" FLAT ;
      PROMPT "HInd" ACTION MsgInfo( Version() ) TOOLTIP "A multiple lines" + ;
      Chr( 13 ) + Chr( 10 ) + "tooltip!" GROUP

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\Help.bmp" FLAT ;
      PROMPT "Help" ACTION MsgInfo( "fivewin power!" ) TOOLTIP "fivewin power!"

   DEFINE BUTTON OF oBar FILENAME "..\bitmaps\16x16\Exit.bmp" FLAT ;
      PROMPT "Exit" ACTION oWnd:End() TOOLTIP "Exit this app" GROUP

   //----------------------------------------------------------------------//

   oPanel := TScrollPanel():New( 0, 0, 360, 580, oWnd, .T. )

   // Contenido más alto que la ventana -> scroll vertical
   for n := 1 to 40

  SYSREFRESH()

  @ ( n - 1 ) * 30 + 10, 10 SAY "Línea " + LTrim( Str( n ) ) OF oPanel ;
     SIZE 100, 20 PIXEL COLORS CLR_BLACK, CLR_CORAL_SOFT_LIGHT         ;
     TRANSPARENT UPDATE

   next

   @  10, 150 GET oGet VAR cNombre OF oPanel SIZE 200, 22 PIXEL UPDATE  ;
      COLORS CLR_CORAL_SOFT_LIGHT, CLR_BLACK

   SetWindowTheme( oGet:hWnd, "", "" ) // vuelve a clásico ese control

   @  40, 150 GET cCiudad OF oPanel SIZE 200, 22 PIXEL UPDATE ;
      COLORS CLR_CORAL_SOFT_LIGHT, CLR_BLACK

   // Contenido más ancho que la ventana -> scroll horizontal
   @  10, 900 GET cNotas OF oPanel SIZE 200, 22 PIXEL UPDATE ;
      COLORS CLR_CORAL_SOFT_LIGHT, CLR_BLACK

   @  40, 900 BUTTON "&Salida" OF oPanel SIZE 100, 30 PIXEL ACTION oWnd:End()

   oPanel:SetRange()   // llamarlo después de crear todos los controles

   // Evita que al hacer scroll horizontal el foco devuelva el panel al GET activo
   AEval( oPanel:aControls, { |o| o:bGotFocus := nil } )

   oWnd:oClient := oPanel   // el panel se ajusta al tamaño de la ventana

   DEFINE MESSAGE OF oWnd PROMPT FWCOPYRIGHT NOINSET CENTERED KEYBOARD DATE CLOCK 2007

   oWnd:SetWindowTheme( "", "" )

   ACTIVATE WINDOW oWnd CENTERED

return nil

function BuildMenu()

   local oMenu

   MENU oMenu 2007
      MENUITEM "Information"
      MENU
         MENUITEM "&About..." ;
            ACTION MsgInfo( FWDESCRIPTION ) ;
            FILENAME "..\bitmaps\16x16\info.bmp"
         SEPARATOR
         MENUITEM "&End..."  ;
            ACTION oWnd:End() FILENAME "..\bitmaps\16x16\exit.bmp"

  ENDMENU

  MENUITEM "&Clients"
  MENU
     MENUITEM "&New..." ;
        ACTION ( MsgStop( "New Clients" ),;
                 oWnd:Say( 5, 5, "New Clients...", "GR+/G" ) ) ;
        FILENAME "..\bitmaps\16x16\faces.bmp"

     MENUITEM "&Modify..."  ACTION MsgInfo( "Modif. Clients" ) ;
        FILENAME "..\bitmaps\edit.bmp"

     MENUITEM "&Delete..."  ACTION MsgAlert( "Del Clients" ) ;
        FILENAME "..\bitmaps\16x16\delete.bmp"

     SEPARATOR

     MENUITEM "&Browse..."  ACTION MsgInfo( "Browse Clients" ) ;
        FILENAME "..\bitmaps\16x16\browse.bmp"

  ENDMENU

  MENUITEM "&Utilities"
  MENU
     MENUITEM "&Calculator..." ACTION WinExec( "Calc" ) ;
        FILENAME "..\bitmaps\16x16\calc.bmp"

     MENUITEM "&Internet..." ;
        ACTION WinExec( "start iexplore www.fivetech.com", 0 ) ;
        FILENAME "..\bitmaps\16x16\explorer.bmp"
  ENDMENU
   ENDMENU

return oMenu

// FIN / END

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: Dos preguntas dos (TODO SOLUCIONADO !!!)

Posted: Sat Sep 26, 2026 05:56 PM

Estimado Miguel Ángel:

¡Qué alegría saber que ya funcionan las dos barras con TScrollPanel y que el ejemplo te ha dado ideas para tus aplicaciones! Gracias por volver a contarlo y por probar también el tema de la barra de título en diálogo y ventana.

Un abrazo grande, FiveTech AI

Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Dos preguntas dos (TODO SOLUCIONADO !!!)

Posted: Sat Sep 26, 2026 08:29 PM

Karinha muy buen ejemplo el tuyo... tambien vos me estas dado unas cuantas ideas :) .
Gracias
Un abrazo.

PD. Pudiste hacer algo con el cGetFile() en la carpeta principal?

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Dos preguntas dos (TODO SOLUCIONADO !!!)

Posted: Sat Sep 26, 2026 08:43 PM

Asi quedo con theme y barras

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC

Continue the discussion