0
我正在为Lua设计一个简单的编辑器,用于使用wxWidgets在C++中编写的软件中。我一直在寻找一个简单的例子,在C++中使用wxStyledTextCtrl
来实现代码完成。wxStyledTextCtrl代码完成
我检查了Scintilla和wxWidgets的网站,但找不到任何。我想知道是否有人可以帮助一个代码片段。
我正在为Lua设计一个简单的编辑器,用于使用wxWidgets在C++中编写的软件中。我一直在寻找一个简单的例子,在C++中使用wxStyledTextCtrl
来实现代码完成。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");
}
}