Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

API :: MESSAGEBOXINDIRECT


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 27/05/2004 Date de mise à jour : 04/10/2004 13:11:28 Vu : 4 973

Note :
8,75 / 10 - par 4 personnes
8,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
En voulant faire je ne sais quoi, je suis tombé sur cette fonction qui m'a semblé
intéressante dans la mesure où elle propose de faire une boîte de message personnalisé très facilement.

Voici le prototype de la fonction :

MessageBoxIndirect(LPMSGBOXPARAMS lpMsgBoxParams):LongBool;

Et voici la structure des paramètres de la boîte de message :

struct {  
    UINT      cbSize;
    HWND      hwndOwner;
    HINSTANCE hInstance;
    LPCSTR    lpszText;
    LPCSTR    lpszCaption;
    DWORD     dwStyle;
    LPCSTR    lpszIcon;
    DWORD     dwContextHelpId;
    MSGBOXCALLBACK lpfnMsgBoxCallback;
    DWORD     dwLanguageId;
} MSGBOXPARAMS;

Voici un exemple qui va vous illustrer la manière dont on peut afficher
une boîte de message avec une icône personnalisée.
 

Source

  • // Tout d'abord, créer un fichier ressource dans lequel vous allez mettre votre icône préférée et donnez à cette ressource un identifiant numérique (105 par exemple).
  • Ensuite, intégrez la directive qui va compiler votre fichier ressource avec l'exécutable :
  • implementation
  • {$R *.dfm}
  • {$R MonIcone.res} // Ce fichier ressource contient l'icône.
  • // Déclarez un objet de type MsgBoxParams directement dans l'évènement où vous
  • souhaitez faire apparaître la boîte ou alors,
  • dans les variables globales de votre programme, c'est selon votre besoin.
  • procedure TfrmMain.btTestClick(Sender: TObject);
  • var aBox: MSGBOXPARAMS;
  • begin
  • // Ensuite, vous devez définir les propriétés de notre boîte.
  • aBox.cbSize := SizeOf(aBox);
  • aBox.hwndOwner := Application.Handle;
  • aBox.hInstance := hinstance;
  • aBox.lpszText := 'Voilà ma boîte de message avec icône perso :-p';
  • aBox.lpszCaption := 'CodeS-SourceS.com';
  • aBox.dwStyle := MB_USERICON + MB_YESNO; // Tous les styles connus peuvent être appliqués. Il y'en a d'autres, dont MB_USERICON, qui permet donc de mettre une icône personnalisée.
  • aBox.lpszIcon := MakeIntResource(105); // Cette propriété reçoit une chaîne ou l'identifiant numérique de l'icone.
  • aBox.dwContextHelpId := 0;
  • aBox.lpfnMsgBoxCallback := nil;
  • aBox.dwLanguageId := LANG_FRENCH;
  • // A présent nous devons détecter quel est le bouton pressé, pour ce faire,
  • il faut récupérer la valeur cardinale renvoyée par la boîte de message et nous pouvons distinguer :
  • //bouton OUI = 6 = mrYes
  • //bouton NON = 7 = mrNo
  • //bouton OK = 1 = mrOK
  • //bouton ANNULER = 2 = mrCancel
  • //bouton ABANDONNER = 3 = mrAbort
  • //bouton REESSAYER = 4 = mrRetry
  • //bouton IGNORER = 5 = mrIgnore
  • if Cardinal(MessageBoxIndirect(aBox)) = mrYes then
  • begin
  • .....instructions....
  • end;
  • end;
// Tout d'abord, créer un fichier ressource dans lequel vous allez mettre votre icône préférée et donnez à cette ressource un identifiant numérique (105 par exemple). 
Ensuite, intégrez la directive qui va compiler votre fichier ressource avec l'exécutable :

implementation

{$R *.dfm}
{$R MonIcone.res} // Ce fichier ressource contient l'icône.

// Déclarez un objet de type MsgBoxParams directement dans l'évènement où vous
souhaitez faire apparaître la boîte ou alors, 
dans les variables globales de votre programme, c'est selon votre besoin.

procedure TfrmMain.btTestClick(Sender: TObject);
var aBox: MSGBOXPARAMS;
begin

// Ensuite, vous devez définir les propriétés de notre boîte.

    aBox.cbSize := SizeOf(aBox);
    aBox.hwndOwner := Application.Handle;
    aBox.hInstance := hinstance;
    aBox.lpszText := 'Voilà ma boîte de message avec icône perso :-p';
    aBox.lpszCaption := 'CodeS-SourceS.com';
    aBox.dwStyle := MB_USERICON + MB_YESNO; // Tous les styles connus peuvent être appliqués. Il y'en a d'autres, dont MB_USERICON, qui permet donc de mettre une icône personnalisée.
    aBox.lpszIcon := MakeIntResource(105); // Cette propriété reçoit une chaîne ou l'identifiant numérique de l'icone.
    aBox.dwContextHelpId := 0;
    aBox.lpfnMsgBoxCallback := nil;
    aBox.dwLanguageId := LANG_FRENCH;

// A présent nous devons détecter quel est le bouton pressé, pour ce faire, 
il faut récupérer la valeur cardinale renvoyée par la boîte de message et nous pouvons distinguer :
//bouton OUI = 6 = mrYes
//bouton NON = 7 = mrNo
//bouton OK = 1 = mrOK
//bouton ANNULER = 2 = mrCancel
//bouton ABANDONNER = 3 = mrAbort
//bouton REESSAYER = 4 = mrRetry
//bouton IGNORER = 5 = mrIgnore

    if Cardinal(MessageBoxIndirect(aBox)) = mrYes then
        begin
           .....instructions....
        end;

end;

Conclusion

Je ne connaissais pas cette fonction et la recherche préalable sur DelphiFR n'a pas donné de résultat la concernant donc j'ai pensé que ça pourrait apprendre quelque chose à quelqu'un, notament l'insertion aisée d'une icône personnelle dans une boîte de message.

Si vous trouvez des erreurs et/ou si vous avez des suggestions, vous savez ce qu'il vous reste à faire.
 

Historique

04 octobre 2004 13:11:28 :

Commentaires et avis

signaler à un administrateur
Commentaire de japee le 27/05/2004 01:12:05 administrateur CS

Je n'ai pas le temps de tester ton code, ça a l'air intéressant.

Juste un petit mot pour information.

Les valeurs retournées par MessageDlg, soit:
mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, mrYesToAll
correspondent respectivement aux valeurs cardinales:
6, 7, 1, 2, 3, 4, 5, 8, 9, 10.

signaler à un administrateur
Commentaire de Inekman le 27/05/2004 01:22:37

Ah et bien voilà une information intéressante, on sait à présent comment détecter les autres boutons grâce à toi.

Merci beaucoup.

signaler à un administrateur
Commentaire de Partagas le 27/05/2004 10:20:22

ca veut surtout dire que la ligne

if Cardinal(MessageBoxIndirect(aBox)) = 6

peut etre remplacee par

if MessageBoxIndirect(aBox) = mrYes

ce qui allege et facilite le code.

signaler à un administrateur
Commentaire de Inekman le 27/05/2004 12:10:00

Oui, ça veut aussi dire ça :p mais ça ne l'allège pas pour autant... ;-)

signaler à un administrateur
Commentaire de Inekman le 27/05/2004 12:13:09

J'ai testé ta proposition Partagas et ça ne fonctionne pas :-P

Donc on reste sur :

if Cardinal(MessageBoxIndirect(aBox)) = mrYes

signaler à un administrateur
Commentaire de Partagas le 27/05/2004 12:34:06

ah, autant pour moi, comme j'ai pas delphi sous la main, j'ai pas pu tester, et je me melange souvent entre les MBtruc, MRmacin, et IDchose. a la rigueur, essaie un

if MessageBoxIndirect(aBox) = IDYes

si tu as le temps, on ne sait jamais. un coup d'oeil dans le MSDN me fait penser que ca peut marcher, mais je ne suis pas sur de moi...

et personnellement, je trouve que ca allege (si ca marche...), simplement parceque je n'aime pas le transtypage en fait. Mais bon, c'est vrai que ca reste une ligne de code, quoi qu'il arrive...

signaler à un administrateur
Commentaire de japee le 27/05/2004 13:43:25 administrateur CS

Mais ça marche ainsi:
if Cardinal(MessageBoxIndirect(aBox)) = mrYes then...
et bien sûr aussi avec case...of.
On peut donc faire selon son goût (si l'on est "chiffre" ou "lettres"). Pour ma part, je trouve plus facile à mémoriser mrYes ou mrCancel que 6 ou 2.

Sinon le code tient ses promesses. C'est plutôt sympa de pouvoir faire apparaître ses propres icones :)
Et on doit bien arriver à faire d'autre trouvailles...

signaler à un administrateur
Commentaire de pyroflo le 27/05/2004 18:55:28

Sympa comme astuce, la source est bien commentée (la raison de mon post).

Bien joué ;-)

signaler à un administrateur
Commentaire de Inekman le 27/05/2004 19:13:47

J'ai essayé ce que t'as dis Partagas avant de poster mon code et ça ne marche pas non plus, c'est la raison pour laquelle j'ai utilisé les valeurs cardinales. ;-)

Oui oui Japee, on peut par exemple personnaliser le bouton qui aura le focus par défaut en mettant MB_DEFBUTTON1 ou MB_DEFBUTTON2 ou MB_DEFBUTTON3 ou MB_DEFBUTTON4, le numéro indiquant le bouton qui aura le focus.

MB_HELP : pour afficher un bouton d'aide, auquel cas il faudra préciser dans la propriété "dwContextHelpId" l'identifiant de l'aide qui sera appelé.

MB_RIGHT : pour mettre le texte à droite :-p

MB_RTLREADING : pour ceux qui lisent de droite vers la gauche.

J'ai mis à jour la capture pour illustrer ces deux derniers drapeaux.

signaler à un administrateur
Commentaire de Inekman le 27/05/2004 19:26:16

....j'ai également mis à jour le code en haut, concernant les boutons, leurs équivalents cardinaux et leurs drapeaux.

Merci pour vos commentaires.

signaler à un administrateur
Commentaire de japee le 27/05/2004 19:40:03 administrateur CS

Décidément, ce code inspire les commentaires.

En effet, Delphiprog, après vérification,
"function MessageBoxIndirect(const MsgBoxParams: TMsgBoxParams): BOOL; stdcall;"
retourne bien un Boolean, d'ailleurs
"MessageBoxIndirect(aBox)"
retourne bien True, quel que soit le bouton cliqué.

Mais je crois comprendre qu'elle renvoie également la valeur de la constante MsgBoxParams de type TMsgBoxParams (variable aBox dans le code d'Inekman), et que dans le cas de
"Cardinal(MessageBoxIndirect(aBox))"
on récupère la valeur de la constante MsgBoxParams.

En espérant n'avoir pas dit une grosse bêtise...

signaler à un administrateur
Commentaire de Inekman le 27/05/2004 19:48:18

Hum, je n'ai pas trop compris ta grosse bétise :-) et j'avous ne pas voir à pourrait correspondre la constante dont tu parles...la valeur cardinale du bouton pressé ?

--> Pourquoi mon post fait partir en sucette la présentation de cette page ?

signaler à un administrateur
Commentaire de japee le 27/05/2004 21:51:32 administrateur CS

Oui, c'est ça, la constante MsgBoxParam renvoie la valeur cardinale du bouton pressé, c'est bien ce que je voulais exprimer ;)
Je veux pas cafter, mais je ne crois pas que ton post soit responsable de l'affichage déplorable de cette page (il faudrait au minimum un écran 16/9 pour l'afficher correctement, lol). Mais ça remonte au message de Delphiprog (pardon, j'ai cafté...)

signaler à un administrateur
Commentaire de Delphiprog le 27/05/2004 23:04:46 administrateur CS

Alors, comme ça, je suis reponsable de ce qui arrive. Admettons...;o)
Je suis perplexe car la doc Microsoft et celle de Borland indiquent que la fonction retourne un integer !...

Or, quelque soit le bouton cliqué, la fonction retourne toujours vrai puisque la déclaration dans l'unité Windows.pas est celle-ci :
function MessageBoxIndirect(const MsgBoxParams: TMsgBoxParams): BOOL; stdcall;

Mais, en C, comme tout ce qui est différent de 0 est considéré comme vrai, en transtypant en un cardinal on obtient à nouveau une valeur exploitable.

Si ça n'allège pas vraiment le code, je suis d'accord avec Japee pour affirmer qu'une comparaison avec une des constantes comme mrYes rend le code nettement plus lisible.

C'est mieux comme ça ?

signaler à un administrateur
Commentaire de japee le 27/05/2004 23:22:22 administrateur CS

Oui, c'est beaucoup mieux comme ça. Pardon d'avoir cafté ;)
Merci Delphiprog !

signaler à un administrateur
Commentaire de Inekman le 28/05/2004 12:20:19

Donc on compare avec les constantes mr*** et tout le monde est heureux :-)

Merci pour l'appréciation du code DelphiProg et vous autres qui avez posté un commentaire.

signaler à un administrateur
Commentaire de SiZiOUS le 28/05/2004 16:36:53

Magnfique !

Ca m'evitera de partir de zéro et de faire une MsgBox avec une TForm.

Vraiment, merci !
Un petit 10/10 pour completer le message :)

signaler à un administrateur
Commentaire de Partagas le 30/05/2004 12:04:48

kuste une question bete:
le parametre LPCSTR lpszIcon; demande une chaine, ou une resource avec MakeIntResource();
mais quel type de chaine, et surtout quelle genre de valeur peut etre utilise ici??

signaler à un administrateur
Commentaire de Inekman le 30/05/2004 13:16:11

Je pense qu'il faut une chaîne désignant le chemin de l'icône sur le disque dur. "C:\Mon Dosssier\MonIcone.ico". La valeur à utiliser c'est celle qui est générée par la fonction MakeIntRessource(), c'est à dire l'entier qui désigne la ressource.

Mais je viens de penser à un truc, il faudrait essayer de nommer l'icone dans le fichier ressource et d'utiliser justement son nom dans la propriété lpszIcon au lieu d'une adresse sur le disque dur....à tester.

signaler à un administrateur
Commentaire de Partagas le 30/05/2004 17:48:02

j'ai essaye les deux, aucun ne marche. J'ai aussi essaye de recuperer la valeur de MakeIntResource(numero), c'est un PAnsiChar, et je n'y arrive pas et ca m'ennerve, alors j'ai abandonne.

Enfin pour conclure, si on en revient a la source originale, on n'a rien change, et ca, c'est rare ici...

signaler à un administrateur
Commentaire de Inekman le 31/05/2004 11:40:14

J'ai essayé aussi et ça ne fonctionne pas non plus.

...Et si ma solution était LA solution pour utiliser cette fonction ? :-P

signaler à un administrateur
Commentaire de bloom1 le 08/08/2005 02:47:42

Tu es sous Mac ou bien tu as juste un Thème ???

signaler à un administrateur
Commentaire de Inekman le 08/08/2005 03:54:02

juste un vieux thème que j'avais à l'époque où j'ai capté l'API ;-)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,593 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.