2015-11-02 205 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"); 
    } 
}