Fragensteller
Dialog mit CMFCMenuButton verschwindet nach Anzeige des Menüs

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.
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 30. September 2010 15:55 Titel Korrektur
Alle Antworten
-
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.
-
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 -
-
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
-
Hallo Jochen,
Schau Dir mal folgenden Links an. Vielleicht können sie Dir weiter helfen in dem „Quoted Printable“ Problem.
https://forgesvn1.novell.com/svn/mojoportal/branches/2.1.8/DotNetOpenMail/Encoding/QPEncoder.cs
Grüße,
Robert