wxStyledTextCtrl
Introduction
The wxStyledTextCtrl (wxWidgets: wxStyledTextCtrl Class Reference) control is a source code editing component. It is a wrapper around the Scintilla source code editing component (http://www.scintilla.org/).
Basic Creation Example
The wxStyledTextCtrl control is a very powerful control and it takes some learning to take fully advantage of it. We will start with a very basic example that doesn't do much more than a simple wxTextCtrl. The example is based on the MinimalApp2 example we presented in the minimal application tutorial. The full source for this example is available from our GitHub repository: wxWidgetsTutorials/wxStyledTextCtrl/WxStyledTextCtrl1.
#include "WxStyledTextCtrl1Frame.h"
#include <wx/panel.h>
#include <wx/stc/stc.h>
#include <wx/sizer.h>
WxStyledTextCtrl1Frame::WxStyledTextCtrl1Frame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    // Create a top-level panel to hold all the contents of the frame
    wxPanel* panel = new wxPanel(this, wxID_ANY);
    // Create a wxStyledTextCtrl control
    wxStyledTextCtrl* styledTextCtrl = new wxStyledTextCtrl(panel, wxID_ANY,
        wxDefaultPosition, wxSize(350, 200));
    styledTextCtrl->AddText("// A simple program\n\n");
    styledTextCtrl->AddText("#include <stdio.h>\n\n");
    styledTextCtrl->AddText("int main(int argc, char* argv[])\n");
    styledTextCtrl->AddText("{\n");
    styledTextCtrl->AddText("    printf(\"Hello World!\");\n");
    styledTextCtrl->AddText("    return 0;\n");
    styledTextCtrl->AddText("}\n");
    // Set up the sizer for the panel
    wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
    panelSizer->Add(styledTextCtrl, 1, wxEXPAND);
    panel->SetSizer(panelSizer);
    // Set up the sizer for the frame and resize the frame
    // according to its contents
    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->Add(panel, 1, wxEXPAND);
    SetSizerAndFit(topSizer);
}
                    The application is shown in Figure 1 below.
|   | 
The rest of the files don't have any significant changes but are shown here for completeness.
#ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1FRAME_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1FRAME_H_
#include <wx/frame.h>
class WxStyledTextCtrl1Frame : public wxFrame
{
public:
    WxStyledTextCtrl1Frame(const wxString& title);
};
#endif
                    #ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1APP_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL1APP_H_
#include <wx/app.h>
class WxStyledTextCtrl1App : public wxApp
{
public:
    virtual bool OnInit();
};
#endif
                    #include "WxStyledTextCtrl1App.h"
#include "WxStyledTextCtrl1Frame.h"
wxIMPLEMENT_APP(WxStyledTextCtrl1App);
bool WxStyledTextCtrl1App::OnInit()
{
    WxStyledTextCtrl1Frame* frame = new WxStyledTextCtrl1Frame("WxStyledTextCtrl1");
    frame->Show(true);
    return true;
}
                    C++ Lexer Example
The previous example was displaying the code correctly but wasn't applying any specific highlighting that we would expect from a code editor. In this example we show how we can modify the code to recognize that the contents are C++ code and highlight some keywords.The full source for this example is available from our GitHub repository: wxWidgetsTutorials/wxStyledTextCtrl/WxStyledTextCtrl2.
#include "WxStyledTextCtrl2Frame.h"
#include <wx/panel.h>
#include <wx/stc/stc.h>
#include <wx/sizer.h>
WxStyledTextCtrl2Frame::WxStyledTextCtrl2Frame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    // Create a top-level panel to hold all the contents of the frame
    wxPanel* panel = new wxPanel(this, wxID_ANY);
    // Create a wxStyledTextCtrl control
    wxStyledTextCtrl* styledTextCtrl = new wxStyledTextCtrl(panel, wxID_ANY,
        wxDefaultPosition, wxSize(350, 200));
    // Set the lexer to the C++ lexer
    styledTextCtrl->SetLexer(wxSTC_LEX_CPP);
    // Set the color to use for various elements
    styledTextCtrl->StyleSetForeground(wxSTC_C_COMMENTLINE, wxColor(60, 162, 2));
    styledTextCtrl->StyleSetForeground(wxSTC_C_PREPROCESSOR, wxColor(0, 0, 255));
    styledTextCtrl->StyleSetForeground(wxSTC_C_STRING, wxColor(255, 60, 10));
    styledTextCtrl->StyleSetForeground(wxSTC_C_WORD, wxColor(0, 0, 255));
    // Give a list of keywords. They will be given the style specified for
    // wxSTC_C_WORD items.
    styledTextCtrl->SetKeyWords(0, wxT("return int char"));
    // Populate the wxStyledTextCtrl with a small C++ program
    styledTextCtrl->AddText("// A simple program\n\n");
    styledTextCtrl->AddText("#include <stdio.h>\n\n");
    styledTextCtrl->AddText("int main(int argc, char* argv[])\n");
    styledTextCtrl->AddText("{\n");
    styledTextCtrl->AddText("    printf(\"Hello World!\");\n");
    styledTextCtrl->AddText("    return 0;\n");
    styledTextCtrl->AddText("}\n");
    // Set up the sizer for the panel
    wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
    panelSizer->Add(styledTextCtrl, 1, wxEXPAND);
    panel->SetSizer(panelSizer);
    // Set up the sizer for the frame and resize the frame
    // according to its contents
    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->Add(panel, 1, wxEXPAND);
    SetSizerAndFit(topSizer);
}
                    |   | 
#ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2FRAME_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2FRAME_H_
#include <wx/frame.h>
class WxStyledTextCtrl2Frame : public wxFrame
{
public:
    WxStyledTextCtrl2Frame(const wxString& title);
};
#endif
                    #ifndef _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2APP_H_
#define _TUTORIALS_WXWIDGETS_WXSTYLEDTEXTCTRL2APP_H_
#include <wx/app.h>
class WxStyledTextCtrl2App : public wxApp
{
public:
    virtual bool OnInit();
};
#endif
                    #include "WxStyledTextCtrl2App.h"
#include "WxStyledTextCtrl2Frame.h"
wxIMPLEMENT_APP(WxStyledTextCtrl2App);
bool WxStyledTextCtrl2App::OnInit()
{
    WxStyledTextCtrl2Frame* frame =  new WxStyledTextCtrl2Frame("WxStyledTextCtrl2");
    frame->Show(true);
    return true;
}
                    