Accueil > > > COMBOBOX EN COULEURS, LECTURE SEULE...(API)
COMBOBOX EN COULEURS, LECTURE SEULE...(API)
Information sur la source
Description
Ce code source montre comment personnaliser un ComboBox. On peut choisir la couleur de texte et de fond de ses deux composantes : L'Edit et la ListBox. On peut aussi le mettre en lecture seule, désactiver son menu contextuel ou le rendre non sélectionnable. Tout cela grâce au sous-classement. Projet réalisé sous Visual 6 et compilable aussi sous Dev-C++ 4.9.9.2. Programme testé sans problème sous Window XP. N'hésitez pas à signaler un oubli, un bug ou un truc à améliorer. Merci.
Source
-
- #include <windows.h>
-
- // Déclarer les WNDPROCs de sous-classement:
- WNDPROC OldEditProc,OldComboProc;
- // Déclarer les 2 tableau de couleurs de texte et de fond:
- COLORREF Couleur[6];
- HBRUSH Fond[6];
- // Déclarer les index des couleurs:
- int CouleurTexteEdit, CouleurFondEdit,CouleurTexteList,CouleurFondList;
- // Déclarer les drapeaux:
- int MenuContextuel,LectureSeule, Selectionnable;
-
- //------------------ Procédure de sous-classement du ComboBox -----------------//
- LRESULT CALLBACK ComboProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- // Traitement du message WM_CTLCOLOREDIT :
- if (message==WM_CTLCOLOREDIT )
- {
- // Définir la couleur de texte de l'Edit:
- SetTextColor((HDC)wParam,Couleur[CouleurTexteEdit]);
- // Définir la couleur d'arrière plan du texte:
- SetBkColor((HDC)wParam,Couleur[CouleurFondEdit]);
- // Définir la couleur de fond:
- return (BOOL) Fond[CouleurFondEdit];
- }
- // Traitement du message WM_CTLCOLORLISTBOX:
- if (message==WM_CTLCOLORLISTBOX)
- {
- // Définir la couleur de texte de la ListBox:
- SetTextColor((HDC)wParam,Couleur[CouleurTexteList]);
- // Définir la couleur d'arrière plan du texte:
- SetBkColor((HDC)wParam,Couleur[CouleurFondList]);
- // Définir la couleur de fond:
- return (BOOL) Fond[CouleurFondList];
- }
- // Appeler la procédure originale:
- return CallWindowProc(OldComboProc, hwnd, message, wParam, lParam);
- }
- //-------------------------------------------------------------------------//
-
- //------------- Procédure de sous-classement de l'Edit du ComboBox ----------------//
- LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- // Ignorer les touches du clavier si lecture seule:
- if (message==WM_KEYDOWN && LectureSeule && wParam==VK_DELETE ) return 0;
- if (message==WM_CHAR && LectureSeule && wParam!=VK_RETURN && wParam!=VK_ESCAPE ) return 0;
- // Empêcher selection si bouton gauche appuyé avec déplacement de la souris:
- if (message==WM_MOUSEMOVE && wParam==MK_LBUTTON && !Selectionnable) return 0;
- // Ignorer double clic et EM_SETSEL si non sélectionnable:
- if (( message==WM_LBUTTONDBLCLK || message==EM_SETSEL) && !Selectionnable) return 0;
- // Ignorer clic droit si Menu contextuel désactivé:
- if (message==WM_RBUTTONDOWN && !MenuContextuel) return 0;
- // Empecher couper, coller, annuler ou supprimer en lecture seule:
- if ((message==WM_PASTE || message==WM_CUT || message==WM_UNDO || message==WM_CLEAR) && LectureSeule) return 0;
- // Appeler la procédure originale:
- return CallWindowProc(OldEditProc, hwnd, message, wParam, lParam);
- }
- //----------------------------------------------------------------------------------//
-
-
- //------------------- Procédure de notre fenêtre principale -----------------------//
- LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
- {
- // Déclaration des variables:
- static HWND hMenu,hLect,hSel, hQuitter,hCadre1,hCadre2,hCadre3,hCadre4,hCadre5,hCadre6,hCombo;
- static HWND hRadioEditText[6],hRadioEditFond[6],hRadioListText[6],hRadioListFond[6];
- int i;
- // Interception et traitement des messages:
- switch(messg)
- {
- case WM_CREATE:
- {
- // Ecrire le titre dans la barre de titre de la fenêtre principale:
- SetWindowText(hWnd," ComboBox en couleurs, en lecture seule, sans menu contextuel et non sélectionnable.");
- // Dessiner les cadres qui délimintent les différentes zones:
- hCadre1=CreateWindow("BUTTON"," EditBox ",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,10,130,300,290,hWnd,0,0,0);
- hCadre2=CreateWindow("BUTTON"," ListBox ",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,325,130,300,200,hWnd,0,0,0);
- hCadre3=CreateWindow("BUTTON","Texte",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER ,20,150,130,170,hWnd,0,0,0);
- hCadre4=CreateWindow("BUTTON","Fond",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,170,150,130,170,hWnd,0,0,0);
- hCadre5=CreateWindow("BUTTON","Texte",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER ,335,150,130,170,hWnd,0,0,0);
- hCadre6=CreateWindow("BUTTON","Fond",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,485,150,130,170,hWnd,0,0,0);
- // Choisir des noms pour les RadioButtons:
- char *labels[]={"Blanc","Noir","Rouge","Vert","Bleu","Jaune"};
- // Créer les 24 RadioButtons dans 4 boucles de 6 chacune:
- for (i=0;i<6;i++) hRadioEditText[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,30,170+i*25,70,20,hWnd,0,0,0);
- for (i=0;i<6;i++) hRadioEditFond[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,180,170+i*25,70,20,hWnd,0,0,0);
- for (i=0;i<6;i++) hRadioListText[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,345,170+i*25,70,20,hWnd,0,0,0);
- for (i=0;i<6;i++) hRadioListFond[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,495,170+i*25,70,20,hWnd,0,0,0);
- // Créer les trois CheckBoxes:
- hMenu=CreateWindow("BUTTON","Menu Contextuel",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,30,340,150,24,hWnd,0,0,0);
- hLect=CreateWindow("BUTTON","Lecture seule",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,30,365,150,24,hWnd,0,0,0);
- hSel=CreateWindow("BUTTON","Sélectionnable",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,30,390,150,24,hWnd,0,0,0);
- // Créer le bouton "Quitter":
- hQuitter=CreateWindow("BUTTON","Quitter",WS_CHILD | WS_VISIBLE,430,375,90,20,hWnd,0,0,0);
- // Créer le ComboBox:
- hCombo=CreateWindow("COMBOBOX",0,WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN ,10,15,616,400,hWnd,0,0,0);
- // Remplacer la procédure originale du ComboBox par celle de notre procédure de sous-classement:
- OldComboProc= (WNDPROC) SetWindowLong(hCombo, GWL_WNDPROC, (LPARAM)ComboProc);
- // Remplacer la procédure originale de l'Edit du ComboBox par celle de notre procédure de sous-classement:
- OldEditProc= (WNDPROC) SetWindowLong(GetWindow(hCombo,GW_CHILD), GWL_WNDPROC, (LPARAM)EditProc);
- // Selectionner le mode étendu pour le ComboBox:
- SendMessage(hCombo,CB_SETEXTENDEDUI,1,0);
- // Mettre le texte d'accueil dans le combo:
- SetWindowText(hCombo," Je suis un ComboBox multicolore");
- // Ajouter cinq élément dans le ComboBox:
- char *elem[]={" Premier élément"," Deuxième élément"," Troisième élément"," Quatrième élément"," Cinquième élément"};
- for (i=4;i>-1;i--) SendMessage(hCombo, CB_INSERTSTRING,0,(LPARAM) elem[i]);
- // Définir les couleurs utilisées pour la couleur du texte et son arrière plan:
- Couleur[0]=RGB(255,255,255);Couleur[1]=RGB(0,0,0);Couleur[2]=RGB(255,0,0);
- Couleur[3]=RGB(0,255,0);Couleur[4]=RGB(0,0,255);Couleur[5]=RGB(255,255,0);
- // Créer des BRUSHs pour les couleurs de fond:
- Fond[0]=CreateSolidBrush(Couleur[0]);Fond[1]=CreateSolidBrush(Couleur[1]);
- Fond[2]=CreateSolidBrush(Couleur[2]);Fond[3]=CreateSolidBrush(Couleur[3]);
- Fond[4]=CreateSolidBrush(Couleur[4]);Fond[5]=CreateSolidBrush(Couleur[5]);
- // Initialiser les différents index couleur:
- CouleurTexteEdit=5;CouleurFondEdit=4;CouleurTexteList=2;CouleurFondList=5;
- // Cocher les RadioButtons correspondants:
- SendMessage(hRadioEditText[5], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
- SendMessage(hRadioEditFond[4], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
- SendMessage(hRadioListText[2], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
- SendMessage(hRadioListFond[5], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
- // Cocher le CheckBox du menu contextuel:
- SendMessage(hMenu, BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
- // Initialiser le drapeau menucontexteul:
- MenuContextuel=(int)SendMessage(hMenu,BM_GETSTATE,0,(LPARAM)0)&1;
- // Cocher le CheckBox de la selection:
- SendMessage(hSel, BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
- // Initialiser le drapeau selection:
- Selectionnable=(int)SendMessage(hSel,BM_GETSTATE,0,(LPARAM)0)&1;
- // Mettre le focus dans l'Edit du ComboBox:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin de la ligne de l'Edit:
- SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
- // Obtenir la police MS Sans Serif:
- HGDIOBJ font=GetStockObject (DEFAULT_GUI_FONT);
- // Obtenir le HWND du premier controle enfant:
- HWND child=GetWindow(hWnd,GW_CHILD);
- do
- {
- // Définir la nouvelle police pour le controle:
- SendMessage(child,WM_SETFONT,(WPARAM)font,0);
- // Obtenir le HWND du controle suivant:
- child=GetWindow(child,GW_HWNDNEXT);
- // Répéter tant que le HWND obtenu n'est pas nul:
- }while (child);
-
- break;
- }
-
- case WM_COMMAND:
-
- // Déterminer lequel des six boutons de choix de la couleur du texte de l'Edit est cliqué:
- for (i=0;i<6;i++)
- {
- if (lParam == (long)hRadioEditText[i])
- {
- // Actualiser l'index de la couleur:
- CouleurTexteEdit=i;
- // Forcer le redessin de l'Edit:
- InvalidateRect(hCombo,0,1);
- // Mettre le focus dans l'Edit:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1,(LPARAM) -1);
- break;
- }
- }
- // Déterminer lequel des six boutons de choix de la couleur de fond de l'Edit est cliqué:
- for (i=0;i<6;i++)
- {
- if (lParam == (long)hRadioEditFond[i])
- {
- // Actualiser l'index de la couleur de fond de l'Edit:
- CouleurFondEdit=i;
- // Forcer le redessin de l'Edit:
- InvalidateRect(hCombo,0,1);
- // Mettre le focus dans l'Edit:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
- break;
- }
- }
- // Déterminer lequel des six boutons de choix de la couleur du texte de la ListBox est cliqué:
- for (i=0;i<6;i++)
- {
- if (lParam == (long)hRadioListText[i])
- {
- // Actualiser l'index de la couleur de texte de la ListBox:
- CouleurTexteList=i;
- // Mettre le focus dans l'Edit:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL, (WPARAM)-1,(LPARAM) -1);
- break;
- }
- }
- // Déterminer lequel des six boutons de choix de la couleur de fond de la ListBox est cliqué:
- for (i=0;i<6;i++)
- {
- if (lParam == (long)hRadioListFond[i])
- {
- // Actualiser l'index de la couleur de fond de la ListBox:
- CouleurFondList=i;
- // Mettre le focus dans l'Edit:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
- break;
- }
- }
- // Clic sur le CheckBox "Menu contextuel":
- if((HWND)lParam == hMenu)
- {
- // Actualiser la valeur du drapeau menucontextuel puisque son checkbox est cliqué:
- MenuContextuel=(int)SendMessage(hMenu,BM_GETSTATE,0,0)&1;
- // Mettre le focus dans l'Edit du ComboBox:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
- break;
- }
- // Clic sur le CheckBox "Lecture seule":
- if((HWND)lParam == hLect)
- {
- // Actualiser la valeur du drapeau lectureseule puisque son checkbox est cliqué:
- LectureSeule=(int)SendMessage(hLect,BM_GETSTATE,0,0)&1;
- // Mettre le focus dans l'Edit du ComboBox:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
- break;
- }
- // Clic sur le CheckBox "Séléctionnable":
- if((HWND)lParam == hSel)
- {
- // Actualiser la valeur du drapeau selection puisque son checkbox est cliqué:
- Selectionnable=(int)SendMessage(hSel,BM_GETSTATE,0,0)&1;
- // Mettre le focus dans l'Edit du ComboBox:
- SetFocus(GetWindow(hCombo,GW_CHILD));
- // Mettre le curseur à la fin du texte:
- if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
- break;
- }
- // Clic sur le bouton "Quitter":
- if((HWND)lParam == hQuitter)
- {
- // Envoi du message WM_CLOSE à notre fenêtre:
- SendMessage(hWnd,WM_CLOSE,0,0);
- }
- break;
-
-
- case WM_CLOSE:
- // Détruire tous les HBRUSHs:
- for (i=0;i<6;i++) DeleteObject(Fond[i]);
- // Détruire la fenêtre:
- DestroyWindow(hWnd);
- break;
-
- case WM_DESTROY:
- // Envoi du message de fermeture du programme:
- PostQuitMessage(0);
- break;
-
- default:
- //Retour à la procédure par défaut:
- return( DefWindowProc( hWnd, messg, wParam, lParam ) );
- }
- return 0;
- }
- //---------------------------------------------------------------------------------//
-
- //------------------------------ Fonction WinMain ---------------------------------//
- int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
- {
- // Déclarer notre classe de fenêtre et définir ses membres:
- WNDCLASS wc;
- char NomClasse[] = "ColorCombo";
- wc.lpszClassName = NomClasse;
- wc.hInstance = hInst;
- wc.lpfnWndProc = WndProc;
- wc.hCursor = LoadCursor( 0, IDC_ARROW );
- wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
- wc.lpszMenuName = 0;
- wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
- wc.style = 0;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- // Enregistrer la classe de notre fenêtre:
- if (!RegisterClass(&wc)) return 1;
- // Créer notre fenêtre principale:
- HWND hWnd = CreateWindow( NomClasse,"",WS_SYSMENU | WS_MINIMIZEBOX ,0,0,640,460, 0, 0, hInst,0);
- // Montrer la fenêtre:
- ShowWindow(hWnd, nCmdShow );
- UpdateWindow( hWnd );
- // Boucle des messages:
- MSG Msg;
- while( GetMessage(&Msg, 0, 0, 0))
- {
- TranslateMessage( &Msg );
- DispatchMessage( &Msg );
- }
- // Quitter le programme:
- return( Msg.wParam);
- }
- //-------------------------------------------------------------------------------------//
-
#include <windows.h>
// Déclarer les WNDPROCs de sous-classement:
WNDPROC OldEditProc,OldComboProc;
// Déclarer les 2 tableau de couleurs de texte et de fond:
COLORREF Couleur[6];
HBRUSH Fond[6];
// Déclarer les index des couleurs:
int CouleurTexteEdit, CouleurFondEdit,CouleurTexteList,CouleurFondList;
// Déclarer les drapeaux:
int MenuContextuel,LectureSeule, Selectionnable;
//------------------ Procédure de sous-classement du ComboBox -----------------//
LRESULT CALLBACK ComboProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Traitement du message WM_CTLCOLOREDIT :
if (message==WM_CTLCOLOREDIT )
{
// Définir la couleur de texte de l'Edit:
SetTextColor((HDC)wParam,Couleur[CouleurTexteEdit]);
// Définir la couleur d'arrière plan du texte:
SetBkColor((HDC)wParam,Couleur[CouleurFondEdit]);
// Définir la couleur de fond:
return (BOOL) Fond[CouleurFondEdit];
}
// Traitement du message WM_CTLCOLORLISTBOX:
if (message==WM_CTLCOLORLISTBOX)
{
// Définir la couleur de texte de la ListBox:
SetTextColor((HDC)wParam,Couleur[CouleurTexteList]);
// Définir la couleur d'arrière plan du texte:
SetBkColor((HDC)wParam,Couleur[CouleurFondList]);
// Définir la couleur de fond:
return (BOOL) Fond[CouleurFondList];
}
// Appeler la procédure originale:
return CallWindowProc(OldComboProc, hwnd, message, wParam, lParam);
}
//-------------------------------------------------------------------------//
//------------- Procédure de sous-classement de l'Edit du ComboBox ----------------//
LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Ignorer les touches du clavier si lecture seule:
if (message==WM_KEYDOWN && LectureSeule && wParam==VK_DELETE ) return 0;
if (message==WM_CHAR && LectureSeule && wParam!=VK_RETURN && wParam!=VK_ESCAPE ) return 0;
// Empêcher selection si bouton gauche appuyé avec déplacement de la souris:
if (message==WM_MOUSEMOVE && wParam==MK_LBUTTON && !Selectionnable) return 0;
// Ignorer double clic et EM_SETSEL si non sélectionnable:
if (( message==WM_LBUTTONDBLCLK || message==EM_SETSEL) && !Selectionnable) return 0;
// Ignorer clic droit si Menu contextuel désactivé:
if (message==WM_RBUTTONDOWN && !MenuContextuel) return 0;
// Empecher couper, coller, annuler ou supprimer en lecture seule:
if ((message==WM_PASTE || message==WM_CUT || message==WM_UNDO || message==WM_CLEAR) && LectureSeule) return 0;
// Appeler la procédure originale:
return CallWindowProc(OldEditProc, hwnd, message, wParam, lParam);
}
//----------------------------------------------------------------------------------//
//------------------- Procédure de notre fenêtre principale -----------------------//
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
{
// Déclaration des variables:
static HWND hMenu,hLect,hSel, hQuitter,hCadre1,hCadre2,hCadre3,hCadre4,hCadre5,hCadre6,hCombo;
static HWND hRadioEditText[6],hRadioEditFond[6],hRadioListText[6],hRadioListFond[6];
int i;
// Interception et traitement des messages:
switch(messg)
{
case WM_CREATE:
{
// Ecrire le titre dans la barre de titre de la fenêtre principale:
SetWindowText(hWnd," ComboBox en couleurs, en lecture seule, sans menu contextuel et non sélectionnable.");
// Dessiner les cadres qui délimintent les différentes zones:
hCadre1=CreateWindow("BUTTON"," EditBox ",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,10,130,300,290,hWnd,0,0,0);
hCadre2=CreateWindow("BUTTON"," ListBox ",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,325,130,300,200,hWnd,0,0,0);
hCadre3=CreateWindow("BUTTON","Texte",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER ,20,150,130,170,hWnd,0,0,0);
hCadre4=CreateWindow("BUTTON","Fond",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,170,150,130,170,hWnd,0,0,0);
hCadre5=CreateWindow("BUTTON","Texte",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER ,335,150,130,170,hWnd,0,0,0);
hCadre6=CreateWindow("BUTTON","Fond",BS_GROUPBOX | WS_CHILD | WS_VISIBLE | BS_CENTER,485,150,130,170,hWnd,0,0,0);
// Choisir des noms pour les RadioButtons:
char *labels[]={"Blanc","Noir","Rouge","Vert","Bleu","Jaune"};
// Créer les 24 RadioButtons dans 4 boucles de 6 chacune:
for (i=0;i<6;i++) hRadioEditText[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,30,170+i*25,70,20,hWnd,0,0,0);
for (i=0;i<6;i++) hRadioEditFond[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,180,170+i*25,70,20,hWnd,0,0,0);
for (i=0;i<6;i++) hRadioListText[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,345,170+i*25,70,20,hWnd,0,0,0);
for (i=0;i<6;i++) hRadioListFond[i]=CreateWindow("BUTTON",labels[i],BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP*!i,495,170+i*25,70,20,hWnd,0,0,0);
// Créer les trois CheckBoxes:
hMenu=CreateWindow("BUTTON","Menu Contextuel",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,30,340,150,24,hWnd,0,0,0);
hLect=CreateWindow("BUTTON","Lecture seule",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,30,365,150,24,hWnd,0,0,0);
hSel=CreateWindow("BUTTON","Sélectionnable",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,30,390,150,24,hWnd,0,0,0);
// Créer le bouton "Quitter":
hQuitter=CreateWindow("BUTTON","Quitter",WS_CHILD | WS_VISIBLE,430,375,90,20,hWnd,0,0,0);
// Créer le ComboBox:
hCombo=CreateWindow("COMBOBOX",0,WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN ,10,15,616,400,hWnd,0,0,0);
// Remplacer la procédure originale du ComboBox par celle de notre procédure de sous-classement:
OldComboProc= (WNDPROC) SetWindowLong(hCombo, GWL_WNDPROC, (LPARAM)ComboProc);
// Remplacer la procédure originale de l'Edit du ComboBox par celle de notre procédure de sous-classement:
OldEditProc= (WNDPROC) SetWindowLong(GetWindow(hCombo,GW_CHILD), GWL_WNDPROC, (LPARAM)EditProc);
// Selectionner le mode étendu pour le ComboBox:
SendMessage(hCombo,CB_SETEXTENDEDUI,1,0);
// Mettre le texte d'accueil dans le combo:
SetWindowText(hCombo," Je suis un ComboBox multicolore");
// Ajouter cinq élément dans le ComboBox:
char *elem[]={" Premier élément"," Deuxième élément"," Troisième élément"," Quatrième élément"," Cinquième élément"};
for (i=4;i>-1;i--) SendMessage(hCombo, CB_INSERTSTRING,0,(LPARAM) elem[i]);
// Définir les couleurs utilisées pour la couleur du texte et son arrière plan:
Couleur[0]=RGB(255,255,255);Couleur[1]=RGB(0,0,0);Couleur[2]=RGB(255,0,0);
Couleur[3]=RGB(0,255,0);Couleur[4]=RGB(0,0,255);Couleur[5]=RGB(255,255,0);
// Créer des BRUSHs pour les couleurs de fond:
Fond[0]=CreateSolidBrush(Couleur[0]);Fond[1]=CreateSolidBrush(Couleur[1]);
Fond[2]=CreateSolidBrush(Couleur[2]);Fond[3]=CreateSolidBrush(Couleur[3]);
Fond[4]=CreateSolidBrush(Couleur[4]);Fond[5]=CreateSolidBrush(Couleur[5]);
// Initialiser les différents index couleur:
CouleurTexteEdit=5;CouleurFondEdit=4;CouleurTexteList=2;CouleurFondList=5;
// Cocher les RadioButtons correspondants:
SendMessage(hRadioEditText[5], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
SendMessage(hRadioEditFond[4], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
SendMessage(hRadioListText[2], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
SendMessage(hRadioListFond[5], BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
// Cocher le CheckBox du menu contextuel:
SendMessage(hMenu, BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
// Initialiser le drapeau menucontexteul:
MenuContextuel=(int)SendMessage(hMenu,BM_GETSTATE,0,(LPARAM)0)&1;
// Cocher le CheckBox de la selection:
SendMessage(hSel, BM_SETCHECK,(WPARAM) BST_CHECKED,(LPARAM)0);
// Initialiser le drapeau selection:
Selectionnable=(int)SendMessage(hSel,BM_GETSTATE,0,(LPARAM)0)&1;
// Mettre le focus dans l'Edit du ComboBox:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin de la ligne de l'Edit:
SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
// Obtenir la police MS Sans Serif:
HGDIOBJ font=GetStockObject (DEFAULT_GUI_FONT);
// Obtenir le HWND du premier controle enfant:
HWND child=GetWindow(hWnd,GW_CHILD);
do
{
// Définir la nouvelle police pour le controle:
SendMessage(child,WM_SETFONT,(WPARAM)font,0);
// Obtenir le HWND du controle suivant:
child=GetWindow(child,GW_HWNDNEXT);
// Répéter tant que le HWND obtenu n'est pas nul:
}while (child);
break;
}
case WM_COMMAND:
// Déterminer lequel des six boutons de choix de la couleur du texte de l'Edit est cliqué:
for (i=0;i<6;i++)
{
if (lParam == (long)hRadioEditText[i])
{
// Actualiser l'index de la couleur:
CouleurTexteEdit=i;
// Forcer le redessin de l'Edit:
InvalidateRect(hCombo,0,1);
// Mettre le focus dans l'Edit:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1,(LPARAM) -1);
break;
}
}
// Déterminer lequel des six boutons de choix de la couleur de fond de l'Edit est cliqué:
for (i=0;i<6;i++)
{
if (lParam == (long)hRadioEditFond[i])
{
// Actualiser l'index de la couleur de fond de l'Edit:
CouleurFondEdit=i;
// Forcer le redessin de l'Edit:
InvalidateRect(hCombo,0,1);
// Mettre le focus dans l'Edit:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
break;
}
}
// Déterminer lequel des six boutons de choix de la couleur du texte de la ListBox est cliqué:
for (i=0;i<6;i++)
{
if (lParam == (long)hRadioListText[i])
{
// Actualiser l'index de la couleur de texte de la ListBox:
CouleurTexteList=i;
// Mettre le focus dans l'Edit:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL, (WPARAM)-1,(LPARAM) -1);
break;
}
}
// Déterminer lequel des six boutons de choix de la couleur de fond de la ListBox est cliqué:
for (i=0;i<6;i++)
{
if (lParam == (long)hRadioListFond[i])
{
// Actualiser l'index de la couleur de fond de la ListBox:
CouleurFondList=i;
// Mettre le focus dans l'Edit:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
break;
}
}
// Clic sur le CheckBox "Menu contextuel":
if((HWND)lParam == hMenu)
{
// Actualiser la valeur du drapeau menucontextuel puisque son checkbox est cliqué:
MenuContextuel=(int)SendMessage(hMenu,BM_GETSTATE,0,0)&1;
// Mettre le focus dans l'Edit du ComboBox:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL,(WPARAM) -1, (LPARAM)-1);
break;
}
// Clic sur le CheckBox "Lecture seule":
if((HWND)lParam == hLect)
{
// Actualiser la valeur du drapeau lectureseule puisque son checkbox est cliqué:
LectureSeule=(int)SendMessage(hLect,BM_GETSTATE,0,0)&1;
// Mettre le focus dans l'Edit du ComboBox:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
break;
}
// Clic sur le CheckBox "Séléctionnable":
if((HWND)lParam == hSel)
{
// Actualiser la valeur du drapeau selection puisque son checkbox est cliqué:
Selectionnable=(int)SendMessage(hSel,BM_GETSTATE,0,0)&1;
// Mettre le focus dans l'Edit du ComboBox:
SetFocus(GetWindow(hCombo,GW_CHILD));
// Mettre le curseur à la fin du texte:
if (Selectionnable) SendMessage(GetWindow(hCombo,GW_CHILD), EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
break;
}
// Clic sur le bouton "Quitter":
if((HWND)lParam == hQuitter)
{
// Envoi du message WM_CLOSE à notre fenêtre:
SendMessage(hWnd,WM_CLOSE,0,0);
}
break;
case WM_CLOSE:
// Détruire tous les HBRUSHs:
for (i=0;i<6;i++) DeleteObject(Fond[i]);
// Détruire la fenêtre:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
// Envoi du message de fermeture du programme:
PostQuitMessage(0);
break;
default:
//Retour à la procédure par défaut:
return( DefWindowProc( hWnd, messg, wParam, lParam ) );
}
return 0;
}
//---------------------------------------------------------------------------------//
//------------------------------ Fonction WinMain ---------------------------------//
int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
{
// Déclarer notre classe de fenêtre et définir ses membres:
WNDCLASS wc;
char NomClasse[] = "ColorCombo";
wc.lpszClassName = NomClasse;
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor( 0, IDC_ARROW );
wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
wc.lpszMenuName = 0;
wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
wc.style = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
// Enregistrer la classe de notre fenêtre:
if (!RegisterClass(&wc)) return 1;
// Créer notre fenêtre principale:
HWND hWnd = CreateWindow( NomClasse,"",WS_SYSMENU | WS_MINIMIZEBOX ,0,0,640,460, 0, 0, hInst,0);
// Montrer la fenêtre:
ShowWindow(hWnd, nCmdShow );
UpdateWindow( hWnd );
// Boucle des messages:
MSG Msg;
while( GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
// Quitter le programme:
return( Msg.wParam);
}
//-------------------------------------------------------------------------------------//
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
ComboBox [ par agriva ]
Je souhaiterais:- rendre ineditabable un combobox, comment faire?- lorsqu on clique sur OK dans ma boite de dialogue (ds laquelle se trouve mon Combo)
Mission impossible::API [ par supergrey ]
Bonjour tout le monde, je me ballader tranquillement dans l'API win32 entre les dialogbox, editbox et autre IDC_MACHINTRUC, evitant les pieges a coup
Changer la couleur de l'elt sélectionné dans une combo [ par SBellieres ]
Bonjour,Je voudrais savoir comment il faut faire pour changer la couleur de l'item qui est sélectionné dans une combobox (chez moi, c'est en bleu).Mer
Combobox multicolonne WIN32 [ par zibo3 ]
Bonjour,J'aimerai faire du multicolonne dans une liste box et dans la liste déroulante d'une combobox. Pour la combo j'aimerai que s'affiche la valeur
URGENT : sélection automatique dans un ComboBox avec API Win32 [ par Buzu ]
Voila :Appli API Win32J'ai une combo box avec une liste de noms. Je récupère une valeur : inom, qui est l'indice du nom que je voudrai sélectionner au
ComboBox en API [ par bethoring ]
Salut a tous,Je voudrais savoir comment afficher des variables dans une combobox en API et commen recuperer l'index de la comboboxMerci d'avanceBethor
[API | C++] Combo Box [ par keenrather ]
Bonjour à tous,Alors voila je travaille sous Visual C++ 6 et j'ai crée une boite de dialogue avec une combo box dans mes ressources.Et mon p
Insertion de donnée dans une ComboBox [ par Toutoun13 ]
Bonjour, J'ai créé dans mon appli une CComboBox avec le Wizard de VC++ 6.0. J'ai attaché une variable membre à ma combo, j'ai donc dans mon ".h" la li
Pilotage total appli via API au travers de Windev [ par croquibus ]
Hello !!!Voila, ma mission est d'automatiser entièrement le fonctionnement d'une application.Je programme sous Windev et j'utilise l'appel d'API windo
[GTK+] ComboBox [ par ksoft_cppfrance ]
je veux savoir comment je pourrai recuperer l'indice de l'element selectionné dans une comboBoxj'ai creé ma combobox de la maniere suivante :pList = g
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|