Scintilla는 일반적인 편집 기능뿐만 아니라 구문 스타일, 코드 접기, 태그, 코드 자동 완성 및 프롬프트와 같은 기능도 제공하는 오픈 소스 편집 구성 요소입니다.
Windows 버전의 Scintilla는 표준 Windows 구성 요소입니다. 사용자는 SendMessage 기능을 통해 메시지를 보내고 상호 작용할 수 있습니다. SendMessage 기능 인터페이스는 다음과 같습니다:
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
GTK+ 버전의 Scintilla는 메시지 전달을 위해 Windows 버전과 유사한 방법을 사용합니다. 다음 소개에서는 Windows 버전에 중점을 둡니다.
Scintilla는 수많은 메시지 API를 제공하며 각 메시지는 0, 1 또는 2개의 매개변수를 가질 수 있습니다. SendMessage 함수의 메시지에는 일반적으로 wParam과 lParam이라는 두 개의 매개변수가 있습니다. 따라서 사용되지 않는 매개변수의 경우 향후 버전과의 호환성을 보장하기 위해 해당 매개변수를 0으로 설정하는 것이 좋습니다. 대부분의 SCI_SETxxxxx 설정 메시지에는 해당하는 SCI_GETxxxxx 쿼리 메시지가 있습니다.
매개변수 유형
다음 표에 표시된 메시지의 매개변수 유형:
매개변수 유형 사용 을 통해 off off ‐ ‐ ‐ off '
bool 0은 거짓을 의미하고 1은 참을 의미합니다
상수 문자열 포인터, 문자열은 0으로 끝나거나 다른 매개변수로 전달될 수 있습니다. 하나의 매개변수는 문자열의 길이를 지정합니다.
char* 문자 버퍼 포인터, Scintilla는 쿼리된 문자 데이터로 그것을 채울 것이다. 버퍼 크기가 다른 매개변수를 통해 지정되는 경우도 있고, 쿼리되는 문자 데이터를 수용할 수 있을 만큼 버퍼가 큰지 확인해야 하는 경우도 있습니다. 널 포인터 0을 전달하면 메시지는 쿼리된 문자 데이터 크기를 반환합니다.
color RGB 형식의 색상 값입니다. 각 색상은 0~255의 값을 갖습니다. 빨간색, 녹색 및 파란색을 다음과 같이 조합하여 색상 값을 얻습니다. 색상 = 빨간색(녹색<<8)(파란색<<16). 0x000000, 검정색; 0x00ff00, 녹색, 0xffffff, 흰색.
alpha 알파 채널 값은 색상의 반투명도를 나타냅니다. 값 범위는 0(완전 투명, SC_ALPHA_TRANSPARENT) - 255(불투명, SC_ALPHA_OPAQUE)입니다. 값 256(C_ALPHA_NOALPHA)은 알파 채널을 사용하지 않음을 의미합니다. 모든 플랫폼이 알파 채널을 지원하는 것은 아니며 일부 메시지만 알파 효과를 구현합니다. 메시지의 기본 알파 값은 256이며 알파 채널이 사용되지 않습니다.
<<> & lt; 미사용 & gt; 미사용 매개변수이므로 향후 버전과의 호환성을 보장하기 위해 0으로 설정하는 것이 좋습니다.
in scintilla, in SCINTILA,, in scintilla에서는 다음 데이터 구조가 사용됩니다:
struct CharacterRange { long cpMin; long cpMax; };
텍스트 범위 데이터 구조, 주로 Scintilla 구성요소에서 지정된 텍스트 범위를 가져오는 데 사용되며, WIN32 데이터 구조 TEXTRANGE와 동일합니다.
struct TextRange { struct CharacterRange chrg; char *lpstrText; };
TextToFind
struct TextToFind {struct CharacterRange chrg; // 搜索范围char *lpstrText; // 搜索文本struct CharacterRange chrgText; // 匹配文本};
struct NotifyHeader { // 与WIN32数据结构NMHDR相同 void *hwndFrom; // 发送通知的窗口句柄 uptr_t idFrom; // 发送通知的控件ID unsigned int code; // SCN_*通知事件代码 }; struct SCNotification { struct NotifyHeader nmhdr; // SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_DWELLSTART, // SCN_DWELLEND, SCN_CALLTIPCLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK int position; int ch; // SCN_CHARADDED, SCN_KEY // SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK int modifiers; int modificationType; // SCN_MODIFIED // SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION const char *text; int length; // SCN_MODIFIED int linesAdded; // SCN_MODIFIED int message; // SCN_MACRORECORD uptr_t wParam; // SCN_MACRORECORD sptr_t lParam; // SCN_MACRORECORD int line; // SCN_MODIFIED, SCN_DOUBLECLICK int foldLevelNow; // SCN_MODIFIED int foldLevelPrev; // SCN_MODIFIED int margin; // SCN_MARGINCLICK int listType; // SCN_USERLISTSELECTION, SCN_AUTOCSELECTION int x; // SCN_DWELLSTART, SCN_DWELLEND int y; // SCN_DWELLSTART, SCN_DWELLEND };
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)!