Newsgroup: it.comp.programmare.win32
Titolo: controlli listbox

Devo cambiare dinamicamente, durante il programma, i bit di stile di un
controllo checkbox. Il problema è che quando imposto i bit di stile con
SetWindowLong non ne vedo gli effetti a me no che non crei una finestra
nuova. Si può evitare questa operazione?

 ha scritto nel messaggio
news:9aikn6$tfb$1...@pegasus.tiscalinet.it...

Magari dico una scemenza.... non sono certo di conoscere la problematica.
cmq..... dopo aver cambiato lo stile hai fatto un bel IvalidateRect per dire
a windows che la check va ridisegnata?
Ciao

 wrote in message
9ainjc$u6l$1...@nreadB.inwind.it...

Ho provato ma non cambia nulla

 ha scritto nel messaggio
news:9al95a$ntd$1...@lacerta.tiscalinet.it...

Allora prova a fare SetWindowPos impstando con i seguenti flags:
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
Non so cosa c'entri ma MSDN parla di alcune DATI cached e che per aggiornare
le modifiche va richiamato appunto SetWindowPos. Dal momento che non dice
quali siano questi dati, porva a fare un tentativo.

 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
Non funzia nemmeno questo!

 ha scritto nel messaggio
news:9avu6d$362$1...@pegasus.tiscalinet.it...

Scusami ma a questo punto ho provato personalmente, ho fatto una semplice
dialog con una check e ci ho messo un pulsante che mi fa cambiare lo stile
della check (Normale- leftText e push-like).
Il problemma di aggiornamento l'ho risolto con l'InvalidateRect eccoti il
codice:
    hwndTMP = GetDlgItem(hwndDlg,IDC_CHECK1) ;
    lStile = GetWindowLong(hwndTMP,GWL_STYLE) ;
    if ((lStile & BS_PUSHLIKE) == 0)
   {
        if ((lStile & BS_LEFTTEXT) == 0)
SetWindowLong(hwndTMP,GWL_STYLE,lStile | BS_LEFTTEXT)  ;
        else  SetWindowLong(hwndTMP,GWL_STYLE,(lStile - BS_LEFTTEXT) |
BS_PUSHLIKE) ;
   }else SetWindowLong(hwndTMP,GWL_STYLE,(lStile - BS_PUSHLIKE)) ;
   InvalidateRect(hwndTMP,NULL,TRUE) ;
Controlla il tuo codice magari hai sbagliato qualche handle.
Ciao


Io però utilizzo una listbox, non una checkbox

 Io però utilizzo una listbox, non una checkbox
Scusa, allora non avevo capito bene....(o forse ti sei spiegato male..)
Per quel che ne so la listbox standard non ha uno stile che ti consenta la
visualizzazione delle checkbox modello ListBox del VB.
Se quindi ti riferisci proprio a quest'ultima la proprieta style è di sola
lettura quindi probabilmente anche se cambi lo stile dinamicamente con una
chiamata  SetWindowLong la visualizzazione non può cambiare in quanto viene
definita in sede di inizializzazione (ed è per questo che creandone una
nuova, la cosa riesce).
Saluti

 Saluti
Sono io che mi devo scusare, nel primo post ho scitto checkbox al posto di
listbox, ora quindi riformulo il mio problema:
Devo cambiare dinamicamente, durante il programma, i bit di stile di un
controllo listbox. Il problema è che quando imposto i bit di stile con


 nuova. Si può evitare questa operazione?
Adesso è chiaro.
Prova con RedrawWindow(hwndLst,NULL,NULL,RDW_INVALIDATE | RDW_FRAME) ;
Ho provato a cambiare lo stile aggiungendo e togliendo dinamicamente
WS_BORDER e o riscontrato il tuo stesso problema, poi riflettendo ne ho
capito il perchè. InvalidateRect ridisegna soltanto l'area client è quindi
necessario utilizzare una funzione che posti un WM_NCPAINT ed è appunto
quello che fa RedrawWindow col flag RDW_FRAME.
Spero sia il lieto fine della novella :-)
Ciao

 wrote in message
9b4f7t$f5i$1...@nreadA.inwind.it...

Con WS_BORDER funziona, ma con LBS_SORT e tanti altri no.
Purtroppo la novella è destinata a continuare se tu avrai ancora panzienza
di rispondermi :-)

 ha scritto nel messaggio
news:9b52et$jhm$1...@pegasus.tiscalinet.it...

ummhhh
Mi sa che la novella finisce male....
Infatti non so che cosa consigliarti.... LBS_SORT evidentemente è uno stile
che viene utilizzato in sede di inizializzazione della ListBox per definire
qule operazione eseguire per l'inserimento dell'oggetto nella lista. Un
cambiamento di stile di questo tipo probabilmente richiede una
re-inizializzazione del controllo, ergo la risposta al tuo quesito è no (per
quanto ne possa sapere).
Mi dispiace..