<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Einen Handcursor solange die Maus über dem Button ist]]></title><description><![CDATA[<p>Hallo zusammen und ein frohes neues Jahr.<br />
Ich bin ein C++ Neuling und benutze Visual C++ 6.0 als Entwicklungsumgebung.<br />
Ich habe ein kleines Programm geschrieben in welchem es einen Button gibt.<br />
Ich will nun das der Mauscursor zur Hand wird solange sich der Cursor auf dem Button befindet. Verlässt die Maus den Button soll wieder der normale Pfeilcursor erscheinen.<br />
Kann ich dem Button einen bestimmten Cursor zuweisen?<br />
zardoz</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170743/einen-handcursor-solange-die-maus-über-dem-button-ist</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 03:46:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170743.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Jan 2007 10:07:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 10:07:29 GMT]]></title><description><![CDATA[<p>Hallo zusammen und ein frohes neues Jahr.<br />
Ich bin ein C++ Neuling und benutze Visual C++ 6.0 als Entwicklungsumgebung.<br />
Ich habe ein kleines Programm geschrieben in welchem es einen Button gibt.<br />
Ich will nun das der Mauscursor zur Hand wird solange sich der Cursor auf dem Button befindet. Verlässt die Maus den Button soll wieder der normale Pfeilcursor erscheinen.<br />
Kann ich dem Button einen bestimmten Cursor zuweisen?<br />
zardoz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212509</guid><dc:creator><![CDATA[zardoz]]></dc:creator><pubDate>Fri, 19 Jan 2007 10:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 10:21:07 GMT]]></title><description><![CDATA[<p>Den Cursor kannst du setzen mit SetCursor() (merk dir den Rückgabewert der Funktion, damit du später wieder den normalen Cursor zurücksetzen kannst).</p>
<p>(und der beste Ort für den Aufruf dürfte die OnMouseMove() des Buttons (zum Einschalten) bzw. des Hauptfenster (zum Ausschalten) sein)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212522</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Jan 2007 10:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 11:01:19 GMT]]></title><description><![CDATA[<p>Guten Tag CStoll.<br />
Ich habe also ein Dialogbasierendes Projekt angelegt.<br />
Du schriebst „der beste Ort für den Aufruf dürfte die OnMouseMove() des Buttons sein„<br />
Wie soll ich dem Button nun aber auf die OnMouseMove reagieren lassen.<br />
Ich habe das Projekt Mousemove genannt und habe somit die MousemoveDlg.cpp.<br />
Wenn ich die öffne und dann den Klassenassistenten öffne und unter Objekt-IDs<br />
IDC_BUTTON_1 wähle kann ich nur die Nachrichten BN_CLICKED und BN_DOUBLECLCKED auswählen.<br />
Nur wenn ich als Objekt-ID CMousemoveDlg wähle kann ich auch WM_MOUSEMOVE wählen. Da gibt es recht viele Nachrichten die ich auswählen kann. Beim Button allerdings nur zwei.<br />
Wie bringe ich also dem Button bei auf WM_MOUSEMOVE zu reagieren?<br />
Gruss zardoz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212557</guid><dc:creator><![CDATA[zardoz]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 11:17:16 GMT]]></title><description><![CDATA[<p>Hmm, dann mußt du wohl beide Punkte auf Dialog-Ebene erledigen (und dort selber unterscheiden, ob du über dem Button bist oder nicht).</p>
<pre><code class="language-cpp">HCURSOR m_hand,m_default;
bool m_ishand;
CButton m_btn;

CMouseMoveDlg():m_hand(LoadCursor(NULL,IDC_HAND)),m_ishand(false)
{...}

CMouseMoveDlg::OnMouseMove(UINT nFlags,CPoint pt)
{
  //ich bin mir nicht sicher, ob du noch die Koordinatensysteme umrechnen mußt
  bool ishand = m_btn.GetWindowRect().PtInRect(pt);
  if(ishand!=m_ishand)//Grenzüberschreitung
  {
    if(ishand)
      m_default=::SetCursor(m_hand);
    else
      ::SetCursor(m_default);
    m_ishand=ishand;
  }
  CDialog::OnMouseMove(nFlags,pt);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1212567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212567</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:17:16 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 13:03:19 GMT]]></title><description><![CDATA[<p>Hallo CStoll.<br />
Ich habe das mal fast so gemacht wie du schreibst. Ich habe folgendes in den Konstruktor eingefügt.</p>
<p>CMousemoveDlg::CMousemoveDlg(CWnd* pParent /<em>=NULL</em>/)<br />
: CDialog(CMousemoveDlg::IDD, pParent)<br />
{<br />
//{{AFX_DATA_INIT(CMousemoveDlg)<br />
// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein<br />
//}}AFX_DATA_INIT<br />
m_hIcon = AfxGetApp()-&gt;LoadIcon(IDR_MAINFRAME); //bis hier war schon alles drinn</p>
<p>m_hand = LoadCursor(NULL,IDC_HAND); //von mir eingetragen<br />
m_ishand = false; //von mir eingetragen<br />
}</p>
<p>Die OnMouseMove sieht nun so aus.<br />
void CMousemoveDlg::OnMouseMove(UINT nFlags, CPoint point)<br />
{<br />
bool ishand = m_btn.GetWindowRect().PtInRect(point);<br />
if(ishand!=m_ishand)//Grenzüberschreitung<br />
{<br />
if(ishand)<br />
m_default=::SetCursor(m_hand);<br />
else<br />
::SetCursor(m_default);<br />
m_ishand=ishand;<br />
}<br />
CDialog::OnMouseMove(nFlags, point);<br />
}</p>
<p>Ich bekomme als erste Fehlermeldung “error C2065: 'IDC_HAND' : nichtdeklarierter Bezeichner“<br />
Habe also aus IDC_HAND IDC_CROSS gemacht.</p>
<p>Nun die nächsten Fehlermeldungen.<br />
: error C2660: 'GetWindowRect' : Funktion akzeptiert keine 0 Parameter<br />
: error C2228: Der linke Teil von '.PtInRect' muss eine Klasse/Struktur/Union sein</p>
<p>Habe nun folgende Änderung vorgenommen.<br />
bool ishand = m_btn.GetWindowRect(PtInRect(point));</p>
<p>Nun die Fehlermeldung :error C2660: 'PtInRect' : Funktion akzeptiert keine 1 Parameter</p>
<p>Laut MSDN sollte aber ein Parameter ausreichen.<br />
Und laut MSDN gibt es auch IDC_HAND. Wenn ich in der winuser.h nachsehe wo die ganzen Cursor-Formen deklariert sind finde ich aber auch IDC_HAND. Komisch.<br />
gruss zardoz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212629</guid><dc:creator><![CDATA[zardoz]]></dc:creator><pubDate>Fri, 19 Jan 2007 13:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 13:11:05 GMT]]></title><description><![CDATA[<p>zardoz schrieb:</p>
<blockquote>
<p>Nun die nächsten Fehlermeldungen.<br />
: error C2660: 'GetWindowRect' : Funktion akzeptiert keine 0 Parameter<br />
: error C2228: Der linke Teil von '.PtInRect' muss eine Klasse/Struktur/Union sein</p>
<p>Habe nun folgende Änderung vorgenommen.<br />
bool ishand = m_btn.GetWindowRect(PtInRect(point));</p>
<p>Nun die Fehlermeldung :error C2660: 'PtInRect' : Funktion akzeptiert keine 1 Parameter</p>
</blockquote>
<p>Ich hätte vielleicht dazuschreiben sollen, daß ich den Code ohne einen ausführlichen Blick in die MSDN geschrieben habe. Richtig müsste es so aussehen:</p>
<pre><code class="language-cpp">CRect r;
m_btn.GetWindowRect(r);
bool ishand = r.PtInRect(point);
</code></pre>
<blockquote>
<p>Laut MSDN sollte aber ein Parameter ausreichen.</p>
</blockquote>
<p>Laut MSDN gibt es die Funktion entweder als Member von CRect oder als globale Funktion (und letztere erwartet 2 Parameter)</p>
<blockquote>
<p>Und laut MSDN gibt es auch IDC_HAND. Wenn ich in der winuser.h nachsehe wo die ganzen Cursor-Formen deklariert sind finde ich aber auch IDC_HAND. Komisch.</p>
</blockquote>
<p>Laut MSDN ist die IDC_HAND definiert für &quot;Windows NT 5.0 and later&quot; - was für ein System verwendest du? (und hast du auch diese Version der winuser.h eingebunden?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212635</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Jan 2007 13:11:05 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Handcursor solange die Maus über dem Button ist on Fri, 19 Jan 2007 15:15:03 GMT]]></title><description><![CDATA[<p>Hallo CStoll.<br />
Bin wieder ein Stück weiter aber noch nicht am Ziel. Die OnMouseMove sieht nun so aus.<br />
Der cursor bleibt aber wie er ist.</p>
<p>void CMousemoveDlg::OnMouseMove(UINT nFlags, CPoint point)<br />
{<br />
CRect r;<br />
m_button.GetWindowRect(r); // m_button ist von hier DDX_Control(pDX, IDC_BUTTON1, m_button);<br />
ishand = (r.PtInRect(point));<br />
TRACE(&quot;\n das ist ishand == %i \n\n&quot;, ishand);</p>
<p>if(ishand!=m_ishand)//Grenzüberschreitung<br />
{<br />
if(ishand)<br />
{<br />
m_default=::SetCursor(m_hand);<br />
}<br />
else<br />
{<br />
::SetCursor(m_default);<br />
}<br />
m_ishand=ishand;<br />
}<br />
CDialog::OnMouseMove(nFlags, point);<br />
}</p>
<p>Habe durch das TRACE festgestellt das ishand immer false bleibt.</p>
<p>Habe nun die OnMouseMove folgendermassen umgeändert um ein reinspringen in die if zu erzwingen.</p>
<p>void CMousemoveDlg::OnMouseMove(UINT nFlags, CPoint point)<br />
{<br />
CRect r;<br />
m_button.GetWindowRect(r);<br />
ishand = (r.PtInRect(point));<br />
TRACE(&quot;\n das ist ishand == %i \n\n&quot;, ishand);</p>
<p>if(true)//Grenzüberschreitung<br />
{<br />
if(true)<br />
{<br />
m_default=::SetCursor(m_hand);<br />
}<br />
else<br />
{<br />
::SetCursor(m_default);<br />
}<br />
m_ishand=ishand;<br />
}<br />
CDialog::OnMouseMove(nFlags, point);<br />
}</p>
<p>Das Ergebnis ist das im Dialogfenster solange ein Cross-Cursor zu sehen ist bis ich über dem Button angelangt bin ab dann ist wieder der normale Pfeilcursor zu sehen.</p>
<p>Zu diesem IDC_HAND. Ich habe hier Winxp Professional.<br />
Die winuser.h habe ich nun mal mit<br />
#include &quot;winuser.h&quot; eingebunden ohne das sich etwas ändert. Die anderen Cursor die in der winuser.h drinnen stehen gehen ja auch ohne das ich diese Datei extra einbinde.</p>
<p>gruss zardoz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212708</guid><dc:creator><![CDATA[zardoz]]></dc:creator><pubDate>Fri, 19 Jan 2007 15:15:03 GMT</pubDate></item></channel></rss>