Scintilla est un composant d'édition open source qui possède non seulement les fonctions d'édition habituelles, mais fournit également des fonctions telles que le style de syntaxe, le pliage de code, les balises, la saisie semi-automatique du code et les invites.
La version Windows de Scintilla est un composant Windows standard. Les utilisateurs peuvent envoyer des messages et interagir avec celui-ci via la fonction SendMessage. L'interface de la fonction SendMessage est la suivante :
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
La version GTK de Scintilla utilise une méthode similaire à la version Windows pour la livraison des messages. L'introduction suivante se concentrera sur la version Windows.
Scintilla fournit un grand nombre d'API de messages, chaque message peut avoir 0, 1 ou 2 paramètres. Le message dans la fonction SendMessage comporte généralement deux paramètres : wParam et lParam. Par conséquent, pour les paramètres inutilisés, il est fortement recommandé de les mettre à 0 pour garantir la compatibilité avec les versions futures. Pour la plupart des messages de paramétrage SCI_SETxxxxx, il y aura un message de requête SCI_GETxxxxx correspondant.
Type de paramètre
Le type de paramètre dans le message, comme indiqué dans le tableau suivant :
Type de paramètre bool 0 signifie FAUX, 1 signifie VRAI
Pointeur de chaîne constant, la chaîne peut se terminer par 0 ou être transmise à un autre. Un paramètre spécifie la longueur de
car* pointeur de tampon de caractères, Scintilla le remplira avec les données de caractères interrogées. Dans certains cas, la taille du tampon est spécifiée via un autre paramètre ; dans d'autres cas, vous devez vous assurer que le tampon est suffisamment grand pour accueillir les données de caractères interrogées. Si vous transmettez un pointeur nul de 0, le message renverra la taille des données de caractères interrogées.
couleur Valeur de couleur au format RVB. Chaque couleur a une valeur comprise entre 0 et 255. Le rouge, le vert et le bleu sont combinés comme suit pour obtenir la valeur de couleur : couleur = rouge | (vert << 8) (bleu << 16). 0x000000, noir ; 0xff0000, bleu ; 0x00ff00, vert ; 0x0000ff, rouge ;
alpha La valeur du canal alpha représente la translucidité de la couleur. La plage de valeurs est : 0 (complètement transparent, SC_ALPHA_TRANSPARENT) - 255 (opaque, SC_ALPHA_OPAQUE). Une valeur de 256 (C_ALPHA_NOALPHA) signifie ne pas utiliser le canal alpha. Toutes les plates-formes ne prennent pas en charge les canaux alpha et seuls certains messages implémentent des effets alpha. La valeur alpha par défaut du message est 256 et aucun canal alpha n'est utilisé.
<<> & lt; paramètres inutilisés & gt;, il est fortement recommandé de le mettre à 0 pour assurer la compatibilité avec la future version
Dans scintilla, les structures de données suivantes sont utilisées :
CharacterRange
Structure de données de plage de caractères, qui est la même que la structure de données WIN32 CHARRANGE.
TextRange
Structure de données de plage de texte, principalement utilisée pour obtenir une plage de texte spécifiée à partir du composant Scintilla, identique à la structure de données WIN32 TEXTRANGE.
struct CharacterRange { long cpMin; long cpMax; };
Recherchez la structure de données texte, qui est la même que la structure de données WIN32 FINDTEXTEX.
struct TextRange { struct CharacterRange chrg; char *lpstrText; };
SCNotification
struct TextToFind {struct CharacterRange chrg; // 搜索范围char *lpstrText; // 搜索文本struct CharacterRange chrgText; // 匹配文本};
对于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)!