Api :: messageboxindirect

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 968 fois - Téléchargée 28 fois

Contenu du snippet

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 / Exemple :


// 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.

A voir également

Ajouter un commentaire Commentaires
Messages postés
291
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
30 juin 2006

juste un vieux thème que j'avais à l'époque où j'ai capté l'API ;-)
Messages postés
328
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
8 mars 2007

Tu es sous Mac ou bien tu as juste un Thème ???
Messages postés
291
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
30 juin 2006

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

...Et si ma solution était LA solution pour utiliser cette fonction ? :-P
Messages postés
30
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
1 juin 2004

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...
Messages postés
291
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
30 juin 2006

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.
Afficher les 23 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.