支持中文

支持中文

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

Scintilla默认用的是ANSI编码,所以编辑中文之类的多字节编码时,会出错半个字符的问题。我们可以使用SCI_SETCODEPAGE命令设置使用的编码。

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

  1. // UTF-8编码
  2. 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的超类就可以了:

  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了:

  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. }

你可能感兴趣的:(html,C++,c,C#,C++Builder)