{"id":5046,"date":"2016-05-31T14:18:54","date_gmt":"2016-05-31T14:18:54","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=5046"},"modified":"2016-06-01T16:30:11","modified_gmt":"2016-06-01T16:30:11","slug":"une-classe-guibutton-pour-representer-un-bouton-cliquable","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=5046","title":{"rendered":"Une classe GUIButton pour repr\u00e9senter un bouton cliquable"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/8HcZT.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-5074\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/8HcZT.jpg\" alt=\"8HcZT\" width=\"600\" height=\"411\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/8HcZT.jpg 1577w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/8HcZT-300x205.jpg 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/8HcZT-1024x701.jpg 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/8HcZT-624x427.jpg 624w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Parfois nous avons besoin d\u2019afficher un bouton pour rendre l\u2019<strong>interface utilisateur (GUI)<\/strong> plus dynamique. Le bouton peut afficher<strong> une autre image<\/strong> lorsqu&rsquo;il est reste cliqu\u00e9 dessus !<\/p>\n<p><strong>Pr\u00e9requis : <\/strong><\/p>\n<p>\u2013 Avoir lu la classe <em>GUIWidget<\/em><\/p>\n<p><strong>Contenu : <\/strong><\/p>\n<p>Voici le fichier GUIButton.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef GUI_BUTTON_H\r\n#define GUI_BUTTON_H\r\n\r\n#include &lt;d3dx10math.h&gt;\r\n#include &lt;iostream&gt;\r\n\r\n#include &quot;Sprite2D.h&quot;\r\n#include &quot;GUIImage.h&quot;\r\n#include &quot;Defines.h&quot;\r\n\r\nclass GUIButton : public GUIImage\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0enum ButtonState\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0NON_ACTIVE,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0HOVER,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CLICKED,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PUSHED_OUT\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0GUIButton(const std::string&amp; sName, const std::string&amp; sTextureName, const std::string&amp; sTextureClickedName = NONE,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const std::string&amp; sTextureHoverName = NONE);\r\n\r\n\u00a0\u00a0 \u00a0virtual ~GUIButton();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Update(float fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0ButtonState GetState();\r\n\u00a0\u00a0 \u00a0void SetState(ButtonState state);\r\n\r\n\u00a0\u00a0 \u00a0void SetHoverOnImage();\r\n\u00a0\u00a0 \u00a0void SetClickedOnImage();\r\n\u00a0\u00a0 \u00a0void SetNormalImage();\r\n\r\n\u00a0\u00a0 \u00a0bool IsClickedOn();\r\n\u00a0\u00a0 \u00a0bool IsPushedOut();\r\n\u00a0\u00a0 \u00a0bool IsNonActive();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0ButtonState m_state;\r\n\r\n\u00a0\u00a0 \u00a0std::string m_sNormalTextureFile;\r\n\u00a0\u00a0 \u00a0std::string m_sClickedOnTextureFile;\r\n\u00a0\u00a0 \u00a0std::string m_sHoverOnTextureFile;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bClickedOn;\r\n\u00a0\u00a0 \u00a0bool m_bHover;\r\n\u00a0\u00a0 \u00a0bool m_bHasClickedOnImage;\r\n\u00a0\u00a0 \u00a0bool m_bHasHoverdOnImage;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bMouseButtonReleased;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier GUIButton.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;GUIButton.h&quot;\r\n#include &quot;InputManager.h&quot;\r\n#include &quot;GUIManager.h&quot;\r\n#include &quot;Utils.h&quot;\r\n\r\nGUIButton::GUIButton(const std::string&amp; sName, const std::string&amp; sTextureName, const std::string&amp; sTextureClickedName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 const std::string&amp; sTextureHoverName) :\r\nGUIImage(sName, sTextureName),\r\nm_state(NON_ACTIVE),\r\nm_sNormalTextureFile(sTextureName),\r\nm_sClickedOnTextureFile(sTextureClickedName),\r\nm_sHoverOnTextureFile(sTextureHoverName),\r\nm_bClickedOn(false),\r\nm_bHover(false),\r\nm_bMouseButtonReleased(false),\r\nm_bHasClickedOnImage(false),\r\nm_bHasHoverdOnImage(false)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Image quand on appuie\r\n\u00a0\u00a0 \u00a0if (Utils::IsFileReadable(sTextureClickedName))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bHasClickedOnImage = true;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Image quand on survole\r\n\u00a0\u00a0 \u00a0if (Utils::IsFileReadable(sTextureHoverName))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bHasHoverdOnImage = true;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nGUIButton::~GUIButton()\r\n{\r\n}\r\n\r\nvoid GUIButton::Update(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0if (!IsVisible())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0int x, y;\r\n\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;GetAbsMouseLocation(x, y);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0if (IsActive())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (IsCollidingWithMousePointer(x, y)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; GUI_MANAGER-&gt;IsWidgetFirstOverlapping(this))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetState(ButtonState::HOVER);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bHover = true;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetHoverOnImage();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (INPUT_MANAGER-&gt;IsMouseButtonDown(MOUSE_LEFT_BUTTON_DOWN))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bClickedOn = true;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetState(ButtonState::CLICKED);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GUIParameters param;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0param &lt;&lt; GetState();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SendEventToListeners(param);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetClickedOnImage();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (m_bClickedOn)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetNormalImage();\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bClickedOn = false;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetState(ButtonState::PUSHED_OUT);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (m_bHover)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetState(ButtonState::NON_ACTIVE);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetNormalImage();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bHover = false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bClickedOn = false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0GUIImage::Update(fTimeSinceLastFrame);\r\n}\r\n\r\nGUIButton::ButtonState GUIButton::GetState()\r\n{\r\n\u00a0\u00a0 \u00a0return m_state;\r\n}\r\n\r\nvoid GUIButton::SetState(ButtonState state)\r\n{\r\n\u00a0\u00a0 \u00a0m_state = state;\r\n}\r\n\r\nbool GUIButton::IsClickedOn()\r\n{\r\n\u00a0\u00a0 \u00a0return GetState() == GUIButton::ButtonState::CLICKED &amp;&amp; IsVisible();\r\n}\r\n\r\nbool GUIButton::IsPushedOut()\r\n{\r\n\u00a0\u00a0 \u00a0return GetState() == GUIButton::ButtonState::PUSHED_OUT &amp;&amp; IsVisible();\r\n}\r\n\r\nbool GUIButton::IsNonActive()\r\n{\r\n\u00a0\u00a0 \u00a0return GetState() == GUIButton::ButtonState::NON_ACTIVE &amp;&amp; IsVisible();\r\n}\r\n\r\nvoid GUIButton::SetClickedOnImage()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_bHasClickedOnImage)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetTextureImage(m_sClickedOnTextureFile);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid GUIButton::SetNormalImage()\r\n{\r\n\u00a0\u00a0 \u00a0SetTextureImage(m_sNormalTextureFile);\r\n}\r\n\r\nvoid GUIButton::SetHoverOnImage()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_bHasHoverdOnImage)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetTextureImage(m_sHoverOnTextureFile);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Voici une classe qui permet d&rsquo;afficher un bouton cliquable.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Parfois nous avons besoin d\u2019afficher un bouton pour rendre l\u2019interface utilisateur (GUI) plus dynamique. Le bouton peut afficher une autre image lorsqu&rsquo;il est reste cliqu\u00e9 dessus ! Pr\u00e9requis : \u2013 Avoir lu la classe GUIWidget Contenu : Voici le fichier GUIButton.h : &nbsp; Voici le fichier GUIButton.cpp : &nbsp; R\u00e9sum\u00e9 : Voici une [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5046"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5046"}],"version-history":[{"count":11,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5046\/revisions"}],"predecessor-version":[{"id":5076,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5046\/revisions\/5076"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}