支持中文
来自http://www.cppprog.com/2009/1111/176_5.html
Scintilla默认用的是ANSI编码,所以编辑中文之类的多字节编码时,会出错半个字符的问题。我们可以使用SCI_SETCODEPAGE命令设置使用的编码。
为了支持多语言,建议使用UTF8编码:
- // UTF-8编码
- SendEditor(SCI_SETCODEPAGE,SC_CP_UTF8);
这样,我们就得用UTF8编码输入输出了。关于UTF8编码的转换,不在本文讨论范围之内,大家自由发挥吧^_^
与C++Builder更好地集成
好了,Scintilla的使用就讲到这里,同学们下课![班长:“起立!”;童鞋们(包括睡觉中的):“老...师...再...见...”;老师:“啊!对了,用C++Builder的同学请多留一会儿,哎~~小白,说你呢,别跑~~”]。
如果大家和我一样一直在用C++Builder照上面玩Scintilla的话,一定早就发现了这个Scintilla控件不接受TAB键-_-。咳...如果你坚持看到了这里,恭喜你,你马上就可以看到解决这个问题的“终级代码”啦:-P
VCL组件库的消息循环位于TApplication类里,要让我们的Scintilla完美地嫁接到VCL里,一个好办法就是把Scintilla也包装成一个VCL组件。
VCL组件的继承线路很清晰,要包装Scintilla,只要写一个TWinControl的超类就可以了:
- class TScEdit : public TWinControl{
- protected:
- virtual void __fastcall CreateParams(Controls::TCreateParams &Params)
- {
- TWinControl::CreateParams(Params);
- CreateSubClass(Params, "Scintilla");
- }
- virtual void __fastcall WndProc(Messages::TMessage &Message)
- {
- TWinControl::WndProc(Message);
- if(Message.Msg == WM_GETDLGCODE) //让窗体接受方向键和TAB键
- Message.Result = DLGC_WANTALLKEYS|DLGC_WANTARROWS|DLGC_WANTTAB;
- }
- public:
- __fastcall TScEdit(Classes::TComponent* AOwner)
- :TWinControl(AOwner){;}
- sptr_t SendEditor(unsigned int iMessage, uptr_t wParam = 0, sptr_t lParam = 0)
- {
- return SendMessage(Handle, iMessage, wParam, lParam);
- }
- };
现在,我们可以用这个TScEdit代替之前的用CreateWindow建立的Scintilla了:
- class TForm1 : public TForm
- {
- ...
- TScEdit *m_se;
- sptr_t SendEditor(unsigned int iMessage, uptr_t wParam = 0, sptr_t lParam = 0)
- {
- return m_se->SendEditor(iMessage, wParam, lParam);
- }
- };
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- /* 在C++Builder世界里,抛弃CreateWindow吧-_-
- HWND hwndEditor = ::CreateWindow(_T("Scintilla"),
- NULL, WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE,
- 0,0,ClientWidth,ClientHeight,
- Handle,
- (HMENU)SCINT_ID, HInstance, NULL);
- m_fnDirect = (SciFnDirect)SendMessage(hwndEditor,SCI_GETDIRECTFUNCTION,0,0);
- m_ptrDirect = (sptr_t)SendMessage(hwndEditor,SCI_GETDIRECTPOINTER,0,0);
- setCppStyle();
- setFold();
- */
- m_se = new TScEdit(this);
- m_se->Parent = this;
- m_se->Align = alClient;//自动占满整个父窗体
- setCppStyle();
- setFold();
- }