Tomar Theme de Windows activo

Post Reply
El Loco
Posts: 351
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina
Been thanked: 6 times

Tomar Theme de Windows activo

Post by El Loco »

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
User avatar
Antonio Linares
Site Admin
Posts: 44508
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 717 times
Been thanked: 311 times
Contact:

Re: Tomar Theme de Windows activo

Post by Antonio Linares »

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
El Loco
Posts: 351
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina
Been thanked: 6 times

Re: Tomar Theme de Windows activo

Post by El Loco »

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
User avatar
Antonio Linares
Site Admin
Posts: 44508
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 717 times
Been thanked: 311 times
Contact:

Re: Tomar Theme de Windows activo

Post by Antonio Linares »

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
El Loco
Posts: 351
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina
Been thanked: 6 times

Re: Tomar Theme de Windows activo

Post by El Loco »

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
El Loco
Posts: 351
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina
Been thanked: 6 times

Re: Tomar Theme de Windows activo

Post by El Loco »

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
User avatar
Antonio Linares
Site Admin
Posts: 44508
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 717 times
Been thanked: 311 times
Contact:

Re: Tomar Theme de Windows activo

Post by Antonio Linares »

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
El Loco
Posts: 351
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina
Been thanked: 6 times

Re: Tomar Theme de Windows activo

Post by El Loco »

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
Post Reply