type editstream



  • Hallo ihr,

    ich habe einen Rich Edit Text in meinem Dialog. Dort möchte ich versuchen den Text formatiert auszugeben:

    [code]
    CHARFORMAT Cfm;
    
    //Formatierung d. Textes
    m_ctlausgabe.GetSelectionCharFormat(Cfm);        //CRrichEditCtrl m_ctlausgabe
    Cfm.cbSize = sizeof(CHARFORMAT);
    Cfm.dwMask = CFM_BOLD;
    Cfm.dwEffects = CFE_ITALIC, CFE_UNDERLINE;
    
    m_ctlausgabe.SetSelectionCharFormat(Cfm);
    m_ctlausgabe.SetFocus();
    
    EDITSTREAM test;        //dieser Variablen will ich den string oder den Cstring zuweisen
    
    CString s = "ich bin ein Cstring!";
    
    m_ctlausgabe.StreamIn(SF_RTF, test);
    
    [/code]
    

    mein Problem ist, dass die Funktion CRichEditCtrl.StreamIn() als zweiten Parameter ein EDITSTREAM& erwartet. Jetzt habe ich eine Variable von diesem Typ erstellt und möchte gern einen CString in editstream konvertieren(damit ich es der Funktion übergeben kann).

    Klar, ich hab mir mal den typ editstream schon in MSDN angeschaut und versucht so auf eine Lösung zu kommen. Aber das ist so der erste typ der mir totale schwierigkeiten macht. Ich verstehe da nur 😕
    Meine Kollegen hier können(wollen) mir nicht wirklich helfen. Deshalb wäre ich froh, wenn einer von euch mir helfen könnte 😃

    Danke + Gruß Kitty



  • Hallo,

    Du benötigst eine CALLBACK Funktion für das streamen.
    Diese kann entweder statisch in der cpp datei sein oder eine statische
    Memberfunktion deiner klasse.

    static DWORD CALLBACK StreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
    	CString* pString = (CString*)dwCookie;
    
    	*pcb = min(pString->GetLength(), cb);
    
    	::lstrcpyn((LPTSTR)pbBuff, *pString, cb);
    
    	*pString = pString->Mid(*pcb);
    
    	return 0;
    }
    
    	// irgendwo im Quelltext
    	EDITSTREAM es;
    	CString text(_T("Hallo Welt!"));
    
    	es.dwCookie = (DWORD)&text;
    	es.pfnCallback = StreamInCallback;
    
    	m_wndRichEdit.StreamIn(SF_TEXT, es);
    

    Die Callback Funktion wird so oft aufgerufen, bis der String keine Zeichen mehr
    enthält. In diesem Beispiel also zweimal.

    Gruss
    Frank



  • Hallo Leute,

    also ich hab's nochmal versucht einen Text im RichEditFeld auszugeben. Wieder hab ich irgendwo einen Fehler und bekomme es einfach nicht hin!! Das ist total ärgerlich, daher hoffe ich, ihr könnt mir helfen!

    Also hier erstmal mein Code:

    static DWORD CALLBACK StreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) 
    { 
        CString* pString = (CString*)dwCookie; 
    
        *pcb = min(pString->GetLength(), cb); 
    
        ::lstrcpyn((LPTSTR)pbBuff, *pString, cb); 
    
        *pString = pString->Mid(*pcb); 
    
        return 0;
    }
    
    //...
    
    void DisplayUnknownBit::formateText()
    {
    	EDITSTREAM file;
             CString text ="Blubb";
    
             file.dwCookie = (DWORD)&text; 
    	file.pfnCallback = StreamInCallback; 
    	file.dwError = 0;
    	m_RichEditText.StreamIn(SF_TEXT, file);
             //...
    }
    

    Seht ihr irgendwo einen Fehler? Könnt ihr mir da weiterhelfen?

    Wäre echt dankbar dafür,

    Gruß Kitty


Anmelden zum Antworten