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:


Anmelden zum Antworten