Scintilla ist eine Open-Source-Bearbeitungskomponente, die nicht nur über die üblichen Bearbeitungsfunktionen verfügt, sondern auch Funktionen wie Syntaxstil, Codefaltung, Tags, automatische Codevervollständigung und Eingabeaufforderungen bereitstellt.
Die Windows-Version von Scintilla ist eine Standard-Windows-Komponente. Benutzer können über die SendMessage-Funktion Nachrichten senden und mit ihr interagieren. Die SendMessage-Funktionsschnittstelle lautet wie folgt:
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
Die GTK+-Version von Scintilla verwendet eine ähnliche Methode wie die Windows-Version für die Nachrichtenübermittlung. Die folgende Einführung konzentriert sich auf die Windows-Version.
Scintilla bietet eine große Anzahl von Nachrichten-APIs. Jede Nachricht kann 0, 1 oder 2 Parameter haben. Die Nachricht in der SendMessage-Funktion verfügt normalerweise über zwei Parameter: wParam und lParam. Daher wird dringend empfohlen, sie auf 0 zu setzen, um die Kompatibilität mit zukünftigen Versionen sicherzustellen. Für die meisten SCI_SETxxxxx-Einstellungsnachrichten gibt es eine entsprechende SCI_GETxxxxx-Abfragenachricht.
Parametertyp
Der Parametertyp in der Nachricht, wie in der folgenden Tabelle gezeigt:
Parametertyp bool 0 bedeutet FALSCH, 1 bedeutet WAHR
Zeichenpufferzeiger, Scintilla füllt ihn mit den abgefragten Zeichendaten. In manchen Fällen wird die Puffergröße durch einen anderen Parameter angegeben; in anderen Fällen müssen Sie sicherstellen, dass der Puffer groß genug ist, um die abgefragten Zeichendaten aufzunehmen. Wenn Sie einen Nullzeiger von 0 übergeben, gibt die Nachricht die abgefragte Zeichendatengröße zurück.
Farbe Farbwert im RGB-Format. Jede Farbe hat einen Wert von 0 - 255. Rot, Grün und Blau werden wie folgt kombiniert, um den Farbwert zu erhalten: Farbe = Rot | (Grün << 8) |. 0x000000, schwarz; 0x00ff0, grün; 0xffffff, weiß;
alpha Der Alphakanalwert stellt die Transluzenz der Farbe dar. Der Wertebereich ist: 0 (völlig transparent, SC_ALPHA_TRANSPARENT) - 255 (undurchsichtig, SC_ALPHA_OPAQUE). Ein Wert von 256 (C_ALPHA_NOALPHA) bedeutet, dass der Alphakanal nicht verwendet wird. Nicht alle Plattformen unterstützen Alphakanäle und nur einige Nachrichten implementieren Alphaeffekte. Der Standard-Alpha-Wert der Nachricht beträgt 256 und es wird kein Alpha-Kanal verwendet.
<<> & lt; unbenutzte & gt; Es wird dringend empfohlen, ihn auf 0 zu setzen, um die Kompatibilität mit dem Datentyp
Zeichenbereichsdatenstruktur, die mit der WIN32-Datenstruktur CHARRANGE identisch ist.
TextRange
Textbereichsdatenstruktur, die hauptsächlich zum Abrufen eines bestimmten Textbereichs aus der Scintilla-Komponente verwendet wird, genau wie die WIN32-Datenstruktur TEXTRANGE.
struct CharacterRange { long cpMin; long cpMax; };
SCNotification
Datenstruktur der Ereignisbenachrichtigung. In Windows sendet Scintilla eine WM_NOTIFY-Nachricht an sein übergeordnetes Fenster; in GTK+ sendet Scintilla ein Benachrichtigungssignal an sein übergeordnetes Fenster.
struct TextRange { struct CharacterRange chrg; char *lpstrText; };
Integration mit MFC
对于MFC应用程序向导创建的多文档程序,只需添加很少的代码,就可以将Scintilla控件嵌入到View中。假设工程名为EasyEdit,则相关的类分别为CEasyEditApp、CEasyEditDoc、CEasyEditView、CChildFrame。
首先,在CEasyEditApp中添加私有成员变量HMODULE m_hmodule和虚函数int ExitInstance(),并增加加载DLL代码和释放DLL代码:
BOOL CEasyEditApp::InitInstance() { m_hmodule = LoadLibrary(_T("SciLexer.dll")); if (NULL == m_hmodule) { ::MessageBox(NULL, _T("The Scintilla DLL could not be loaded."), _T("Error loading Scintilla"), MB_OK | MB_ICONERROR); } … return TRUE; }; int CEasyEditApp::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 if (m_hmodule) { FreeLibrary(m_hmodule); } return CWinApp::ExitInstance(); }
然后,在CEasyEditView中,增加WM_PAINT消息处理函数void OnPaint(),并在BOOL PreCreateWindow(CREATESTRUCT& cs)和void OnPaint()函数中增加代码:
BOOL CEasyEditView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 cs.lpszClass = _T("Scintilla"); return CView::PreCreateWindow(cs); } void CEasyEditView::OnPaint() { // CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用CView::OnPaint() Default(); }
这样,Scintilla控件就已经集成到View中了。
为了处理Scintilla控件发送的事件通知,在CChildFrame中,增加WM_NOTIFY消息处理函数BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult):
BOOL CChildFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // TODO: 在此添加专用代码和/或调用基类 SCNotification *pSCNotification = (SCNotification*)lParam; CEasyEditView *pView = (CEasyEditView*)GetActiveView(); switch (pSCNotification->nmhdr.code) { … } return CMDIChildWnd::OnNotify(wParam, lParam, pResult); }
以上就是Scintilla,简介的内容,更多相关内容请关注PHP中文网(www.php.cn)!