richedit - syntaxhighlighting



  • hi,

    ich wollte mir einen kleinen "syntax-highlighter" für php basteln. nur hab ich keine ahnung wie. wenn zum beispiel "if" geschrieben wird, dann soll dieses mit meinem CHARFORMAT cFormat formatiert werden.
    ich hab mir überlegt, im textfeld diesen string kurzzeitig zu markieren und dann zu formatieren, aber ich weiß zum einen nicht, wie ich diesen string sozusagen ausfindig machen kann und zum anderen denk ich, dass es eine bessere methode gibt, dass zu machen.



  • google findet etwas
    http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=syntax+highlighting+richedit+box&spell=1
    der zweite betrag sieht sehr interessant aus



  • ui, sowas hab ich gesucht. nur muss ich mir das mal genauer anschauen, weil ich es nicht benutzen, sondern selbst machen will.

    noch eine frage: die funktion Colorize verlangt eine variable vom typ "CRichEditCtrl". Wie kommt man denn an so etwas?



  • die klasse vom zweiten link ist eigentlich für mfc gedacht.
    also ein paar änderungen musst schon vornehmen.
    aber statt "CRichEditCtrl" zu übergeben kannst du es auch so umschreiben das du dein fensterhandle (richeditctrl) übergibst.



  • hi,

    ich hab schon öfters dieses GetRichEditCtrl() gesehen, doch bei mir gibt es diese funktion nicht, was muss ich da denn includen?



  • Herr-Vorragend schrieb:

    hi,

    ich hab schon öfters dieses GetRichEditCtrl() gesehen, doch bei mir gibt es diese funktion nicht, was muss ich da denn includen?

    nix wenn du kein mfc benutzen willst.



  • aso, sollte ich denn besser mfc benutzen?



  • Herr-Vorragend schrieb:

    aso, sollte ich denn besser mfc benutzen?

    ist deine sache 😉 besser finde ich es nicht 😃

    codebeispiel

    // pointer auf Richeditctrl ändern in entsprechende Winapi Message
    
    //void CSyntaxColorizer::Colorize(CHARRANGE cr, CRichEditCtrl *pCtrl)
    void CSyntaxColorizer::Colorize(CHARRANGE cr, HWND hwndRichEdit)
    {
    	long nTextLength = 0;
    
    	if(cr.cpMin == 0 && cr.cpMax == -1) //send entire text of rich edit box
    	{
    		//set up the buffer to hold the text from the rich edit box
    		nTextLength = pCtrl->GetTextLength();
    
    //		pCtrl->SetSel(0,-1);
                      SendMessage(hwndRichEdit, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
    
    	}
    	else
    	{
    		//set up the buffer to hold the text
    		nTextLength = cr.cpMax - cr.cpMin + 1;//add 1 because zero-based array
    
    		//get the text
    //		pCtrl->SetSel(cr.cpMin,cr.cpMax);
                      SendMessage(hwndRichEdit, EM_SETSEL, (WPARAM)cr.cpMin, (LPARAM)cr.cpMax);
    	}
    
    	LPTSTR lpszBuf = new TCHAR[nTextLength+1];
    //	pCtrl->GetSelText(lpszBuf);
    //	pCtrl->SetSelectionCharFormat(m_cfDefault);
             SendMessage(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)(LPSTR)lpszBuf);
             SendMessage(hwndRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&m_cfDefault);
    
    	colorize(lpszBuf,pCtrl,cr.cpMin);
    
    	delete lpszBuf;
    }
    


  • dankeschön, ich bleib dann auch bei SendMessage() 😉



  • Herr-Vorragend schrieb:

    dankeschön, ich bleib dann auch bei SendMessage() 😉

    mein reden 😉


Anmelden zum Antworten