<?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[Frage wg. dynamischem Menü]]></title><description><![CDATA[<p>Ich wollte mir für das normale Hauptmenü während der Laufzeit dynamisch Menüeinträge erzeugen lassen.<br />
Und zwar sol diese Datei ausgelesen werden:</p>
<pre><code>.submenu 1
  ..submenu 1_1
  ..submenu 1_2
  .submenu2
  .submenu3
  ..submenu 3_1
</code></pre>
<p>.. sollen untermenüs von . sein<br />
Die datei kann natürlich variieren, der Grundaufbau ist aber immer gleich und .. ist die höhste Verzweigung der Untermenüs.</p>
<p>Ich habe mir dann folgenden Code zusammengeschustert:</p>
<pre><code>BOOL CMainFrame::CreateMenus()
{
	int iZeile = 0;
	unsigned int iID = first_ID + 1;
	int iSubMenuCount = -1;
	CStdioFile fDatei;
	CString sPath = m_config.GetConfigDir() + &quot;Programm.cfg&quot;; //Gibt zu öffnende Datei wieder
	CString sZeile, sZeile_old;

	CMenu MainMenu, Menu;
	CMenu subMenu[5];
	Menu.CreatePopupMenu();

	//einlesen der richtigen Dateistruktur und speichern der Untermenüs in subMenu[x]
	if (fDatei.Open( sPath, CFile::modeRead))
	{
		while( fDatei.ReadString(sZeile) || (! sZeile.IsEmpty()))
		{
			sZeile.TrimLeft();
			sZeile.TrimRight();
			if (sZeile.Left(1) == &quot;.&quot;)
			{
				if (sZeile_old.Left(2) != &quot;..&quot; &amp;&amp; sZeile.Left(2) == &quot;..&quot;)
				{
					//dann PopupMenü erstellen
					iSubMenuCount++;
					subMenu[iSubMenuCount].CreatePopupMenu();
				}
				else if (sZeile_old.Left(2) == &quot;..&quot;) 
				{
					//dann PopupMenü-Eintrag anhängen
					subMenu[iSubMenuCount].AppendMenu(MF_BYPOSITION,iID,sZeile_old);
				}
				sZeile_old = sZeile;
				iID++;
			}
			iZeile++;
		}
	}
	fDatei.Close(); 

	iSubMenuCount = -1;
	//speichern der gesamten Menüstruktur in Menu
	if (fDatei.Open( sPath, CFile::modeRead))
	{
		while( fDatei.ReadString(sZeile) || (! sZeile.IsEmpty()))
		{
			sZeile.TrimLeft();
			sZeile.TrimRight();
			if (sZeile.Left(1) == &quot;.&quot;)
			{
				if (sZeile_old.Left(2) != &quot;..&quot; &amp;&amp; sZeile.Left(2) == &quot;..&quot;)
				{
					//dann PopupMenü
					iSubMenuCount++;
					Menu.AppendMenu(MF_BYPOSITION | MF_POPUP, (UINT)subMenu[iSubMenuCount].m_hMenu, sZeile_old);
				}
				else if (sZeile_old.Left(2) == &quot;..&quot; &amp;&amp; sZeile.Left(2) == &quot;..&quot;)
				{}
				else
					Menu.AppendMenu(MF_BYPOSITION,iID,sZeile);
				sZeile_old = sZeile;
				iID++;
			}
		}
	}
	fDatei.Close(); 
	MainMenu.LoadMenu(IDR_MAINFRAME);//das Hauptmenü 
	MainMenu.InsertMenu(2, MF_BYPOSITION | MF_POPUP, (UINT)Menu.m_hMenu, &quot;Dateneingabe&quot;); 
    SetMenu(&amp;MainMenu); 
    MainMenu.Detach();//Recource wieder freigeben 
	Menu.Detach();
	return true;
}
</code></pre>
<p>Das hierbei die letzte Zeile nicht verarbeitet wird, kann erstmal ignoriert werden.<br />
Ich hatte mir gedacht, ich laufe die Datei erst einmal durch und packe alle Untermenüs in die jeweiligen PopupMenüs zusammen (Es muss immer ein neues PopupMenü erstellt werden, wenn auf ein . ein .. folgt). Dann ein 2. Durchlauf und alles in ein übergeordnetes CMenü und dieses dann ins Hauptmenü einfügen.<br />
compilieren tut er ohne Fehler, aber wenn ich dann im Menü auf &quot;Dateneingabe&quot; klicke, stürzt er ab.<br />
Unschön finde ich es auch noch, das ich so die Anzahl der subMenus auf max. 5 begrenzt habe. wie kann ich das ganze ohne Begrenzung der Anzahl machen?<br />
Und vorallem, wieso funktioniert der Code nicht?</p>
<p>mfg<br />
tie</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/82714/frage-wg-dynamischem-menü</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 05:08:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/82714.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Aug 2004 11:18:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Fri, 13 Aug 2004 12:22:38 GMT]]></title><description><![CDATA[<p>Ich wollte mir für das normale Hauptmenü während der Laufzeit dynamisch Menüeinträge erzeugen lassen.<br />
Und zwar sol diese Datei ausgelesen werden:</p>
<pre><code>.submenu 1
  ..submenu 1_1
  ..submenu 1_2
  .submenu2
  .submenu3
  ..submenu 3_1
</code></pre>
<p>.. sollen untermenüs von . sein<br />
Die datei kann natürlich variieren, der Grundaufbau ist aber immer gleich und .. ist die höhste Verzweigung der Untermenüs.</p>
<p>Ich habe mir dann folgenden Code zusammengeschustert:</p>
<pre><code>BOOL CMainFrame::CreateMenus()
{
	int iZeile = 0;
	unsigned int iID = first_ID + 1;
	int iSubMenuCount = -1;
	CStdioFile fDatei;
	CString sPath = m_config.GetConfigDir() + &quot;Programm.cfg&quot;; //Gibt zu öffnende Datei wieder
	CString sZeile, sZeile_old;

	CMenu MainMenu, Menu;
	CMenu subMenu[5];
	Menu.CreatePopupMenu();

	//einlesen der richtigen Dateistruktur und speichern der Untermenüs in subMenu[x]
	if (fDatei.Open( sPath, CFile::modeRead))
	{
		while( fDatei.ReadString(sZeile) || (! sZeile.IsEmpty()))
		{
			sZeile.TrimLeft();
			sZeile.TrimRight();
			if (sZeile.Left(1) == &quot;.&quot;)
			{
				if (sZeile_old.Left(2) != &quot;..&quot; &amp;&amp; sZeile.Left(2) == &quot;..&quot;)
				{
					//dann PopupMenü erstellen
					iSubMenuCount++;
					subMenu[iSubMenuCount].CreatePopupMenu();
				}
				else if (sZeile_old.Left(2) == &quot;..&quot;) 
				{
					//dann PopupMenü-Eintrag anhängen
					subMenu[iSubMenuCount].AppendMenu(MF_BYPOSITION,iID,sZeile_old);
				}
				sZeile_old = sZeile;
				iID++;
			}
			iZeile++;
		}
	}
	fDatei.Close(); 

	iSubMenuCount = -1;
	//speichern der gesamten Menüstruktur in Menu
	if (fDatei.Open( sPath, CFile::modeRead))
	{
		while( fDatei.ReadString(sZeile) || (! sZeile.IsEmpty()))
		{
			sZeile.TrimLeft();
			sZeile.TrimRight();
			if (sZeile.Left(1) == &quot;.&quot;)
			{
				if (sZeile_old.Left(2) != &quot;..&quot; &amp;&amp; sZeile.Left(2) == &quot;..&quot;)
				{
					//dann PopupMenü
					iSubMenuCount++;
					Menu.AppendMenu(MF_BYPOSITION | MF_POPUP, (UINT)subMenu[iSubMenuCount].m_hMenu, sZeile_old);
				}
				else if (sZeile_old.Left(2) == &quot;..&quot; &amp;&amp; sZeile.Left(2) == &quot;..&quot;)
				{}
				else
					Menu.AppendMenu(MF_BYPOSITION,iID,sZeile);
				sZeile_old = sZeile;
				iID++;
			}
		}
	}
	fDatei.Close(); 
	MainMenu.LoadMenu(IDR_MAINFRAME);//das Hauptmenü 
	MainMenu.InsertMenu(2, MF_BYPOSITION | MF_POPUP, (UINT)Menu.m_hMenu, &quot;Dateneingabe&quot;); 
    SetMenu(&amp;MainMenu); 
    MainMenu.Detach();//Recource wieder freigeben 
	Menu.Detach();
	return true;
}
</code></pre>
<p>Das hierbei die letzte Zeile nicht verarbeitet wird, kann erstmal ignoriert werden.<br />
Ich hatte mir gedacht, ich laufe die Datei erst einmal durch und packe alle Untermenüs in die jeweiligen PopupMenüs zusammen (Es muss immer ein neues PopupMenü erstellt werden, wenn auf ein . ein .. folgt). Dann ein 2. Durchlauf und alles in ein übergeordnetes CMenü und dieses dann ins Hauptmenü einfügen.<br />
compilieren tut er ohne Fehler, aber wenn ich dann im Menü auf &quot;Dateneingabe&quot; klicke, stürzt er ab.<br />
Unschön finde ich es auch noch, das ich so die Anzahl der subMenus auf max. 5 begrenzt habe. wie kann ich das ganze ohne Begrenzung der Anzahl machen?<br />
Und vorallem, wieso funktioniert der Code nicht?</p>
<p>mfg<br />
tie</p>
]]></description><link>https://www.c-plusplus.net/forum/post/581881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/581881</guid><dc:creator><![CDATA[Tie]]></dc:creator><pubDate>Fri, 13 Aug 2004 12:22:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Fri, 13 Aug 2004 16:00:35 GMT]]></title><description><![CDATA[<p>Hab es nach viel rumprobieren jetzt hingekriegt:</p>
<pre><code>BOOL CMainFrame::CreateMenus() 
{ 
    bool bSubMenu = false; 
    int iZeile = 0; 
    unsigned int iID = first_ID + 1; 
    CStdioFile fDatei; 
    CString sPath = m_config.GetConfigDir() + &quot;Programm.cfg&quot;; //Gibt zu öffnende Datei wieder 
    CString sZeile, sZeile_old; 

    CMenu MainMenu, Menu; 
    CMenu *subMenu = new CMenu; 
	subMenu-&gt;CreatePopupMenu();
    Menu.CreatePopupMenu(); 

    //einlesen der richtigen Dateistruktur und speichern der Untermenüs in subMenu[x] 
    if (fDatei.Open( sPath, CFile::modeRead)) 
    { 
        while( fDatei.ReadString(sZeile) || (! sZeile.IsEmpty())) 
        { 
            sZeile.TrimLeft(); 
            sZeile.TrimRight(); 
            if (sZeile.Left(1) == &quot;.&quot;) 
            { 
                if (sZeile.Left(2) == &quot;..&quot;) 
                { 
                    bSubMenu = true; 
                    subMenu-&gt;AppendMenu(MF_STRING,iID++,sZeile); 
                } 
                else 
				{
					if (bSubMenu)
					{
						Menu.AppendMenu(MF_BYPOSITION | MF_POPUP, (unsigned int)subMenu-&gt;GetSafeHmenu(), sZeile_old);
						subMenu = new CMenu; 
						subMenu-&gt;CreatePopupMenu();
					}
					else
						Menu.AppendMenu(MF_STRING,iID++,sZeile);
					sZeile_old = sZeile;
                    bSubMenu = false; 
				}
            } 
            iZeile++; 
        } 
    } 
    fDatei.Close(); 
	if (bSubMenu)
		Menu.AppendMenu(MF_BYPOSITION | MF_POPUP, (unsigned int)subMenu-&gt;GetSafeHmenu(), sZeile_old);
	else
		Menu.AppendMenu(MF_STRING,iID++,sZeile_old);

    MainMenu.LoadMenu(IDR_MAINFRAME);//das Hauptmenü 
    MainMenu.InsertMenu(2, MF_BYPOSITION | MF_POPUP, (UINT)Menu.GetSafeHmenu(), &quot;Dateneingabe&quot;); 
    SetMenu(&amp;MainMenu); 
    MainMenu.Detach();//Recource wieder freigeben 
    Menu.Detach(); 
    return true; 
}
</code></pre>
<p>Ich weiss aber nicht, ob das mit dem subMenu = new CMenu; subMenu-&gt;CreatePopupMenu(); so sauber ist. vielleicht gibts da ja ne bessere lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582024</guid><dc:creator><![CDATA[Tie]]></dc:creator><pubDate>Fri, 13 Aug 2004 16:00:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Fri, 13 Aug 2004 16:51:58 GMT]]></title><description><![CDATA[<p>Ich hoffe mal in diesem Thread bleibt es nicht bei den Selbstgesprächen und ihr könnt mir hier helfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Die Menüeinträge sind jetzt alle disabled.<br />
Also wollte ich die mit EnableMenuItem() klickbar machen.</p>
<p>hab mir das so gedacht:</p>
<pre><code>subMenu-&gt;AppendMenu(MF_STRING,iID,sZeile); 
					tempMenu = subMenu-&gt;GetSubMenu(subMenu-&gt;GetMenuItemCount()-1);
					tempMenu-&gt;EnableMenuItem(iID++, MF_ENABLED);
</code></pre>
<p>statt</p>
<pre><code>subMenu-&gt;AppendMenu(MF_STRING,iID++,sZeile);
</code></pre>
<p>Aber tempMenu bekommt nur den Wert 0 und in der EnableMenuItem-Zeile kommt es dann zum Absturz</p>
<p>tempMenu is natürlich auch ein Zeiger der Klasse CMenu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582206</guid><dc:creator><![CDATA[Tie]]></dc:creator><pubDate>Fri, 13 Aug 2004 16:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Sun, 15 Aug 2004 12:26:04 GMT]]></title><description><![CDATA[<p>*up*<br />
prob besteht immernoch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/583167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/583167</guid><dc:creator><![CDATA[Tie]]></dc:creator><pubDate>Sun, 15 Aug 2004 12:26:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Mon, 16 Aug 2004 08:50:44 GMT]]></title><description><![CDATA[<p>hab jetzt was gefunden, was wohl die lösung sein könnte</p>
<blockquote>
<p>Hi all.</p>
<p>I already know the solution, though I'm getting quite a lot of mails how did I solve this problem.</p>
<p>Window's main menu has items, which are submenus, and submenus has items<br />
which are usually final items, or (somtimes) further submenus. Usual menu looks like this:</p>
<p>menu=<br />
submenu1 submenu2 submenu3 ....<br />
item11 item21 item31<br />
item12 item22 ...<br />
... ...<br />
etc.</p>
<p>But the menus are stored dynamically, means: menu has only pointers to<br />
each submenu, and when You call GetSubmenu(GetMainMenu(MainWindow,...));<br />
it returns You the pointer to that submenu. But it is stored in some other<br />
way (I've forgotten how and don't understand why), so when You set this<br />
item, it seams to be changed (no error code). But it loads every time<br />
dynamically - from the previous definition (From the resource file or menu<br />
created firs time) and draws as You created it for the first time.</p>
<p>It is running on the main menu correctly, because it does not<br />
reload from the resource. The main menu remains same all the time.</p>
<p>So the solution is:</p>
<p>when submenu1 has defined constatnt MI_ITEM1, submenu2 MI_ITEM2, etc:</p>
<p>//In windows API:<br />
switch (msg)<br />
case WM_COMMAND :<br />
switch ( LOWORD(wParam) ) {<br />
case ( MI_ITEM1 ) :<br />
//Dynamically create submenu<br />
PopupMenu = CreateMenu(...);<br />
AppendMenu(PopupMenu, &quot;Label 11&quot;, ..., CMD_ITEM11);<br />
...</p>
<p>// show submenu:<br />
TrackPopupMenuEx(PopupMenu, TPM_LEFTALIGN |<br />
TPM_LEFTBUTTON, actualpos.x, actualpos.y, hWnd, NULL);</p>
<p>return TRUE;</p>
<p>switch (CMD_ITEM11) : ActionItem11();</p>
<p>// Using MFC:</p>
<p>CWhatEver::OnSubmenu1Click ( CWnd *pWnd, CPoint actualpos)<br />
{<br />
...<br />
//Dynamically create submenu<br />
PopupMenu = CreateMenu(...);<br />
AppendMenu(PopupMenu, &quot;Label 11&quot;, ..., CMD_ITEM11);<br />
...</p>
<p>// show submenu:<br />
TrackPopupMenuEx(PopupMenu, TPM_LEFTALIGN |<br />
TPM_LEFTBUTTON, actualpos.x, actualpos.y, hWnd, NULL);</p>
<p>...<br />
}</p>
<p>CWhatEver::OnItem11Click ( CWnd *pWnd, CPoint actualpos)<br />
//means, when You click CMD_ITEM1<br />
{<br />
...<br />
ActionItem11();<br />
...<br />
}</p>
</blockquote>
<p>nur leider versteh ich überhaupt nicht, was ich da wie einbauen soll. hoffe einer von euch versteht den code und kann mir das erklären</p>
]]></description><link>https://www.c-plusplus.net/forum/post/583532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/583532</guid><dc:creator><![CDATA[Tie]]></dc:creator><pubDate>Mon, 16 Aug 2004 08:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Mon, 16 Aug 2004 16:13:50 GMT]]></title><description><![CDATA[<p>Schon in die FAQ geschaut ? <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>
<p>Devil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/583893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/583893</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Mon, 16 Aug 2004 16:13:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage wg. dynamischem Menü on Mon, 16 Aug 2004 18:13:58 GMT]]></title><description><![CDATA[<p>nich nur darein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> bloß bin nicht fündig geworden<br />
hab es jetzt auch hingekriegt, meinen code aber komplett umgebaut<br />
kann es ja morgen mal posten, wenn ich auf arbeit bin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/584015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/584015</guid><dc:creator><![CDATA[Tie]]></dc:creator><pubDate>Mon, 16 Aug 2004 18:13:58 GMT</pubDate></item></channel></rss>