|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
[APIwin32] Colorare sfondo di un control
Dovrei impostare lo sfondo di un'altro colore da quello predefinito di alcuni controlli (dialog, pulsanti) creati tramite un resource.
Esiste una Winapi che subclassa il campo hbrBackground facilitando il compito? Grazie
__________________
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prova questo:
http://msdn.microsoft.com/library/de...tdraw_433m.asp |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
- WM_CTLCOLORBTN - WM_CTLCOLOREDIT - WM_CTLCOLORLISTBOX - WM_CTLCOLORSCROLLBAR - WM_CTLCOLORSTATIC Questi messaggi vengono inviati alla finestra parente del controllo per poterne modificare l'aspetto (tipicamente i colori di testo/sfondo). - WM_CTLCOLORDLG Questo messaggio viene inviato alla dialog, per lo stesso motivo dei precedenti. ESEMPIO: Da qualche parte nel tuo sorgente puoi mettere una variabile globale: Codice:
HBRUSH g_hBrushBg; Codice:
g_hBrushBg = CreateSolidBrush (RGB (255, 255, 0)); Codice:
case WM_CTLCOLORLISTBOX:
{
HWND hWnd = (HWND) lParam;
HDC hDc = (HDC) wParam;
switch (GetDlgCtrlID (hWnd))
{
case IDC_LISTBOX:
{
SetBkMode (hDc, TRANSPARENT);
return (BOOL) g_hBrushBg;
}
}
}
break;
Codice:
DeleteObject (g_hBrushBg); Se usi SetBkMode (hDc, TRANSPARENT), il testo scritto sul controllo ha lo sfondo trasparente (quindi tutto lo sfondo ha il colore del brush), altrimenti ne puoi impostare uno diverso con la funzione SetBkColor.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
grazie, appena ho un po' di tempo provo e vi faccio sapere
__________________
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
ho un problema
per impostare lo sfondo della dialog devo ricavare la sua DC o basta conoscere l'handle? Magari mi potreste spiegare la differenza tra DC e HANDLE? ho provato ad utilizzare la funzione che mi ha linkato cionci mettendo l'handle della dialog nel primo parametro (ho fatto che la funzione venga eseguita al ricevimento del messaggio WM_INITDIALOG), ma sembra non funzionare Magari un piccolo esempio?
__________________
|
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Un HDC è un handle, come anche un HWND è un handle. Ma ce ne sono tanti altri: handle di font, di brush, di icone, di file, di menù, ecc... Un HDC, in modo particolare, è un handle di un Device Context (DC) cioè un handle che permette di disegnare su una superficie. Un HDC può fare riferimento all'area disegnabile di una finestra a video ma si può ottenere anche un HDC relativo all'area disegnabile per stampare su una stampante. Un HWND invece è un handle di una finestra. Qualunque finestra, che sia una top-window, una child, comprese le dialog box. Quote:
Quindi SetBkColor non cambia lo sfondo di una finestra. Per l'esempio ... te l'avevo già fornito io sopra!! Quindi: crei un brush che alla fine del programma poi devi distruggere. Nella tua dialog procedure usi un case con questo codice: Codice:
case WM_CTLCOLORDLG:
{
HWND hWnd = (HWND) lParam;
HDC hDc = (HDC) wParam;
return (BOOL) g_hBrushBg;
}
break;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Grazie, ho provato è funziona perfettamente
Quindi da quello che ho capito questi messaggi vengono inviati dal sistema quando deve ridisegnare lo sfondo di un controllo?
__________________
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Un'altra domanda, con quale api posso subclassare il campo che determina l'icona da 16px (quella che stà nel titolo in pratica) della dialog?
__________________
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Devi caricare (all'inizio della applicazione) 2 icone, una grande e una piccola, ottendo così 2 HICON e poi le imposti nella dialog con il messaggio WM_SETICON. Io tipicamente faccio una cosa del genere: Codice:
HICON g_hIconLarge;
HICON g_hIconSmall;
...
...
/* Nella funzione WinMain */
g_hIconLarge = LoadImage (hInstance, MAKEINTRESOURCE (IDI_APP), IMAGE_ICON,
GetSystemMetrics (SM_CXICON),
GetSystemMetrics (SM_CYICON), 0);
g_hIconSmall = LoadImage (hInstance, MAKEINTRESOURCE (IDI_APP), IMAGE_ICON,
GetSystemMetrics (SM_CXSMICON),
GetSystemMetrics (SM_CYSMICON), 0);
...
DestroyIcon (g_hIconLarge);
DestroyIcon (g_hIconSmall);
Codice:
SendMessage (hDlg, WM_SETICON, ICON_SMALL, (LPARAM) g_hIconSmall); SendMessage (hDlg, WM_SETICON, ICON_BIG, (LPARAM) g_hIconLarge);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
L'icona più grande è quella che si vede nella lista premendo alt+F4?
Ho provato poi ad impostare lo sfondo di un button tramite il messaggio WM_CTLCOLORBTN, ma non succede nulla
__________________
|
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
È scritto chiaramente che per i pulsanti "normali", il brush che viene ritornato a seguito del WM_CTLCOLORBTN viene bellamente ignorato! Il pulsante, per poter gestire il brush custom, deve avere lo stile BS_OWNERDRAW. Questo però .... comporta il fatto che è la dialog che deve ridisegnare completamente il pulsante!!! Infatti la dialog, in questo caso, riceve il messaggio WM_DRAWITEM ed è suo compito ridisegnare per intero il pulsante. E per intero intendo dire che devi ridisegnare il testo, la smussatura del pulsante, il bordino di selezione, ecc... Purtroppo è così ...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
), ma intendevo alt+TAB Quote:
__________________
Ultima modifica di 17Qwerty71 : 16-02-2006 alle 17:41. |
||
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Scusa, un'altra cosa
Il radiobutton che messaggio invia quando gli deve essere ridisegnato lo sfondo? WM_CTLCOLORBTN non mi sembra lo invii da quello che ho provao
__________________
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Ho notato che i radiobutton inviano il messaggio WM_CTLCOLORSTATIC, cmq ci sono riuscito
__________________
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Ho provato a modificare l'icona 16x16 della dialog (mantenedo lo stesso percorso), ma rimane l'icona vecchia, possibile?
__________________
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
nel resource ho definito così l'icona:
Codice PHP:
Codice PHP:
Codice PHP:
__________________
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
ICON16 dove/come l'hai definito?
Questa chiamata: Codice:
g_hIconSmall = LoadImage(hThisInstance, ICON16, IMAGE_ICON, GetSystemMetrics (SM_CXSMICON), GetSystemMetrics (SM_CYSMICON), 0); Anche qui: Codice:
DialogBoxParam(hThisInstance, "DialogMain", 0, DlgMainProc, 0); Ma questo è il tuo codice? Mi sembra difficile che possa venire compilato, addirittura.. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
LoadImage l'ho usata così come mi è stata detta qualche post fa Cmq provo, grazie
__________________
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:20.



















