FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Tomar Theme de Windows activo
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Tomar Theme de Windows activo

Posted: Thu Sep 10, 2026 09:28 PM

Bueno poniendome al dia con FiveWin con las muchimas cosas nuevas que tiene. Estuve probando la funcion IsThemeActive() y funciona barbaro, pero me preguntaba si hay alguna otra funcion o clase que tome el theme activo de winsows y lo aplique en mi aplicativo? Gracias Abrazo

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Tomar Theme de Windows activo

Posted: Fri Sep 11, 2026 08:53 AM

Estimado Miguel Angel,

IsThemeActive() funciona bárbaro porque solo pregunta: detecta si Windows tiene los temas activados, no aplica nada.
La que aplica el theme es Windows solo, y FiveWin ya lo dibuja automáticamente si tu .exe lleva el manifest de controles comunes. Por eso con IsThemeActive()=.T. pero sin manifest sigues viendo clásico.

  1. Consultar
    IsThemeActive() // ¿Windows usa temas?
    IsAppThemed() // ¿mi app puede usarlos? = tiene manifest + Windows con temas
    AppHasManifest() // ¿linkeé el manifest?
    lThemes() // IsAppThemed() .and. IsThemeActive()
    FW_GetThemeMode() // "Light" / "Dark" de Windows 10/11
    En tu .rc:
    1 24 "WindowsXP.Manifest"
  2. Quitar / ajustar por control
    SetWindowTheme( oGet:hWnd, "", "" ) // vuelve a clásico ese control
    oWnd:SetWindowTheme( "", "" )
    FixThemeControls( oDlg:hWnd )
    Útil con fondos oscuros donde el texto themed sale oscuro.
  3. Estilos FiveWin y modo oscuro
    oBtn:lThemed := .T.
    oBtn:SetThemed( .T. )
    Ojo: no existe FW_SetDarkTheme(). Es:
    FW_SetDarkMode( .T. ) // global toda la app
    FW_SetDarkMode( .F. ) // volver a light
    oDlg:SetDarkMode()
    oBar:SetDarkMode()
    oBrw:SetDarkTheme()
    Típico:
    if FW_GetThemeMode() == "Dark"
    FW_SetDarkMode( .T. )
    endif
    En resumen: no hay que "copiar" el theme de Windows, con manifest + IsAppThemed() ya lo tienes aplicado.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Tomar Theme de Windows activo

Posted: Fri Sep 11, 2026 04:17 PM

Gracias Antonio... más claro echale agua jajaja Abrazo enorme PD. y si el aplicativo no tirne recursos ? ...como aplico el manifest ?

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Tomar Theme de Windows activo

Posted: Sat Sep 12, 2026 02:54 AM

Si no tienes .rc, créalo — build_new.bat lo enlaza solo:
build_new.bat compila y linkea %1.res automáticamente si existe %1.rc junto al .prg (samples/build_new.bat:115,194,247 según variante). No necesitas recursos previos.

  1. Crea miapp.rc (mismo nombre que miapp.prg, en la misma carpeta) con esto — copiado de samples/winxp/xplook.rc:3-9:
    #ifdef FLAT
    1 24 "WindowsXP.Manifest"
    #endif
    #ifdef 64
    1 24 "WindowsXP.Manifest64"
    #endif
  2. Copia los manifests a tu carpeta desde samples/winxp/:
  3. WindowsXP.Manifest
  4. WindowsXP.Manifest64
    (O ajusta la ruta en el .rc, p.ej. 1 24 "../WinXP/WindowsXP.Manifest".)
  5. Recompila con tu variante habitual, p.ej. build_new.bat miapp hm64.
  6. Verifica en runtime:
    ? AppHasManifest() // .T. = quedó linkeado
    ? IsAppThemed() // .T. = Windows lo está aplicando
    Alternativa sin .rc: archivo externo miapp.exe.manifest junto al .exe — _HasManifest() también lo detecta (source/internal/themes.c:106-119) — pero el recurso embebido es lo recomendado, no depende de un archivo suelto.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Tomar Theme de Windows activo

Posted: Sat Sep 12, 2026 09:34 PM

Exacto Antonio así lo hice. quería saber si existia otra manera que tan bien explicaste. Gracias. PD. Una pregunta ya que la versión de FiveWin que venía utilizando no lo soportaba, en esta nueva versión los Botons tiene en esta version el modo flap?

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

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

Re: Tomar Theme de Windows activo

Posted: Wed Sep 16, 2026 05:49 PM

Antonio que controles/clases tienen la opción de tomar al theme activo de Windows? Son tantas la cosas nuevas para revisar y probar y por suerte ha aumentado el trabajo que realmente no me da el tiempo. Gracias Abrazo

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Tomar Theme de Windows activo

Posted: Wed Sep 16, 2026 06:07 PM

Estimado Miguel Angel,

Botones con modo flat (include/fivewin.ch):

  1. TButtonBmp (source/classes/buttonb.prg:21,131) — BUTTONBMP nativo (BUTTON + BS_FLAT=0x8000):
    @ r,c BUTTONBMP ... FLAT
    Lo pinta Windows, respeta el theme si hay manifest.

  2. TBtnBmp (source/classes/btnbmp.prg:143,324,397) — BTNBMP owner-draw, lFlatStyle:
    @ r,c BTNBMP ... FLAT // sin WS_BORDER, sin borde 3D
    Lo pinta FWH. NOBORDER es similar pero no idéntico.

  3. TBtnFlat (source/classes/btnflat.prg:17) — FLATBTN, plano por definición:
    @ r,c FLATBTN ... [NOBORDER] COLOR nTxt,nPane

  4. En barra: DEFINE BUTTON ... FLAT/NOBORDER (fivewin.ch:302).

  5. TButton (BUTTON nativo, fivewin.ch:473) no tiene cláusula FLAT; solo STYLE nStyle (podrías pasar 0x8000 a mano).

Quién toma el theme activo de Windows:

Condición: exe con manifest comctl32 v6 + tema activo → IsAppThemed() = C5_IsAppThemed() .and. C5_IsThemeActive() (source/function/c5lib.prg:491, source/internal/themes.c:134).

  • Automáticos (controles nativos, los pinta el SO): TButton, TButtonBmp, TCheckBox (checkbox.prg:214), TRadio (radio.prg:191), TGroup (group.prg:250), TComboBox, TGet/TMGet, TSay, THeader, TTrackBar, TFolder/TPages (DrawThemed), TToolBar/ReBar, TTreeView, etc. Ver adaptaciones en control.prg:557,592.

  • Excepción owner-draw: TBtnBmp se autopinta e ignora el theme, salvo activarlo explícito (btnbmp.prg:154,296,2244):
    oBtn:SetThemed( .T. ) // usa OpenThemeData("BUTTON")+DrawThemeBackground(BP_PUSHBUTTON)
    // por defecto global: TBtnBmp():lDefaultTheme := .T.

Requiere compilado con #define THEME (btnbmp.prg:3).

  • TBtnFlat, TBar, TXBrowse, TDialog:SetDarkTheme() usan colores propios; para dark-mode se desactiva el theme con SetWindowTheme(o:hWnd,"","") (dialog.prg:1411).
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 351
Joined: Fri May 19, 2006 04:08 PM

Re: Tomar Theme de Windows activo

Posted: Wed Sep 16, 2026 08:00 PM

Ok. Gracias Antonio. Me pongo a probar. Si no te molesta Te consulto cualquier cosa Abrazo

FWH 32/64 14.04

Harbour 3.2.0 (r1306211258)

PellesC

Continue the discussion