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
Tomar Theme de Windows activo
-
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
Harbour 3.2.0 (r1306211258)
PellesC
- 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
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.
- 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" - 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. - 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.
-
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
Gracias Antonio... más claro echale agua jajaja
Abrazo enorme
PD. y si el aplicativo no tirne recursos ? ...como aplico el manifest ?
Harbour 3.2.0 (r1306211258)
PellesC
- 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
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.
- 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 - Copia los manifests a tu carpeta desde samples/winxp/:
- WindowsXP.Manifest
- WindowsXP.Manifest64
(O ajusta la ruta en el .rc, p.ej. 1 24 "../WinXP/WindowsXP.Manifest".) - Recompila con tu variante habitual, p.ej. build_new.bat miapp hm64.
- 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.
-
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
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?
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
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
Harbour 3.2.0 (r1306211258)
PellesC
- 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
Estimado Miguel Angel,
Botones con modo flat (include/fivewin.ch):
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.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.TBtnFlat (source/classes/btnflat.prg:17) — FLATBTN, plano por definición:
@ r,c FLATBTN ... [NOBORDER] COLOR nTxt,nPaneEn barra: DEFINE BUTTON ... FLAT/NOBORDER (fivewin.ch:302).
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).
-
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
Ok. Gracias Antonio. Me pongo a probar. Si no te molesta Te consulto cualquier cosa
Abrazo
Harbour 3.2.0 (r1306211258)
PellesC