wxStyledTextCtrl 代码完成

wxStyledTextCtrl Code Completion

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

我已经检查了 Scintilla 和 wxWidgets 的网站,但没有找到。我想知道是否有人可以帮助提供代码片段。

不幸的是,我发现原始的 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");
    }
}