Zum Inhalt springen

CGridCtrlDemo und Richeditgrid


kaldemor

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...