<?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[Aufbau &#x2F; Benutzung der MENUITEMINFO-Struktur]]></title><description><![CDATA[<p>Mir bereitet die Manipulation von Menü-Einträgen mithilfe SetMenuItemInfo() und der MENUITEMINFO-Struktur Kopfzerbrechen! Ich will z.B. bei fState zwischen MFS_ENABLED und MFS_DISABLED, oder zwischen MFS_CHECKED und MFS_UNCHECKED hin- und herschalten. Dazu setze ich zunächst fMask auf MIIM_STATE, um fState zu setzen / zu lesen.</p>
<p>Jetzt sieht das wie folgt aus:<br />
Wenn MFS_ENABLED gesetzt ist, setze ich MFS_DISABLED und umgekehrt.<br />
Wenn MFS_CHECKED gesetzt ist, setze ich MFS_UNCHECKED und umgekehrt.</p>
<p>Soweit die Theorie... Jetzt mal ein erstes Beispiel, wie ich mir das Vorstelle:</p>
<pre><code class="language-cpp">MENUITEMINFO mif;
mif.cbSize = sizeof(MENUITEMINFO);
mif.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);

mif.fState = mif.fState &amp; MFS_CHECKED ? MFS_UNCHECKED : MFS_CHECKED;
SetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);
</code></pre>
<p>Dabei gilt:</p>
<pre><code>MFS_CHECKED = MF_CHECKED   = 0x00000008L
MFS_UNCHECKED     = MF_UNCHECKED = 0x00000000L
</code></pre>
<p>Das heißt, wenn MFS_CHECKED gesetzt ist, sieht mein Bitmuster mindestens so aus:<br />
0000 1000</p>
<p>Aber was, wenn noch andere Bits gesetzt waren? Die würde ich einfach löschen und somit ungewollt irgendwelche Einstellungen ändern! Jetzt kommt es mir natürlich in den Sinn, MFS_CHECKED so zu setzen:</p>
<pre><code class="language-cpp">mif.fState |= MFS_CHECKED;
</code></pre>
<p>Das würde dazu führen, dass MFS_CHECKED zusätzlich gesetzt wird, die original-Bits aber gesetzt bleiben. Problem: Was ist, wenn MFS_UNCHECKED gesetzt ist? Dann hab ich mir ja nen schönen Widerspruch gebaut, das Menu-Item ist checked und gleichzeitig unchecked!</p>
<p>Aber es kommt ja noch härter, MFS_ENABLED / MFS_DISABLED sorgt für die totale Verwirrung: Was oben mit MFS_CHECKED / MFS_UNCHECKED noch so wunderbar geklappt hat, funktioniert mit MFS_ENABLED / MFS_DISABLED <strong>nicht</strong>!</p>
<p>Das heißt in Code:</p>
<pre><code class="language-cpp">MENUITEMINFO mif;
mif.cbSize = sizeof(MENUITEMINFO);
mif.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);

mif.fState = mif.fState &amp; MFS_ENABLED ? MFS_DISABLED : MFS_ENABLED;
SetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);
</code></pre>
<p>...natürlich versuche ich dabei nicht, den deaktiverten Menüeintrag mit einem Klick auf ihn selbst zu aktivieren!<br />
Die entsprechenden Werte sehen dabei übrigens so aus:</p>
<pre><code>MFS_ENABLED  = MF_ENABLED  = 0x00000000L = 0000 0000
MFS_GRAYED   = MF_GRAYED   = 0x00000001L = 0000 0001
MFS_DISABLED = MF_DISABLED = 0x00000002L = 0000 0010
</code></pre>
<p>Und hier verfange ich mich schon wieder in Widerspruchlüchkeiten. Die MSDN sagt, MFS_DISABLED und MFS_GRAYED sei dasselbe, das Bitmuster ist es aber ganz offensichtlich nicht! Und wie sonst soll man die Werte manipulieren? Aber selbst wenn man im Code oben MFS_DISABLED mit MFS_GRAYED ersetzt, funktioniert es nicht! Ich verstehe wirklich nicht, warum! Und wieso haben MFS_ENABLED und MFS_DISABLED unterschiedliche Bits? Wieso kann ein Button zur gleichen Zeit aktiviert und deaktiviert sein?</p>
<p>Bitte verschafft mir hier mal ein wenig mehr Durchblick!<br />
Danke im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/210682/aufbau-benutzung-der-menuiteminfo-struktur</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 20:22:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/210682.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Apr 2008 22:58:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aufbau &#x2F; Benutzung der MENUITEMINFO-Struktur on Sun, 13 Apr 2008 22:58:21 GMT]]></title><description><![CDATA[<p>Mir bereitet die Manipulation von Menü-Einträgen mithilfe SetMenuItemInfo() und der MENUITEMINFO-Struktur Kopfzerbrechen! Ich will z.B. bei fState zwischen MFS_ENABLED und MFS_DISABLED, oder zwischen MFS_CHECKED und MFS_UNCHECKED hin- und herschalten. Dazu setze ich zunächst fMask auf MIIM_STATE, um fState zu setzen / zu lesen.</p>
<p>Jetzt sieht das wie folgt aus:<br />
Wenn MFS_ENABLED gesetzt ist, setze ich MFS_DISABLED und umgekehrt.<br />
Wenn MFS_CHECKED gesetzt ist, setze ich MFS_UNCHECKED und umgekehrt.</p>
<p>Soweit die Theorie... Jetzt mal ein erstes Beispiel, wie ich mir das Vorstelle:</p>
<pre><code class="language-cpp">MENUITEMINFO mif;
mif.cbSize = sizeof(MENUITEMINFO);
mif.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);

mif.fState = mif.fState &amp; MFS_CHECKED ? MFS_UNCHECKED : MFS_CHECKED;
SetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);
</code></pre>
<p>Dabei gilt:</p>
<pre><code>MFS_CHECKED = MF_CHECKED   = 0x00000008L
MFS_UNCHECKED     = MF_UNCHECKED = 0x00000000L
</code></pre>
<p>Das heißt, wenn MFS_CHECKED gesetzt ist, sieht mein Bitmuster mindestens so aus:<br />
0000 1000</p>
<p>Aber was, wenn noch andere Bits gesetzt waren? Die würde ich einfach löschen und somit ungewollt irgendwelche Einstellungen ändern! Jetzt kommt es mir natürlich in den Sinn, MFS_CHECKED so zu setzen:</p>
<pre><code class="language-cpp">mif.fState |= MFS_CHECKED;
</code></pre>
<p>Das würde dazu führen, dass MFS_CHECKED zusätzlich gesetzt wird, die original-Bits aber gesetzt bleiben. Problem: Was ist, wenn MFS_UNCHECKED gesetzt ist? Dann hab ich mir ja nen schönen Widerspruch gebaut, das Menu-Item ist checked und gleichzeitig unchecked!</p>
<p>Aber es kommt ja noch härter, MFS_ENABLED / MFS_DISABLED sorgt für die totale Verwirrung: Was oben mit MFS_CHECKED / MFS_UNCHECKED noch so wunderbar geklappt hat, funktioniert mit MFS_ENABLED / MFS_DISABLED <strong>nicht</strong>!</p>
<p>Das heißt in Code:</p>
<pre><code class="language-cpp">MENUITEMINFO mif;
mif.cbSize = sizeof(MENUITEMINFO);
mif.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);

mif.fState = mif.fState &amp; MFS_ENABLED ? MFS_DISABLED : MFS_ENABLED;
SetMenuItemInfo(hMenu, Identifier, FALSE, &amp;mif);
</code></pre>
<p>...natürlich versuche ich dabei nicht, den deaktiverten Menüeintrag mit einem Klick auf ihn selbst zu aktivieren!<br />
Die entsprechenden Werte sehen dabei übrigens so aus:</p>
<pre><code>MFS_ENABLED  = MF_ENABLED  = 0x00000000L = 0000 0000
MFS_GRAYED   = MF_GRAYED   = 0x00000001L = 0000 0001
MFS_DISABLED = MF_DISABLED = 0x00000002L = 0000 0010
</code></pre>
<p>Und hier verfange ich mich schon wieder in Widerspruchlüchkeiten. Die MSDN sagt, MFS_DISABLED und MFS_GRAYED sei dasselbe, das Bitmuster ist es aber ganz offensichtlich nicht! Und wie sonst soll man die Werte manipulieren? Aber selbst wenn man im Code oben MFS_DISABLED mit MFS_GRAYED ersetzt, funktioniert es nicht! Ich verstehe wirklich nicht, warum! Und wieso haben MFS_ENABLED und MFS_DISABLED unterschiedliche Bits? Wieso kann ein Button zur gleichen Zeit aktiviert und deaktiviert sein?</p>
<p>Bitte verschafft mir hier mal ein wenig mehr Durchblick!<br />
Danke im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1491554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1491554</guid><dc:creator><![CDATA[MENUITEMINFO]]></dc:creator><pubDate>Sun, 13 Apr 2008 22:58:21 GMT</pubDate></item><item><title><![CDATA[Reply to Aufbau &#x2F; Benutzung der MENUITEMINFO-Struktur on Mon, 14 Apr 2008 06:38:22 GMT]]></title><description><![CDATA[<p>Ich habe keine Ahnung was für ein SDK Du verwendest, bei mir ist</p>
<pre><code class="language-cpp">#define MFS_GRAYED          0x00000003L
#define MFS_DISABLED        MFS_GRAYED
</code></pre>
<p>Dasmit MFS_ENABLED ist wirklich verwirrend.<br />
Es ist offensichtlich, dass nur MFS_GRAYED/MFS_DISABLED hier den Status zeigen.</p>
<p>D.h. willst Du einen Eintrag enabled anzeigen, heißt das:</p>
<pre><code class="language-cpp">mif.fState &amp;= ~(MFS_GRAYED);
</code></pre>
<p>Gleiches gilt für MFS_CHECKED:</p>
<p>Setzen:</p>
<pre><code class="language-cpp">mif.fState |= MFS_CHECKED;
</code></pre>
<p>Löschen</p>
<pre><code class="language-cpp">mif.fState &amp;= ~(MFS_CHECKED);
</code></pre>
<p>Ich würde nur mit |= und &amp;= ~ arbeiten un den entsprechenden signifikanten Flags.</p>
<p>Ich gebe Dir recht, es ist verwirrend, aber denoch logisch... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1491599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1491599</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 14 Apr 2008 06:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Aufbau &#x2F; Benutzung der MENUITEMINFO-Struktur on Mon, 14 Apr 2008 16:56:30 GMT]]></title><description><![CDATA[<p>Ja, so wie du es sagst, erscheint es mir jetzt absolut logisch, danke :-).</p>
<p>Aber wofür gibt es MFS_ENABLED? Zum Plattform SDK: Windows Server 2003 R2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1491952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1491952</guid><dc:creator><![CDATA[MENUITEMINFO]]></dc:creator><pubDate>Mon, 14 Apr 2008 16:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to Aufbau &#x2F; Benutzung der MENUITEMINFO-Struktur on Mon, 14 Apr 2008 17:37:43 GMT]]></title><description><![CDATA[<p>Damit man bei einer Menuitem Ressource nicht 0 schreibten muss sondern eben MF_ENABLED. Das liest sich einfach besser, selbst wenn es nichts aktiv tut.</p>
<p>Es gibt auch Code bei dem aktiv ein Flag mitgereicht werden soll. Wie willst Du jetzt im Code sagen: Setze dieses Item enabled!</p>
<p>Im Endeffekt ist es ein lesbarer Platzhalter.</p>
<p>PS: Diese Diskrepanzen gibt es übrigends auch noch bei anderen Bit Maksen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1491974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1491974</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 14 Apr 2008 17:37:43 GMT</pubDate></item></channel></rss>