Newsgroup: it.comp.programmare.win32
Titolo: Problemi con Menu MF_OWNERDRAW

Salve,
durante l'implementazione di un sistema per creare dei menù con una
estetica "personalizzata" sono incappato in alcuni picco problemi.
In generale un item di menù è più o meno suddiviso in tre parti:
1) zona per checkbox o icona
2) label del menu item
3) eventuale shortcut (tipo "Ctrl+A")
Ora mi riesce facile creare dei menu simil OfficeXP con vari colori ecc....
Ma il mio problema è questo:
Se lasci a windows la gestione del paint del menuitem in caso passo una
labelItem del tipo " C&ut\tCtrl+X", il sistema operativo sottolinea la
lettera u del "Cut" perchè è uno shortcut-key e separa in modo ben
indentato con altri eventuali item la scritta "Ctrl+X" sulla base della
presenza del TAB nella label.
Ora come faccio per simulare la stessa cosa???
Per quanto riguarda la lettera sottolineata ho risolto con la semplice
chiamata di DrawText() invece che ExtTextOut(). Ma la perfetta identazione
della label e degli "Accelerators" come "Ctrl+X" non mi riesce ancora...
Mi servirebbe ricavare in qualche modo all'atto del DRAW del menu, quale
è il numero massimo di pixel necessari per disegnare tutti gli item
agganciati al popupmenu, in modo da forzarne la dimensione ed incolonnarvi
per benino i vari Accelerators.... (non so come vengono chiamati
precisamente).
O qualcosa del genere... magari durante la gestione del messaggio
WM_MEASUREITEM......
Sarebbe bello se esistesse un modo per farlo fare a windows con una
chiamata a una funzione più elaborata di DrawText() (ma poi che fare nel
MEASUREITEM??)
Grazie,
Luca

 
Non ho mai docuto fare una cosa del genere, pero' sul sito di John (ti 
avevo dato il link nell'altro thread) c'e' una versione riadattata di un 
programma di James Brown (quindi dovresti trovarlo anche sul suo sito). 
L'esempio si chiama Coolmenu, mi pare. Prova a dargli un'occhiata. Su 
Win32ASM poi so che qualcuno ha fatto degli esperimenti analoghi e aveva 
postato il codice sul forum, se fai un giretto e provi a cercare col 
motore di ricerca, forse trovi qualcosa.
Luca

 
Ecco il post:
http://board.win32asmcommunity.net/showthread.php?s=&threadid=10203

 
http://board.win32asmcommunity.net/showthread.php?s=&threadid=10203
Grandioso... Grazie.
Per il mio problema ho risolto arrangiandomi e scoprendo dopo che più o
meno ho fatto quello che fanno molti altri.... Il tutto è forse un po'
complicato, ma non ho trovato soluzioni più eleganti....
In realtà io ho utilizzato un metodo più veloce e meno dispersivo (come
codice) di quello usato nell'esempio "Coolmenu" di J.Brown che mi è
derivato dal voler utilizzare una struttura supplementare un po' complessa
agganciata ad ogni item (visto che si può fare....)
Ho cercato di sfruttare il più possibile la gestione del messaggio
WM_MEASUREITEM. Prima di tutto preddispongo nella struttura ausiliaria
all'atto della creazione dell'item due stringhe contenenti una la caption
e l'altra la shortcut label, con corretto dimensionamento in byte di
entrambe. Dopo di che nella struttura esiste (purtroppo spreco due int di
spazio) due int chiamati maxLW e max RW (L=left hand, R=right hand,
W=width in pixel). Quando windows richiede al programma le misure (di
minimo) da dare all'item, faccio così più o meno:
estraggo la struttura ausiliaria associata al primo item del subMenu che
contiene l'item da misurare. Qui ho maxLR e maxRW (inizialmente a zero).
Misoro le due stringhe dell'item da misurare e le confronto con maxLR e
maxRW (agganciate al primo degli item) ed eventualmente le aggiorno.
Associo le misure massime così calcolate + qualche pixela di PADDING + lo
spazio per una checkbox/bitmap e così via...
Alla fine quando windows invierà un WM_DRAWITEM farò così:
richiamo sempre la struttura associata al primo item che oramai contiene 
le misure massime fra tutti gli item del submenu che sto per disegnare.
Quindi disegno la bitmap, faccio due DrawText( , , ,..|DT_LEFT) sapendo a
questo punto calcolare i posizinamenti per l'incolonnamento corretti, ecc...
NOTA: se per caso dinamicamente aggiungo,tolgo,modifico un item da un
submenu, posso volendo modificando solo due valori, riadattare a runtime
le dimensioni del submenu all'atto del REDRAW..... (logicamente in fase di
measure però devo settare le vere misure per ogni singolo item, e non
più le massime...).
Ecco fatto.... 
Il trucco del mettere le info che mi servono solo nel first item del
subMenu mi è servito perchè non ho trovato un modo per, dato un HMENU di
un item di ricavare il sup "parent" HMENU!!!! Per me è una mancanza, ma
comunque ho aggirato il problema...
Avrei preferito come logica pensare che vi fosse un modo per navigare in
modo più semplice nei vari HMENU e le loro correlazioni.... ma Microsoft
non ha giudicato tutto ciò "funzionale"...boh?!?
Forse anche un approcci generale del tipo: un conto sono gli item con le
loro caratteristiche, un conto sono i contenitori più generici dei menu,
o meglio: il menu è una scatola che contiene item e che ha delle proprie
caratteristiche, Gli item sono solo item con proprie caratteristiche che
eventualmente puntano ad altre scatole di menu (per fare i submenu...).
In parte lo hanno fatto ma non completamente e così la comodità logica
si è un po' rotta....
Bye Luca

 Bye Luca
Non sara' elegantissimo, come dici tu, pero' funziona. Prova anche a
guardare come ha risolto il problema Paul DiLascia su un vecchio numero di
MSJ. Il suo articolo usava MFC, ma la soluzione dovrebbe essere comuqnue
applicabile anche alle API. Se non lo trovi su sito di MSDN dimmelo che
dovrei avere la copia cartacea a casa (ti passo anno e numero, su web c'e'
di sicuro).
Luca

 Luca
Beccato!
http://www.microsoft.com/msj/0198/coolmenu.aspx
Ciao



OK ancora una volta grazie...
Devo ammettere che non avevo mai notato della presenza di MSJ disponibile
sul sito di MS. Perfetto!
Visto quanto mi stai aiutando mi sento in imbarazzo.... Comunque ancora
grazie.
 Appena avrò qualcosa di più o meno pubblicabile vedrò di mettere in
 linea il codice di ciò che sto facendo, in modo che se qualcuno vuole
 partecipare.... Magari lo potrei pubblicare anche su sourceforge.net....
 A proposito conosci qualche incubatore web simile a 
sourceforge.net
 magari più frequentato da Italiani??? (se mai farò un nuovo post con
 nuovo subject se serve...)
Bye,
Luca