Newsgroup: it.comp.lang.c++
Titolo: Io ci riprovo ...

Scusate se vi sottopongo per la seconda volta i miei problemi, ma non so
come fare altrimenti.
1. Ho utilizzato il controllo Microsoft Forms 2.0 Command Button in un
programma Visual C++. Come faccio a cambiare a run-time la picture associata
? Ho visto che è disponibile la funzione SetPicture(LPDISPATCH newValue).
Come si passano i parametri (nel mio caso un file .ico o .bmp, o l'ID di una
risorsa) utilizzando questa interfaccia? Cos'è LPDISPATCH? (ho dato
un'occhiata all'help, ma non ci ho capito molto).
2. E' possibile cambiare il colore di sfondo di un bottone standard (l'ho
dichiarato di tipo CButton)?
3. Mi succede questa cosa: con Visual C++ 5.0, in fase di design posiziono e
dimensiono i controlli sulle dialog box, associando anche delle bitmap ad
alcuni. Quando lo eseguo, tutto funziona correttamente e le proporzioni sono
quelle impostate da me. Cambio font (da piccoli a grandi o viceversa) e il
tutto si sballa. Come faccio a disegnare delle dialog box che non risentano
del cambio della dimensione dei font?
Grazie a chiunque vorrà rispondermi.
N.B. rimuovere le tre KKK ...

del cambio della dimensione dei font?
3)  Le coordinate (posizione e ampiezza) che specifichi quando crei un
     Dialog-Box con il Dialog-Editor, non sono assolute (pixels), bensě in
     Dialog Units (DLUs).
     Le misure sull'asse orizzontale (x e width) corrispondono alla
     larghezza media dei caratteri della fonte del Dialog-Box divise per 4.
     Le misure sull'asse verticale (y e height) corrispondono all'altezza
     media dei caratteri della fonte del Dialog-Box divise per 8.
     Questo serve a mantenere un rapporto di proporzioni ideale con la fonte
     impostata nel Dialog-Box, proprio quello che tu vorresti evitare (non
     capisco il perché), di conseguenza .........
     Se vuoi saperne di piů a proposito, ti consiglio di guardarti l'help in
     linea delle funzioni:
         LONG GetDialogBaseUnits( VOID );
         BOOL MapDialogRect( HWND hDlg , LPRECT lpRect );
         etc.
Saluti, Neil

in questo caso gestire il messaggio WM_CTLCOLOR
    [snip]
Attenzione che, come da recentissimo thread su questo stesso
gruppo, questo non funziona come uno si aspetta per bottoni in
stile "pushbutton" (che probabilmente e` quel che uno intende se
dice "bottone standard"); per controllare il colore di sfondo in questo
caso occorre invece usare per il pushbutton lo stile owner-draw.
Ho postato un dettagliato esempio della cosa sul thread in questione,
mi pare nel corso della settimana scorsa.
Visitando 
www.dejanews.com
 e usando la funzione di power search
e` molto facile consultare post apparsi in questo (o qualsiasi altro)
gruppo cercandoli secondo svariati criteri.
Alex

Ti ringrazio per l'esauriente risposta. Il mio problema č nato dal fatto che
ho scritto una Dialog Based Application, in cui tutte le dimensioni sono
state calcolate per una dimensione della finestra di dialogo principale di
800x600, risoluzione minima necessaria per lavorare con questa applicazione.
Io lavoravo su un 17', con una risoluzione di 1024x768, caratteri grandi.
Quando ho testato il tutto nella situazione reale dell'utente, cioč 800x600
caratteri piccoli, con mia enorme sorpresa questa fuoriusciva dallo schermo,
e i pulsanti di tipo bitmap (ho utilizzato dei radio button e check box con
gli stili Bitmap e Push-like) erano diventati piů piccoli, tagliando le
bitmap. Mi chiedevo quindi se c'era un modo per implementare il tutto in
modo che se cambio risoluzione non ho piů quelle sorprese. E poi, se il
cliente che utilizza l'applicazione si compra un 17' (o piů) e va a 1024x768
con caratteri grandi?

Grazie per avermi risposto. Ho trovato quello che mi hai indicato. Mi è
stato molto utile.


Ciao Matteo, come detto, il fatto di usare delle coordinate logiche serve
appunto per non ritrovarsi con dei button il cui testo fuori esce dallo
stesso quando viene usata una font diversa da quella usata durante la
creazione.
Se hai dei problemi con i button che contengono dei Bitmap, ti consiglio
di reimpostare la loro grandezza (eventualmente posizione) in fase
di run-time e cioé gestendo OnInitDialog (WM_INITDIALOG).
Le funzioni che puoi usare per variare la dimensione di un Control,
sono diverse, io personalmente uso volentieri SetWindowPos, anche
se non é la più compatta, perché permette, tramite i flag SWP_NOSIZE
e SWP_NOMOVE, di variare solo la posizione o solo l'ampiezza.
Per sapere l'ampiezza da impostare ai tuoi button in modo che contengano
la Bitmap assegnata, puoi usare:
BOOL CMyDialog::OnInitDialog()
{
BITMAP bm;
HBITMAP hBitmap;
    CDialog::OnInitDialog();
    ....
    ....
    hBitmap = (HBITMAP ) SendDlgItemMessage( IDC_MYBUTTON , BM_GETIMAGE,
                                       IMAGE_BITMAP , 0 );
    GetObject( hBitmap ,sizeof( BITMAP ), &bm );
    GetDlgItem( IDC_MYBUTTON )->SetWindowPos( NULL, 0 , 0 ,
                                                    bm.bmWidth, bm.bmHeight,
                                                    SWP_NOMOVE |
                                                    SWP_NOZORDER );
    ....
    ....
    return( TRUE );
}
hBitmap é ovviamente l'handle del Bitmap che hai impostato al tuo button,
mentre le dimensioni usate per SetWindowPos, possono essere definite
a tuo piacimento, come potrai notare, il fatto di aver specificato
SWP_NOMOVE fà si che il button resti nella posizione precedente
(dovrebbe essere la soluzione ideale).
IDC_MYBUTTON é invece l'ID del tuo button, ripeti il tutto per il numero di
buttons che devono visualizzare un Bitmap.
Saluti, Neil