{"id":5056,"date":"2016-05-31T14:30:13","date_gmt":"2016-05-31T14:30:13","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=5056"},"modified":"2016-07-16T18:33:13","modified_gmt":"2016-07-16T18:33:13","slug":"une-classe-guidraggablewidget-pour-pouvoir-deplacer-une-guiwidget","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=5056","title":{"rendered":"Une classe GUIDraggableWidget pour permettre de d\u00e9placer une GUIWidget"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/lnh5ycp0amwjyttfhg4x.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-5069\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/lnh5ycp0amwjyttfhg4x.jpg\" alt=\"lnh5ycp0amwjyttfhg4x\" width=\"579\" height=\"326\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/lnh5ycp0amwjyttfhg4x.jpg 1920w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/lnh5ycp0amwjyttfhg4x-300x169.jpg 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/lnh5ycp0amwjyttfhg4x-1024x576.jpg 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/lnh5ycp0amwjyttfhg4x-624x351.jpg 624w\" sizes=\"(max-width: 579px) 100vw, 579px\" \/><\/a><\/p>\n<p><strong>Intro : <\/strong><\/p>\n<p>Parfois nous avons besoin qu&rsquo;une <strong>GUIWidget<\/strong> puisse <strong>\u00eatre d\u00e9pla\u00e7able<\/strong> \u00e0 volont\u00e9 tout en restant appuy\u00e9 dessus <strong>la souris<\/strong>.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Avoir compris la classe GUIWidget<\/p>\n<p><strong>Contenu :<\/strong><\/p>\n<p>Voici le contenu\u00a0GUIDraggableWidget.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef GUI_DRAGGABLE_WIGET_H\r\n#define GUI_DRAGGABLE_WIGET_H\r\n\r\n#include &lt;iostream&gt;\r\n#include &lt;d3dx10math.h&gt;\r\n\r\n#include &quot;GUIImage.h&quot;\r\n#include &quot;GUIButton.h&quot;\r\n\r\nclass GUIDraggableWiget : public GUIImage\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0enum DraggableBoxState\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0NON_ACTIVE,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DRAGGING\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0GUIDraggableWiget(const std::string&amp; sName, const std::string&amp; sTextureFileName);\r\n\u00a0\u00a0 \u00a0virtual ~GUIDraggableWiget();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Update(float fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0virtual void SetPosition(unsigned int x, unsigned int y);\r\n\u00a0\u00a0 \u00a0virtual void SetSize(unsigned int iWidth, unsigned int iHeight);\r\n\r\n\u00a0\u00a0 \u00a0void DisableDragging();\r\n\u00a0\u00a0 \u00a0void EnableDragging();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0bool IsCollidingWithDraggableBox(int x, int y);\r\n\u00a0\u00a0 \u00a0bool IsCollidingWithCloseBox(int x, int y);\r\n\r\n\u00a0\u00a0 \u00a0void SetBoxesPositions(unsigned int x, unsigned int y);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR2 GetDraggableBoxPosition();\r\n\r\n\u00a0\u00a0 \u00a0DraggableBoxState GetDraggableBoxState();\r\n\u00a0\u00a0 \u00a0void SetDraggableBoxState(DraggableBoxState state);\r\n\r\n\u00a0\u00a0 \u00a0void SetImageSize(unsigned int iWidth, unsigned int iHeight);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0AABB m_draggableBoxAABB;\r\n\u00a0\u00a0 \u00a0AABB m_closeBoxAABB;\r\n\r\n\u00a0\u00a0 \u00a0DraggableBoxState m_state;\r\n\r\n\u00a0\u00a0 \u00a0int xPos;\r\n\u00a0\u00a0 \u00a0int yPos;\r\n\r\n\u00a0\u00a0 \u00a0int sx;\r\n\u00a0\u00a0 \u00a0int sy;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bDragging;\r\n\u00a0\u00a0 \u00a0bool m_bDraggingEnabled;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier GUIDraggableWidget.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;GUIDraggableWidget.h&quot;\r\n#include &quot;InputManager.h&quot;\r\n#include &quot;GUIManager.h&quot;\r\n\r\nGUIDraggableWiget::GUIDraggableWiget(const std::string&amp; sName, const std::string&amp; sTextureFileName) :\r\nGUIImage(sName, sTextureFileName),\r\nxPos(0),\r\nyPos(0),\r\nsx(0),\r\nsy(0),\r\nm_bDragging(false),\r\nm_bDraggingEnabled(true)\r\n{\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;m_draggableBoxAABB, sizeof(AABB));\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;m_closeBoxAABB, sizeof(AABB));\r\n\r\n\u00a0\u00a0 \u00a0m_draggableBoxAABB.w = (float)GetImage()-&gt;GetWidth();\r\n\u00a0\u00a0 \u00a0m_draggableBoxAABB.h = (float)GetImage()-&gt;GetHeight() * 0.3f;\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0 \u00a0m_closeBoxAABB.w = 20;\r\n\u00a0\u00a0 \u00a0m_closeBoxAABB.h = 20;\u00a0\u00a0 \u00a0\r\n}\r\n\r\nGUIDraggableWiget::~GUIDraggableWiget()\r\n{\r\n}\r\n\r\nvoid GUIDraggableWiget::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 \u00a0GUIImage::Update(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0int absX, absY;\r\n\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;GetAbsMouseLocation(absX, absY);\r\n\r\n\u00a0\u00a0 \u00a0int dX = absX - sx;\r\n\u00a0\u00a0 \u00a0int dY = absY - sy;\r\n\r\n\u00a0\u00a0 \u00a0if (INPUT_MANAGER-&gt;IsMouseButtonDown(MOUSE_LEFT_BUTTON_DOWN)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; GUI_MANAGER-&gt;DoesWidgetIsOnFront(this)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; SYSTEM-&gt;HasFocus() &amp;&amp; IsActive())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (IsCollidingWithDraggableBox(absX, absY) &amp;&amp; m_bDraggingEnabled)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 m_bDragging = true;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (IsCollidingWithCloseBox(absX, absY))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetVisible(false);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_bDragging)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetDraggableBoxState(DraggableBoxState::DRAGGING);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0xPos += dX;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0yPos += dY;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/* Contraintes de bords *\/\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (yPos &lt;= 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0yPos = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (xPos &lt;= 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0xPos = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0unsigned int iWidthOffset = D3D10_RENDERER-&gt;GetViewportWidth() - GetImage()-&gt;GetWidth();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0unsigned int iHeightOffset = D3D10_RENDERER-&gt;GetViewportHeight() - GetImage()-&gt;GetHeight();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/* Contraintes de bords *\/\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (xPos &gt;= iWidthOffset)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0xPos = iWidthOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (yPos &gt;= iHeightOffset)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0yPos = iHeightOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetPosition(xPos, yPos);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_bDragging = false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0sx = absX;\r\n\u00a0\u00a0 \u00a0sy = absY;\r\n}\r\n\r\nbool GUIDraggableWiget::IsCollidingWithDraggableBox(int x, int y)\r\n{\r\n\u00a0\u00a0 \u00a0return (x &gt;= m_draggableBoxAABB.x) &amp;&amp; (x &lt; (m_draggableBoxAABB.x + m_draggableBoxAABB.w))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; (y &gt;= m_draggableBoxAABB.y) &amp;&amp; (y &lt; (m_draggableBoxAABB.y + m_draggableBoxAABB.h))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; IsVisible();\r\n}\r\n\r\nbool GUIDraggableWiget::IsCollidingWithCloseBox(int x, int y)\r\n{\r\n\u00a0\u00a0 \u00a0return (x &gt;= m_closeBoxAABB.x) &amp;&amp; (x &lt; (m_closeBoxAABB.x + m_closeBoxAABB.w))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; (y &gt;= m_closeBoxAABB.y) &amp;&amp; (y &lt; (m_closeBoxAABB.y + m_closeBoxAABB.h))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; IsVisible();\r\n}\r\n\r\nvoid GUIDraggableWiget::SetDraggableBoxState(DraggableBoxState state)\r\n{\r\n\u00a0\u00a0 \u00a0m_state = state;\r\n}\r\n\u00a0\u00a0 \u00a0\r\nGUIDraggableWiget::DraggableBoxState GUIDraggableWiget::GetDraggableBoxState()\r\n{\r\n\u00a0\u00a0 \u00a0return m_state;\r\n}\r\n\r\nvoid GUIDraggableWiget::SetBoxesPositions(unsigned int x, unsigned int y)\r\n{ \u00a0\r\n\u00a0\u00a0 \u00a0m_draggableBoxAABB.x = x;\r\n\u00a0\u00a0 \u00a0m_draggableBoxAABB.y = y;\r\n\r\n\u00a0\u00a0 \u00a0m_closeBoxAABB.x = (GetImage()-&gt;GetWidth() - m_closeBoxAABB.w) + x;\r\n\u00a0\u00a0 \u00a0m_closeBoxAABB.y = y;\r\n}\r\n\r\nD3DXVECTOR2 GUIDraggableWiget::GetDraggableBoxPosition()\r\n{ \u00a0\r\n\u00a0\u00a0 \u00a0return D3DXVECTOR2(m_draggableBoxAABB.x, m_draggableBoxAABB.y);\r\n}\r\n\r\nvoid GUIDraggableWiget::SetPosition(unsigned int x, unsigned int y)\r\n{ \u00a0\r\n\u00a0\u00a0 \u00a0SetBoxesPositions(x, y);\r\n\r\n\u00a0\u00a0 \u00a0xPos = x;\r\n\u00a0\u00a0 \u00a0yPos = y;\r\n\r\n\u00a0\u00a0 \u00a0GUIImage::SetPosition(x, y);\r\n}\r\n\r\nvoid GUIDraggableWiget::SetSize(unsigned int iWidth, unsigned int iHeight)\r\n{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0GUIImage::SetSize(iWidth, iHeight);\r\n\r\n\u00a0\u00a0 \u00a0m_draggableBoxAABB.w = (float)GetImage()-&gt;GetWidth();\r\n\u00a0\u00a0 \u00a0m_draggableBoxAABB.h = (float)GetImage()-&gt;GetHeight() * 0.3f;\u00a0\u00a0 \u00a0\r\n}\r\n\r\nvoid GUIDraggableWiget::DisableDragging()\r\n{\r\n\u00a0\u00a0 \u00a0m_bDraggingEnabled = false;\r\n}\r\n\r\nvoid GUIDraggableWiget::EnableDragging()\r\n{\r\n\u00a0\u00a0 \u00a0m_bDraggingEnabled = true;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons d\u00e9crit une classe qui repr\u00e9sente un moyen d&rsquo;afficher une GUIWidget d\u00e9pla\u00e7able.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Parfois nous avons besoin qu&rsquo;une GUIWidget puisse \u00eatre d\u00e9pla\u00e7able \u00e0 volont\u00e9 tout en restant appuy\u00e9 dessus la souris. Pr\u00e9requis : &#8211; Avoir compris la classe GUIWidget Contenu : Voici le contenu\u00a0GUIDraggableWidget.h : &nbsp; Voici le fichier GUIDraggableWidget.cpp : &nbsp; R\u00e9sum\u00e9 : Nous avons d\u00e9crit une classe qui repr\u00e9sente un moyen d&rsquo;afficher une GUIWidget [&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\/5056"}],"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=5056"}],"version-history":[{"count":14,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5056\/revisions"}],"predecessor-version":[{"id":5101,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5056\/revisions\/5101"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}