支持中文

支持中文

来自http://www.cppprog.com/2009/1111/176_5.htmlhtml

Scintilla默认用的是ANSI编码,因此编辑中文之类的多字节编码时,会出错半个字符的问题。咱们能够使用SCI_SETCODEPAGE命令设置使用的编码。ui

为了支持多语言,建议使用UTF8编码:this

  1. // UTF-8编码
  2. SendEditor(SCI_SETCODEPAGE,SC_CP_UTF8);

这样,咱们就得用UTF8编码输入输出了。关于UTF8编码的转换,不在本文讨论范围以内,你们自由发挥吧^_^编码

与C++Builder更好地集成

好了,Scintilla的使用就讲到这里,同窗们下课![班长:“起立!”;童鞋们(包括睡觉中的):“老...师...再...见...”;老师:“啊!对了,用C++Builder的同窗请多留一下子,哎~~小白,说你呢,别跑~~”]。spa

若是你们和我同样一直在用C++Builder照上面玩Scintilla的话,必定早就发现了这个Scintilla控件不接受TAB键-_-。咳...若是你坚持看到了这里,恭喜你,你立刻就能够看到解决这个问题的“终级代码”啦:-Porm

VCL组件库的消息循环位于TApplication类里,要让咱们的Scintilla完美地嫁接到VCL里,一个好办法就是把Scintilla也包装成一个VCL组件。htm

VCL组件的继承线路很清晰,要包装Scintilla,只要写一个TWinControl的超类就能够了:继承

  1. class TScEdit : public TWinControl{
  2. protected:
  3.     virtual void __fastcall CreateParams(Controls::TCreateParams &Params)
  4.     {
  5.         TWinControl::CreateParams(Params);
  6.         CreateSubClass(Params, "Scintilla");
  7.     }
  8.     virtual void __fastcall WndProc(Messages::TMessage &Message)
  9.     {
  10.         TWinControl::WndProc(Message);
  11.         if(Message.Msg == WM_GETDLGCODE) //让窗体接受方向键和TAB键
  12.             Message.Result = DLGC_WANTALLKEYS|DLGC_WANTARROWS|DLGC_WANTTAB;
  13.     }
  14. public:
  15.     __fastcall TScEdit(Classes::TComponent* AOwner)
  16.         :TWinControl(AOwner){;}
  17.         
  18.     sptr_t SendEditor(unsigned int iMessage, uptr_t wParam = 0, sptr_t lParam = 0)
  19.     {
  20.         return SendMessage(Handle, iMessage, wParam, lParam);
  21.     }
  22. };

如今,咱们能够用这个TScEdit代替以前的用CreateWindow创建的Scintilla了:ci

  1. class TForm1 : public TForm
  2. {
  3.     ...
  4.     TScEdit *m_se;
  5.     sptr_t SendEditor(unsigned int iMessage, uptr_t wParam = 0, sptr_t lParam = 0)
  6.     {
  7.         return m_se->SendEditor(iMessage, wParam, lParam);
  8.     }
  9. };
  10. __fastcall TForm1::TForm1(TComponent* Owner)
  11.     : TForm(Owner)
  12. {
  13.   /* 在C++Builder世界里,抛弃CreateWindow吧-_-
  14.     HWND hwndEditor = ::CreateWindow(_T("Scintilla"),
  15.         NULL, WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE,
  16.         0,0,ClientWidth,ClientHeight,
  17.         Handle,
  18.         (HMENU)SCINT_ID, HInstance, NULL);
  19.     m_fnDirect = (SciFnDirect)SendMessage(hwndEditor,SCI_GETDIRECTFUNCTION,0,0);
  20.     m_ptrDirect = (sptr_t)SendMessage(hwndEditor,SCI_GETDIRECTPOINTER,0,0);
  21.  
  22.     setCppStyle();
  23.     setFold();
  24.     */
  25.  
  26.     m_se = new TScEdit(this);
  27.     m_se->Parent = this;
  28.     m_se->Align = alClient;//自动占满整个父窗体
  29.     setCppStyle();
  30.     setFold();
  31. }