kaldemor Geschrieben 26. Februar 2008 Geschrieben 26. Februar 2008 Frage zu meinem aller ersten Problem: Wenn ich die Schriftgröße vom Text ändere und AutoSizeRow() aufrufe, wird die Zellenhöhe fasch ermittelt. Ist auch logisch, da die Funktion GetText() einen Richtext zurück gibt. Hab versucht den Richtext in nur Text (SF_TEXT) umzuwandeln, hab aber wegen pCell->EndEdit() keinen Bezug auf Richeditfeld mehr. Was muß ich vorher beachten? Gibt es andere Möglichkeit den Richtext umzuwandeln? CSize CGridCellBase::GetCellExtent(CDC* pDC). { CSize size; CString str, Text; Text = GetText(); if (Text.Left (6)=="{\\rtf1") { CInPlaceRichEdit* prich = NULL; prich->GetRichText(); size = GetTextExtent(Text, pDC); } else size = GetTextExtent(GetText(), pDC); } void CGridCellRich::GetRichText(CString& str) { EDITSTREAM es; COOKIE cookie; es.dwCookie = (DWORD)&cookie; es.pfnCallback = GetEditStreamCallback; m_pRichEditTemp->StreamOut(SF_TEXT, es); str = cookie.strText; } // Beispiel um Schriftgröße zu ändern CGridCellRich* pCell=(CGridCellRich*) m_Grid.GetCell (m_Grid.GetFocusCell().row, m_Grid.GetFocusCell().col); CString strFontSize; int iIndex = 0; iIndex = m_CBGroesse.GetCurSel(); if( iIndex != CB_ERR ) m_CBGroesse.GetLBText(iIndex, strFontSize); if (pCell) { pCell->SetFontSize( atoi(strFontSize) ); pCell->EndEdit(); m_Grid.AutoSizeRow(row); m_Grid.Invalidate(); } Mfg, kaldemor Zitieren
Klotzkopp Geschrieben 26. Februar 2008 Geschrieben 26. Februar 2008 Ich würde das gar nicht umwandeln. Was bringt dir die Information, wie groß der unformatierte Text ist? Der echte Text kann, abhängig von der eingestellten Schriftart und -größe, ganz andere Dimensionen haben. Du kannst CRichEditCtrl::FormatRange benutzen, um die tatsächlichen Maße zu ermitteln. Zitieren
kaldemor Geschrieben 26. Februar 2008 Autor Geschrieben 26. Februar 2008 FormatRange wird bereits in CGridCellRich::Draw() eingesetzt. Oder soll ich die GetText() überschreiben? Jetzt habe ich ein größeres Problem: Text eine Zelle mit m_Grid.SetItemText(1,1, _T(„TEXT“)) einfügen/überschreiben. Jetzt möchte ich den RichTextfeld aus meiner Datenbank auslesen und diesen in eine bestimmte Zelle einfügen. Wenn man jetzt den Richtext nicht in normales Text umwandeln darf, da ja die Formatierung verloren geht, wie soll man da sonst vorgehen? Mfg, kaldemor Zitieren
Klotzkopp Geschrieben 27. Februar 2008 Geschrieben 27. Februar 2008 FormatRange wird bereits in CGridCellRich::Draw() eingesetzt.Ja und? Darfst du jede Funktion nur einmal pro Programm benutzen? Oder soll ich die GetText() überschreiben?Ich würde vermutlich GetTextExtent überschreiben. Jetzt habe ich ein größeres Problem: Text eine Zelle mit m_Grid.SetItemText(1,1, _T(„TEXT“)) einfügen/überschreiben. Jetzt möchte ich den RichTextfeld aus meiner Datenbank auslesen und diesen in eine bestimmte Zelle einfügen. Wenn man jetzt den Richtext nicht in normales Text umwandeln darf, da ja die Formatierung verloren geht, wie soll man da sonst vorgehen?CRichEditCtrl::StreamIn. Zitieren
kaldemor Geschrieben 28. Februar 2008 Autor Geschrieben 28. Februar 2008 Zitat: GetTextExtent überschreiben Ist es der richtige Ansatz mit m_pRichEditTemp->FormatRange(&fr, TRUE); m_pRichEditTemp->GetClientRect (&Rect); oder bin ich auf dem Holzweg? Zitat: CRichEditCtrl::StreamIn Daran hab ich es auch gedacht. Nun die Lösung (etwas umständlich): CGridCellRich* pCell=(CGridCellRich*) m_Grid.GetCell(1, 1); if (pCell) pCell->SetRichText(Text); m_Grid.SetItemText(1,1, Text); void CGridCellRich::SetRichText(CString str) { EDITSTREAM es; es.dwCookie = (DWORD)&str; es.pfnCallback = MyStreamInCallback; m_pRichEditTemp->StreamIn(SF_RTF, es); } // Funktion MyStreamInCallback hab ich von CodeProject. Free source code and programming help DWORD CALLBACK CGridCellRich::MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { CString* str = ( ( CString* ) dwCookie ); #ifdef _UNICODE // Unicode is only supported for SF_TEXT, so we need // to convert LPCTSTR ptr = str->GetBuffer( (*str).GetLength() ); int length = ::WideCharToMultiByte( CP_UTF8, 0, ptr, -1, NULL, 0, NULL, NULL ); int max = min( cb, length ); if( length ) { char* buff = new char[ length ]; ::WideCharToMultiByte( CP_UTF8, 0, ptr, -1, buff, length + 1, NULL, NULL ); strncpy( (LPSTR) pbBuff, buff, max ); delete[] buff; } str->ReleaseBuffer(); #else int max = min( cb, (*str).GetLength() ); strncpy( ( LPSTR ) pbBuff, (*str) , max ); #endif (*str) = (*str).Right( (*str).GetLength() - max ); *pcb = max; return 0; } Mfg, Kaldemor Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.