Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

CGridCtrlDemo und Richeditgrid

Empfohlene Antworten

Veröffentlicht

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

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.

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

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.