PDA

Voir la version complète : Ajouter un bouton bitmap en C++



César Vonc
29/03/2014, 15h08
Salut,


Je me remets un peu au C++ pour les besoins d'un module et je bloque sur la création d'un bouton avec une image bitmap dans ma boîte de dialogue.


Après quelques recherches sur la toile, je suis tombé sur plusieurs méthodes, mais je n'arrive pas à les faire marcher.

D'abord, « AttachImage », trouvé ici : http://www.plugincafe.com/forum_browse.asp?messageID=1545
Mais qui ne semble plus exister, peut-être est-ce une méthode trop vieille ?


Et puis « AddCustomGui », sauf que là aussi, je ne comprends pas comment lui ajouter un bitmap, elle renvoie du vide et non pas un BitmapButtonCustomGui.

Dans CreateLayout :

this->AddCustomGui(1200, CUSTOMGUI_BITMAPBUTTON, "Bitmap", BFH_CENTER, 64, 64, BaseContainer());



Ne pourrait-on pas également faire ça dans le fichier .res ?

Est-il possible aussi d'afficher à la fois un texte et un bitmap sur un bouton ?

César Vonc
29/03/2014, 15h21
Ah je crois que j'ai trouvé un vieux message d'xs_yann à ce sujet :
http://frenchcinema4d.fr/archive/index.php/t-72155.html

Qui met (BitmapButtonCustomGui*) avant AddCustomGui, bon j'imagine que ça change le type même si j'en suis pas certain.


Du coup ça marche :



BaseContainer bc = BaseContainer();
bc.SetBool(BITMAPBUTTON_BUTTON, TRUE);
BitmapButtonCustomGui *bb = (BitmapButtonCustomGui*)AddCustomGui(1200, CUSTOMGUI_BITMAPBUTTON, "Bitmap", BFH_CENTER, 64, 64, bc);
bb->SetImage(GeGetPluginPath() + Filename("res") + Filename("icone.png"));

J'ai également vu que le BaseContainer pouvait ajouter quelques propriétés au bouton : BITMAPBUTTON_BUTTON permet de le rendre cliquable.


Ceci dit, mes deux autres questions sont toujours d'actualité.

xs_yann
29/03/2014, 16h02
Salut César,

La méthode AddCustomGui() ne retourne pas rien, elle retourne un "void*", ce qui représente un pointeur générique. En gros ça te retourne un pointeur qui pointe bien sur une adresse mémoire contenant quelque chose, mais dont la fonction ne connait pas le type. C'est différent de "void" qui lui représente "rien".
Dans ce cas là, cela permet à la fonction AddCustomGui de pouvoir renvoyer des BitmapButtonCustomGui mais aussi des GradientCustomGui, FilenameCustomGui, etc.
C'est à toi de faire le cast pour pouvoir manipuler correctement les données renvoyées :


BitmapButtonCustomGui *bb = static_cast<BitmapButtonCustomGui*>(AddCustomGui(...));

Pour le fichier .res, je pense que tu peux, olight.res et ocamera.res le font par exemple.


BITMAPBUTTON MON_PARAM { }

Pour le texte et le bitmap en même temps je ne sais pas, désolé.

Bon courage. ;)

César Vonc
29/03/2014, 16h15
Aah d'accord, merci pour les détails !

C'est plus propre d'utiliser static_cast<BitmapButtonCustomGui*> ou ça ne change rien ? Je n'ai pas d'alerte particulière quand je compile avec l'un ou l'autre.

xs_yann
01/04/2014, 01h27
Moi je trouve ça plus propre, après chacun son avis.

Un post qui résume bien :


C++ style casts are checked by the compiler. C style casts aren't and can fail at runtime

also, c++ style casts can be searched for easily, whereas it's really hard to search for c style casts

Another big benefit is that the 4 different C++ style casts express the intent of the programmer more clearly.

When writing C++ I'd pretty much always use the C++ ones over the the C style.

http://stackoverflow.com/questions/1609163/what-is-the-difference-between-static-cast-and-c-style-casting

Un post qui explique bien :

http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast

César Vonc
01/04/2014, 12h39
Ça roule !