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.
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
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
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
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
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.
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
class CMyDlg : public CDialogEx
Et dans le OnInitDialog() j'ai la ligne de code suivante :
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
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
1 2 3
|
// je définit un text pour l'info bulle sur le bouton
m_OkBtn.SetTooltip("Valider les données"); |
Et voilà,
Partager