J'ai une boite de dialogue par exemple CMyDlg qui dérive communément de CDialog.
J'ai un bouton par exemple le bouton OK sur la dialogue à partir des ressources auquel je mappe une variable CButton.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
class CMyDlg : public CDialog
{
//...
      protected:
	CButton m_OkBtn;
Ce que je voudrais faire c'est de mettre une image avec du texte sur le bouton OK en lui appliquant un style particulier.

D'abord je remplace CButton en CMFCButton.
Ensuite dans le code d'initialisation de ma dialogue OnInitDialog() j'ai le code suivant :
1. Je choisit le style du bouton soit plat, semi-plat ou en 3D
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
	int iBorderStyle = 2;  // style de la bordure
	switch (iBorderStyle)
	{
	case 0:  // bouton tout plat
		m_OkBtn.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
 
		break;
 
	case 1:  // bouton semi plat
		m_OkBtn.m_nFlatStyle = CMFCButton::BUTTONSTYLE_SEMIFLAT;
		break;
 
	case 2:  // bouton en 3D
		m_OkBtn.m_nFlatStyle = CMFCButton::BUTTONSTYLE_3D;
	}
2. Je choisit si le bouton affiche soit du text, soit une image ou les deux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
	int iTextImage = 2;  // text + image du bouton
	switch (iTextImage)
	{
	case 0:  // bouton sans image avec text
		m_OkBtn.SetImage((HBITMAP) NULL);   // image non
		m_OkBtn.SetWindowText(_T("YES"));   // text oui
		break;
 
	case 1:  // bouton sans text avec image
		if (afxGlobalData.bIsOSAlphaBlendingSupport)  // avec support des bitmap sur 32 bits?
			m_OkBtn.SetImage(IDB_BTN1_32, IDB_BTN1_HOT_32);  // image oui 
		else
			m_OkBtn.SetImage(IDB_BTN1, IDB_BTN1_HOT); // image oui
 
		m_OkBtn.SetWindowText(_T(""));   // text non
		break;
 
	case 2:  // bouton avec text et image
		if (afxGlobalData.bIsOSAlphaBlendingSupport)  // avec support des bitmap sur 32 bits?
			m_OkBtn.SetImage(IDB_BTN1_32, IDB_BTN1_HOT_32);  // image oui 
		else
			m_OkBtn.SetImage(IDB_BTN1, IDB_BTN1_HOT); // image oui
 
		m_OkBtn.SetWindowText(_T("YES"));   // text oui
		break;
	}
3. Je choisit l'alignement du text et de l'image sur le bouton
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
	int iImageLocation = 0;  // alignement du text et de l'image sur le bouton
	switch (iImageLocation)
	{ 
	case 0:  // Image à gauche du text
		m_OkBtn.m_bRightImage = FALSE;
		m_OkBtn.m_bTopImage = FALSE;
		break;
 
	case 1:  // Image à droite du text
		m_OkBtn.m_bRightImage = TRUE;
		m_OkBtn.m_bTopImage = FALSE;
		break;
 
	case 2: // image au dessus du text
		m_OkBtn.m_bRightImage = FALSE;
		m_OkBtn.m_bTopImage = TRUE;
		break;
	}
4. Je n'oublie de redimensionner le bouton qui contient mon text + image
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
	m_OkBtn.SizeToContent();  // redéfinit la taille du bouton (text+image)
	m_OkBtn.Invalidate();  // invalide le bouton pour peinture.
5. Je choisit si mon bouton doit adopter un style XP ou non.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
	// Est-ce que le thème de Win XP est-t-il disponible sur cet OS?
	BOOL bXPButtons = CMFCVisualManagerWindows::IsWinXPThemeAvailable();
 
	CMFCButton::EnableWindowsTheming(bXPButtons);  // active ou désactive le style XP des boutons
6. Et encore si ma boite de dialogue doit contenir une image d'arrière plan
je remplace toutes les occurences de CDialog en CDialogEx et donc CMyDlg dérive de CDialogEx
Code : Sélectionner tout - Visualiser dans une fenêtre à part
class CMyDlg : public CDialogEx
Et dans le OnInitDialog() j'ai la ligne de code suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
// affiche l'image en arrière plan de ma dialogue qui dérive ici de CDialogEx
	SetBackgroundImage(IDB_BACKGROUND_IMAGE, BACKGR_TOPLEFT);  // IDB_BACKGROUND_IMAGE est l'id du bitmap dans les ressource du projet
 
            // si TRUE, l'image de l'arrière plan couvre le bouton sinon FALSE 
	m_OkBtn.m_bTransparent = TRUE;
7. Je choisit le type de cursor qui doit apparaitre sur le bouton
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
	int iCursor = 0;  // définit un cursor sur le bouton
	switch (iCursor)
	{
	case 0: // cursor standard
		m_OkBtn.SetMouseCursor(NULL);   
		break;
 
	case 1:  // cursor en forme d'une main
		m_OkBtn.SetMouseCursorHand();  
		break;
 
	case 2: // cursor personnalisé
		m_OkBtn.SetMouseCursor(AfxGetApp()->LoadCursor(IDC_CURSOR)); 
		break;
	}
8. Je choisit le texte qui doit apparaitre dans l'info bulle du bouton
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
// je définit un text pour l'info bulle sur le bouton
	m_OkBtn.SetTooltip("Valider les données");
Et voilà,