CRichEditCtrl teilweise nicht editierbar?
-
Hi 2gether,
gibr es eine Möglichkeit, in einem CRichEditCtrl Textbereiche nicht editierbar zu machen?
Habe folgenden Code:
CHARFORMAT charformat; m_ctrlEdit2.SetSel(2, 8); m_ctrlEdit2.GetSelectionCharFormat(charformat); charformat.crTextColor = RGB( 128, 128, 128 ); charformat.dwMask |= CFM_COLOR; charformat.dwEffects &= ~CFE_AUTOCOLOR; m_ctrlEdit2.SetSelectionCharFormat(charformat);ist nur zum testen

Das einfärben der Textbereichs funktioniert auch. Damit soll ein gesperrter Bereich dargestellt werden.
Wie muss nun dieser Code erweitert werden, um eine Änderung zu unterbinden?Habs schon mit CFM_PROTECTED / CFE_PROTECTED versucht, kriegs aber irgendwie nicht gebacken

Hilfe

grüssle

Edit: Seit ich die CEdits durch CRichEditCtrl ausgewechselt habe, werden sie nicht mehr 'eingefärbt' Bei den CEdits passierte dies bei EN_SETFOCUS mit WM_CTLCOLOR. Hab ich da irgendwas übersehen?
-
Sodele, für alle die es interessiert: Die Lösung

- Für das CRichEditCtrl im Klassenassi die EN_PROTECTED erstellen
void CFileReaderView::OnProtectedEdit1(NMHDR* pNMHDR, LRESULT* pResult) { ENPROTECTED *pEnProtected = reinterpret_cast<ENPROTECTED *>(pNMHDR); // TODO: Das Steuerelement sendet diese Benachrichtigung nur, wenn die Funktion // CFormView::OnInitDialog() überschrieben wird, um die EM_SETEVENTMASK-Nachricht // an das Steuerelement mit dem ENM_PROTECTED-Attribut ORed in die Maske lParam zu senden. // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen *pResult = 0; // ändern zu: *pResult = TRUE; }pResult muss je nach Bedarf umgeschaltet werden. Nach einer Änderung( oder auch nur versuchten Änderung
) des Textes muss pResult FALSE zurückgeben, sonst kann kein neuer Text gesetzt werden!- Im OnInit*** dann folgendes:
m_ctrlEdit1.SetEventMask( m_ctrlEdit1.GetEventMask() | ENM_PROTECTED );- Dann eine Funktion zum setzen der nicht editierbaren Bereiche, z. B.
void CFileReaderView::MarkTagsinRichEdit(CRichEditCtrl *re) { long aPos, ePos; re->GetSel( aPos, ePos ); // wichtig, um die Pos zu behalten! int dlgid = re->GetDlgCtrlID(); CString reText = _T(""); GetDlgItemText( dlgid, reText ); CHARFORMAT cf; int f1 = 0; int f2 = 0; while( f1 > -1 ) { f1 = reText.Find( _T("<ut>"), f1); f2 = reText.Find( _T("</ut>"), f1 ); if( f2 > f1 ) { re->SetSel( f1, f2+5 ); re->GetSelectionCharFormat(cf); cf.crTextColor = RGB( 128, 128, 128 ); cf.dwMask |= CFM_COLOR | CFM_PROTECTED; cf.dwEffects &= ~CFE_AUTOCOLOR; cf.dwEffects |= CFE_PROTECTED; re->SetSelectionCharFormat(cf); f1 = f2; } } re->SetSel( aPos, ePos ); }- Und *MarkTagsinRichEdit(CRichEditCtrl re) wird aus der EN_CHANGE des CRichEditCtrl's aufgerufen.
That's all

grüssle :xmas1: