none
Dialog mit CMFCMenuButton verschwindet nach Anzeige des Menüs RRS feed

  • Frage

  • Hi,

    ich habe CMFCMenuButton schon mehrfach verwendet,
    nur der aktuelle Dialog weigert sich.
    Wenn ich den Menü-Button anklicke sehe ich kurz das
    Menü erscheinen und dann beendet sich auch
    schon der Dialog und das gesamte Programm.

    Ein Breakpunkt in
    int CWnd::RunModalLoop(DWORD Flags)
    {
    ...
       // phase 2: pump messages while available
       do
       {
           if (!AfxPumpMessage())
           {
               AfxPostQuitMessage(0); <--- Hier kommt das Programm hin
               return -1;
           }
           ...

    erklärt zwar, warum das Programm sich beendet - aber nicht
    wieso jemand denkt, dass ein WM_QUIT gesendet wurde.

    Ach ja, eine (kleine) Lösung habe ich selber gefunden:
    m_bOSMenu=FALSE;
    wieder auskommentiert bringt Abhilfe.
    Aber ich hätte schon gerne das CMFCMenuPopup mit passenden
    Toolbargrafiken etc.

    Was mag da schief laufen?

    Tschüß, Holger.

    Montag, 27. September 2010 09:57

Alle Antworten

  • Den Dialog evtl. nicht von CDialogEx abgeleitet?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 27. September 2010 10:10
    Moderator
  • Hi,

    "Martin Richter [MVP]" schrieb im Newsbeitrag news:f73bac77-7af8-4609-9e92-26cbba640796@communitybridge.codeplex.com...

    Den Dialog evtl. nicht von CDialogEx abgeleitet?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    (leider) ja - das hatte ich schon von früher gelernt.
    Ich hatte auch gerade mal getestet, ob statt
    CMyDialog Dialog;
    ein CMyDialog Dialog(pView);
    Verbesserung bringt - leider nicht. Gleiches Verhalten.

    Tschüß, Holger.

    Montag, 27. September 2010 11:29
  • Schau Dir doch mal Dein Encoding für Deinen Newsreader an!
    Irgendwie stimmt da was nicht. Die Bridge zaubert irgendwelche Sonderzeichen in Deine Betreffs, wenn Umlaute drin sind.

    Siehe HTML Ansicht
    http://social.msdn.microsoft.com/Forums/de-DE/visualcplusde/thread/f6d3ca76-cf24-4e2b-aa97-d42cd84fc046


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 27. September 2010 12:23
    Moderator
  • Das ist vermutlich noch ein Bug in der Bridge... ich wollte schon lange "Quoated Printable" implementieren... es gibt aber wohl keine freie Implementierung dazu.. und selber machen ist doch etwas aufwendig...


    Jochen Kalmbach (MVP VC++)
    Montag, 27. September 2010 12:30
  • Was brauchst Du Decode/Encode?
    C# oder C++?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 27. September 2010 13:09
    Moderator
  • Was brauchst Du Decode/Encode?
    C# oder C++?

    Decode in C#. Und für einen Header nicht für den Body!
    Im Header (z.B. Subject oder From) ist das Encoding im Text mit drin...
    Das hab ich bisher nicht gefunden...


    Jochen Kalmbach (MVP VC++)
    Montag, 27. September 2010 13:28
  • und würde der C++ Code weiterhelfen? 

    int CMimeTextConverter::QPDecode(CString& strText, 
    								 LPCTSTR pstrIsoCharset,
    								 bool bUtf8ToAnsi)
    {
    	_SUTF8Char Char;
    	CString strTemp;
    	int iCount = 0, iFound = 0;
    	bool bUtf8 = pstrIsoCharset && 
    		(!_tcsicmp(pstrIsoCharset, "utf-8") || 
    		CTextHelperLib::FindInStrNoCase(pstrIsoCharset, "utf-8") >= 0);
    	UINT uiByteCount = bUtf8 ? 4 : 2;
    	while ((iFound = strText.Find('=', iFound)) >= 0)
    	{
    #ifdef _DEBUG
    		CString strTest = strText.Mid(iFound);
    //		TRACE("%s\n", strTest.Left(400));
    #endif
    		int iTest = CTextHelperLib::ChFromHex(strText.Mid(iFound + 1, 2));
    		if (iTest > 0)
    		{
    			if (iTest >= 0x80 && uiByteCount == 4 &&
    				// Bedingung für absturzlose Operation
    				strText.GetLength() > (iFound + 4) &&
    				// das erste Zeichen des Unicodes muss c2 oder c3 sein
    				(iTest == 0xc2 || iTest == 0xc3))
    			{
    				strTemp.Format("%x", iTest);
    				Char.strHex += strTemp;
    				Char.byte2 = iTest;
    				ASSERT(strText.GetAt(iFound + 3) == '=');
    				Char.byte1 = CTextHelperLib::ChFromHex(strText.Mid(iFound + 4, 2));
    				strTemp.Format("%x", Char.byte1);
    				Char.strHex += strTemp;
    				_SUTF8Char::GetUTF8Sign(strTemp, Char.strHex);
    				strText.Delete(iFound, 6); // =3D (3x2 Zeichen löschen)
    				strText.Insert(iFound, strTemp); // Ersetzung einfügen
    				// und löschen
    				Char.Clear();
    			}
    			else
    			{
    				strTemp.Format("%c", iTest);
    				strText.Delete(iFound, 3); // =3D (3 Zeichen löschen)
    				strText.Insert(iFound, strTemp); // Ersetzung einfügen
    			}
    			// Ersetzungen zählen
    			iCount++;
    		}
    		else
    		{
    			// wenn space hinter = steht, einfach das = entfernen
    			int ix = iFound + 1;
    			while (ix < strText.GetLength() && _istspace(strText.GetAt(ix)))
    				ix++;
    			if (ix > iFound + 1)
    			{
    				strText.Delete(iFound, ix - iFound);
    #ifdef _DEBUG
    				strTest = strText.Mid(iFound);
    //				TRACE("TestText: %s\n", strTest.Left(400));
    #endif
    				// hier wurde kein '=' eingefügt, also eins zurück, weil unten vorgezählt wird
    				iFound--;
    			}
    		}
    		// unbedingt weitergehen, denn es könnte ein '=' eingefügt worden sein
    		iFound++;
    	}
    	// Unterstriche in Leerzeichen wandeln
    	iCount += strText.Replace('_', ' ');
    
    	// wenn QPDecode die =-Zeichen gewandelt hat, dann nun die restlichen
    	if (bUtf8 && bUtf8ToAnsi)
    		Utf82Ansi(strText, strText);
    
    	return iCount;
    }
    
    
    	// Stuktur für die Ermittlung des Einzelzeichens
    	struct _SUTF8Char
    	{
    		union
    		{
    			DWORD dwChar;
    			struct 
    			{
    				BYTE byte1;
    				BYTE byte2;
    			};
    		};
    		_SUTF8Char() : dwChar(0)
    		{ }
    		void Clear()
    		{ dwChar = 0; strHex.Empty(); }
    		static int GetUFT8SignIndex(LPCTSTR pstrUTF8Hex);
    		static bool GetUTF8Sign(CString& strSign, LPCTSTR pstrUTF8Hex);
    		static bool GetUTF8HtmlEncoded(CString& strHtmlEncoded, LPCTSTR pstrUTF8Hex);
    
    		CString strHex;
    	};
    
    
    int CTextHelperLib::ChFromHex(LPCTSTR lpch, int iMaxLen)
    {
    	ASSERT(lpch != NULL);
    	if (!lpch)
    		return 0;
    
    	if (iMaxLen <= 0)
    		iMaxLen = 8; // max. Länge (int-Begrenzung!)
    	ASSERT(iMaxLen > 0 && iMaxLen <= 8);
    
    	int iValue = 0;
    	TCHAR ch;
    	for (int ix = 0; ix < iMaxLen && lpch[ix]; ix++) 
    	{
    		ch = lpch[ix];
    		if (ch >= 'A' && ch <= 'F')
    			iValue = (iValue * 16) + (ch - ('A' - 10));
    		// auf Kleinbuchstaben sollen gültig sein
    		else if (ch >= 'a' && ch <= 'f')
    			iValue = (iValue * 16) + (ch - ('a' - 10));
    		else if (ch >= '0' && ch <= '9')
    			iValue = (iValue * 16) + (ch - '0');
    		else
    			break;
    	}
    	return iValue; 
    }
    
    

    so und nun noch die Headerfunktion:

    BOOL CMimeTextConverter::MimeDecodeMailHeaderField(CString& strText,
    												  BOOL bUnescape)
    {
    	// vor der Wandlung Unescape durchführen, wenn angegeben
    	if (bUnescape)
    		CTextHelperLib::Unescape(strText);
    
    	// Bsp.:
    /*
    Subject: =?UTF-8?Q?Hochwasser_steigt_-_Rauch_=C3=BCbe?= =?UTF-8?Q?r_Moskau_-_Kritik_an_Fu=C3=9Ffessel?=
    (zwischen ?= =? sollte auch das Leerzeichen ausgelassen werden
    */
    	// wird kein Anfang gefunden, nix wie wech
    	int iPosBegin = strText.Find("=?");
    	if (iPosBegin < 0)
    		return FALSE;
    
    	CString strIso, strEncoded;
    	int iPosEnc;
    	while (iPosBegin >= 0)
    	{
    		// wird ein Ende gefunden
    		int iEndPos = strText.Find("?=", iPosBegin);
    		if (iEndPos > 1 && 
    			(strText.GetAt(iEndPos - 1) == 'Q' || strText.GetAt(iEndPos - 1) == 'q') &&
    			strText.GetAt(iEndPos - 2) == '?')
    		{
    			// nächstes Ende suchen
    			iEndPos = strText.Find("?=", iEndPos + 2);
    		}
    		// jetzt den zu decodierenden Text von Text nach Iso verschieben
    		if (iEndPos > iPosBegin && iEndPos < strText.GetLength())
    		{
    			strIso = strText.Mid(iPosBegin + 2, iEndPos - iPosBegin - 2);
    			strText.Delete(iPosBegin, iEndPos - iPosBegin + 2);
    		}
    		else
    		{
    			strIso = strText.Mid(iPosBegin + 2);
    			strText = strText.Left(iPosBegin);
    		}
    		
    		// wenn qp (wir haben bereits nach ?Q? gesucht)
    		if ((iPosEnc = CTextHelperLib::FindInStrNoCase(strIso, "?Q?")) >= 0)
    		{
    			//it's quoted printable
    			//find the right "starting point" in the string...
    			strEncoded = strIso.Mid(iPosEnc + 3);
    			strIso = strIso.Left(iPosEnc);
    			TRACE("ISO-Codierung: %s\n", strIso.Left(400));
    			QPDecode(strEncoded, strIso);
    			strText.Insert(iPosBegin, strEncoded);
    		}
    		// nach ?B? haben wir noch nicht gesucht
    		else if ((iPosEnc = CTextHelperLib::FindInStrNoCase(strIso, "?B?")) >= 0)
    		{
    			//it's base64
    			//find the right "starting point" in the string...
    			strEncoded = strIso.Mid(iPosEnc + 3);
    			strIso = strIso.Left(iPosEnc);
    			TRACE("ISO-Codierung: %s\n", strIso.Left(400));
    			FromBase64(strEncoded, strEncoded);
    			QPDecode(strEncoded, strIso, true);
    			strText.Insert(iPosBegin, strEncoded);
    		}
    		// nächster Str
    		iPosBegin = strText.Find("=?", iPosBegin + strEncoded.GetLength());
    		// zurücksetzen
    		strEncoded.Empty();
    	}
    	return TRUE;
    }
    

    Das läßt sich doch nach C# portieren, oder?

    Hast Du das Forum geschrieben? Das ist genial! 

    Gruß

    Jens

    • Bearbeitet JensMobWin Mittwoch, 29. September 2010 11:12 der Vollständigkeit halber
    Dienstag, 28. September 2010 22:48
  • Dieser Code kann nur utf-8, oder?
    Ich brauche es eigentlich primär für andere Encodings...

    Wenn ich mal wieder Zeit habe, werde ich es machen...


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 29. September 2010 11:15
  • Freitag, 1. Oktober 2010 09:12
    Moderator
  • Hallo Robert,

    das sind leider alles nur Encoder... ich suche aber einen Decoder ;)


    Jochen Kalmbach (MVP VC++)
    Freitag, 1. Oktober 2010 09:17