Newsgroup: it.comp.programmare.win32
Titolo: [?] Allacciare uno skin ai controlli di standard

Salve a tutti !
Mi incuriosice sapere come fanno i programmi tipo windowblinds
(
www.stardock.com
) a modificare l'aspetto dei controlli esistenti.
Qualcuno mi saprebbe spiegare come é possibile farlo ?
(per favore non datemi risposte tipo "crea un tuo activex" perché non é
quello che ho in mente)
Ho notato che anche in fase di sviluppo, quando si inserisce un bottone di
comando, esso appare con l'aspetto modificato, quindi presumo che il
programma agisca a livello di sistema operativo, ma come sapra' cosa si sta
modificando ?
Magari i controlli standard si trovano in una dll e basta modificare quella
?
Grazie mille per aver letto il mio messaggio
Dave

Prova a dare un'occhiata su 
www.codeguru.com
.
Bob Rock
"-> Dave <-" <da...@hate.spam> wrote in message
news:98tp90$mbc$1...@news1.sunrise.ch...


Prova a dare un'occhiata su 
www.codeguru.com
.
Bob Rock
"-> Dave <-" <da...@hate.spam> wrote in message
news:98tp90$mbc$1...@news1.sunrise.ch...


Skin? Beh, devi:
I realizzare un file immagine, tipo .bmp
II utilizzare un owner draw control
III rispondere ai messaggi WM_DRAWITEM e WM_MESAUREITEM
IIII utilizzare la bitmap per trasformare il controllo.
----------------------------------------------------------------------------
-
Guarda anche 
www.codeguru.com
 poichè vi è un articolo con esempi VC++ MFC di
un Button che utilizza 3 immagini diverse a seconda dello stato (normale,
mouseover, premuto).

Silvano Talotti ha scritto:

Non credo... secondo me quello che lui vuol fare è modificare le classi dei controlli
globali per tutte le applicazioni di Windows e non per una sua in particolare.

 ?
no.
ogni bottone, o qualsiasi altra finestra, ha una sua procedura standard.
andando a modificare questa window-procedure, puoi cambiare quello che succede durante il ridisegno, o quello che succede se
l'utente fa click.
alla creazione di un controllo figlio quale un bottone o una finestra windows già sa qual'è la procedura che deve usare.
sei TU che devi dirgli di usarne un altra. questo si chiama subclassing.
ti faccio un breve esempio:
WNDPROC StaticProc;
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
    case WM_CREATE:
    hwndCtl = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("Static"), "MyControl",
    SS_BLACKRECT | WS_CHILD | WS_VISIBLE, 5, 25, 382, 22, hWnd,
    (HMENU)IDC_MYCONTROL, g_hInst, NULL);
    StaticProc = (WNDPROC)GetWindowLong(hwndCtl, GWL_WNDPROC);
    SetWindowLong(hwndCtl, GWL_WNDPROC, (LONG)MyStaticProc);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc(hWnd, Msg,wParam, lParam);
    }
}
LRESULT CALLBACK MyStaticProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    RECT rc;
    switch(Msg)
    {
    case WM_PAINT:
    BeginPaint(hWnd, &ps);
    GetClientRect(hWnd, &rc);
    // operazioni di disegno che voglio io...
    EndPaint(hWnd, &ps);
    return 0;
    default:
    return (*StaticProc)(hWnd, Msg, wParam, lParam);
    }
}
in questo modo ho creato un controllo static e l'ho subclassato.
gli ho impostato come nuova procedura la callback MyStaticProc, dove l'unico messaggio che mi serviva modificare era WM_PAINT, e lì
faccio le mie operazioni di disegno. gli altri messaggi li lascio fare alla vecchia procedura.
però questo non è molto utile, perchè riguarda una singola finestra.
serve giusto a darti un'idea di cosa sia il subclassing.
quello che serve fare è molto simile:
modificare la procedura _NON_ della singola finestra, ma della CLASSE (in questo caso di "Static").
lo puoi fare con SetClassLong allo stesso modo con cui io ho usato SetWindowLong.
buon divertimento
ciao
xaero

 wrote in message
990bka$3sltf$1...@ID-51253.news.dfncis.de...


> Xaero, é proprio quello che cercavo, grazie ancora !
non è tutto qui...
intanto eccoti la sez remarks di SetClassLong:
Remarks
If you use the SetClassLong function and the GCL_WNDPROC index to replace the window procedure, the window procedure must conform to
the guidelines specified in the description of the WindowProc callback function.
Calling SetClassLong with the GCL_WNDPROC index creates a subclass of the window class that affects all windows subsequently created
with the class. An application can subclass a system class, but should not subclass a window class created by another process.
Reserve extra class memory by specifying a nonzero value in the cbClsExtra member of the WNDCLASSEX structure used with the
RegisterClassEx function.
Use the SetClassLong function with care. For example, it is possible to change the background color for a class by using
SetClassLong, but this change does not immediately repaint all windows belonging to the class.
poi non credo sia semplice come sembra la cosa.
probabilmente i tizi della stardock usano qualche hook di sistema per riuscire a cambiare l'apparenza a (quasi) tutto. però in
questo campo mi trovi completamente impreparato.
sorry  :)
ciao
xaero




 qualche sito, o da qualche libro   ?
da MSDN.
ieri infatti ho postato un altro messaggio in risposta a quello che ho scritto, ma non è arrivato... cmq ti avevo riportato la pag
della reference riguardo SetClassLong.
è bene che gli vai a dare un'occhiata, perchè non sono sicuro che tutto sia facile come sembra... non ho mai sperimentato niente del
genere fin'ora.
ciao
xaero

>>>>> ""D" == "-> Dave <-" <da...@hate.spam> writes:
"D> Salve a tutti !
"D> Mi incuriosice sapere come fanno i programmi tipo windowblinds
"D> (
www.stardock.com
) a modificare l'aspetto dei controlli esistenti.
Con buona  probabilità utilizzano  il subclassing, inserendo  del loro
codice nel flusso di gestione dei messaggi di "resa" degli oggetti.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )