Domanda

Sto provando a chiamare OpenThemeData (vedi msdn OpenThemeData ) ma non sono riuscito a determinare quali sono i nomi di classe accettabili che devono essere passati dal parametro pszClassList .

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);

Qualcuno potrebbe dirmi quali sono i nomi di classe accettabili che posso passare in quel parametro? Grazie!

È stato utile?

Soluzione

Puoi cercare in " AeroStyle.xml " come notato in un precedente poster, che fornisce un elenco esatto per Vista / Aero. Tuttavia, se vuoi giocare al sicuro (e probabilmente lo fai), i nomi delle classi dovrebbero, in generale, essere i nomi delle classi Windows dei controlli comuni di Windows. Ad esempio, i pulsanti e le caselle di controllo utilizzano il nome della classe "Pulsante", il controllo di modifica "Modifica", ecc. In genere scelgo il nome della classe del controllo più vicino a qualsiasi elemento personalizzato su cui sto lavorando, e usa i dati del tema per questo. In questo modo otterrai codice che funziona con XP, Vista e (si spera) Windows 7, indipendentemente dal tema effettivamente selezionato dall'utente.

Tuttavia, a meno che tu non usi molto Win32 grezzo, probabilmente non controlli molto la creazione direttamente usando il nome della classe. I nomi delle classi sono piuttosto generosamente distribuiti in MSDN. Un buon punto di partenza è in genere il " CommCtrl.h " file dal Platform SDK, che ne contiene molti, e sono sempre descritti nella guida di MSDN sui singoli controlli comuni. Spesso puoi anche impararli guardando come sono definite le finestre di dialogo nei file .rc aprendole in un editor di testo: contengono il nome della classe per i controlli.

Altri suggerimenti

L'articolo Parti e Stati su MSDN contiene una tabella che mostra le classi di controllo , parti e stati . I valori nella tabella sono definiti in Vsstyle.h e Vssym32.h .

Ecco un riferimento rapido:

BUTTON, CLOCK, COMBOBOX, COMMUNICATIONS, CONTROLPANEL, DATEPICKER, DRAGDROP, 
EDIT, EXPLORERBAR, FLYOUT, GLOBALS, HEADER, LISTBOX, LISTVIEW, MENU, MENUBAND, 
NAVIGATION, PAGE, PROGRESS, REBAR, SCROLLBAR, SEARCHEDITBOX, SPIN, STARTPANEL, 
STATUS, TAB, TASKBAND, TASKBAR, TASKDIALOG, TEXTSTYLE, TOOLBAR, TOOLTIP, 
TRACKBAR, TRAYNOTIFY, TREEVIEW, WINDOW

La risposta alla domanda Temi di Windows Visual: Galleria di parti e stati? fornisce un'applicazione " Parti e stati Explorer " in cui è possibile sfogliare e testare la maggior parte degli stili.

I nomi delle classi dipendono dal tema. Ad esempio, come afferma la documentazione per OpenThemeData :

  

I nomi delle classi per il tema Aero sono   definito in AeroStyle.xml, che è   trovato nella cartella Includi di   Sviluppo software Microsoft Windows   Kit (SDK).

So che questa è una vecchia domanda, ma voglio dare una risposta aggiornata (2018) per coloro che vengono qui da Google.

La risposta accettata di DavidK dice di guardare nel file " AeroStyle.xml " dove sono definiti i temi. Questo file faceva parte dell'SDK di Windows 7, ma è stato rimosso dall'SDK di Windows 10, quindi la risposta accettata non è più utile.

La risposta di splash link al MSDN dove l'elenco di nomi, parti e stati del tema è altamente incompleto e non aggiornato.

I temi sono disegnati da UxTheme.dll che legge le immagini e i colori, ecc. dal file aero.msstyles nella cartella C: \ Windows \ Risorse \ Temi \ Aero su Windows 10.

Ma quando apri questo file in un editor esadecimale non troverai i nomi di tutti i temi. Non so se esiste un modo per enumerare tutti i nomi di classi di temi esistenti che possono essere passati a OpenThemeData () . Suppongo che ciò non sia possibile.

Ma quello che so per certo è che nella build di Windows 10 del 18282 Microsoft ha rimosso il tema " Clock " che non viene più utilizzato e molti temi non documentati sono stati aggiunti come ad esempio: " TaskBand2CompositedSmallIconsVertical8Light :: Taskband2 " che viene passato come nome della classe del tema a OpenThemeData () .

E so anche che diversi temi possono essere ottenuti solo se si passa la maniglia della finestra corretta. Se si passa l'handle della finestra sbagliata, è possibile ottenere un altro handle di temi del previsto o addirittura NULL .

So anche che negli ultimi 2 anni Microsoft ha modificato internamente tutto il suo codice per utilizzare OpenThemeDataForDpi () anziché OpenThemeData () perché ogni monitor su Windows 10 potrebbe avere una risoluzione diversa.

Il problema che abbiamo qui è una grave mancanza di documentazione in MSDN e una mancanza di una funzione API per enumerare tutti i temi disponibili.

Non ha nulla a che fare con Aero, che addirittura non esiste su XP! Vedi il codice sorgente di OpenThemeData () ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top