2015-11-02 206 views
0

我正在为Lua设计一个简单的编辑器,用于使用wxWidgets在C++中编写的软件中。我一直在寻找一个简单的例子,在C++中使用wxStyledTextCtrl来实现代码完成wxStyledTextCtrl代码完成

我检查了Scintilla和wxWidgets的网站,但找不到任何。我想知道是否有人可以帮助一个代码片段。

回答

0

不幸的是,我发现最初的Scintilla文档留下了很多不足,而wxStyledTextCtrl文档几乎是逐字逐句地拷贝了Scintilla文档。

我最近从ScintillaNET项目中发现了这篇wiki文章,它对开始使用自动完成功能非常有帮助。这个过程对于任何Scintilla实现都是一样的。我实际上使用它与IupScintilla

https://github.com/jacobslusser/ScintillaNET/wiki/Basic-Autocompletion

private void scintilla_CharAdded(object sender, CharAddedEventArgs e) 
{ 
    // Find the word start 
    var currentPos = scintilla.CurrentPosition; 
    var wordStartPos = scintilla.WordStartPosition(currentPos, true); 

    // Display the autocompletion list 
    var lenEntered = currentPos - wordStartPos; 
    if (lenEntered > 0) 
    { 
     scintilla.AutoCShow(lenEntered, "abstract as base break case catch checked continue default delegate do else event explicit extern false finally fixed for foreach goto if implicit in interface internal is lock namespace new null object operator out override params private protected public readonly ref return sealed sizeof stackalloc switch this throw true try typeof unchecked unsafe using virtual while"); 
    } 
} 

下面是一个简单的wxWidgets应用程序,做同样的事情:

#include <wx/wx.h> 
#include <wx/stc/stc.h> 

class wxTestProject : public wxApp 
{ 
public: 
    bool OnInit(); 
    void OnChange(wxStyledTextEvent& event); 
}; 

wxIMPLEMENT_APP(wxTestProject); 

bool wxTestProject::OnInit() 
{ 
    wxFrame* frame = new wxFrame(NULL, wxID_ANY, "wxTestProject", 
     wxDefaultPosition, wxSize(640,480)); 

    wxStyledTextCtrl* stc = new wxStyledTextCtrl(frame, wxID_ANY, 
     wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); 
    stc->SetLexerLanguage("lua"); 
    stc->Bind(wxEVT_STC_CHANGE, &wxTestProject::OnChange, this); 

    this->SetTopWindow(frame); 
    frame->Show(); 

    return true; 
} 

void wxTestProject::OnChange(wxStyledTextEvent& event) 
{ 
    wxStyledTextCtrl* stc = (wxStyledTextCtrl*)event.GetEventObject(); 

    // Find the word start 
    int currentPos = stc->GetCurrentPos(); 
    int wordStartPos = stc->WordStartPosition(currentPos, true); 

    // Display the autocompletion list 
    int lenEntered = currentPos - wordStartPos; 
    if (lenEntered > 0) 
    { 
     stc->AutoCompShow(lenEntered, "and break do else elseif end false for function if in local nil not or repeat return then true until while"); 
    } 
}