1

wxWidgets 有 wxStyledTextCtrl (据我所知)在幕后使用 Scintilla

我对 Scintilla API 了解不多,但我有点想你向它发出命令。

特别是,我想让光标具有块样式,我在 Notepad++ 中找到了以下代码段:

execute(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK)

我想在 StyledTextCtrl 中做同样的事情,但我不知道如何进入幕后的 scinitilla 控件。

我该怎么做呢?

PS 我在 wxPython 中工作,但我想这并没有什么不同。

更新:

在对 wxWidgets 的 c++ 源代码进行了一些挖掘之后,我发现大多数函数只是调用SendMsg,例如:

// Get the time in milliseconds that the caret is on and off. 0 = steady on.
void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds)
{
    SendMsg(2076, periodMilliseconds, 0);
}

所以我认为这就是向底层闪烁组件发送命令的方式。

所以,我得到了我需要的值

#define CARETSTYLE_INVISIBLE 0
#define CARETSTYLE_LINE 1
#define CARETSTYLE_BLOCK 2
#define SCI_SETCARETSTYLE 2512
#define SCI_GETCARETSTYLE 2513

2512也是如此SCI_SETCARETSTYLE,块样式为2。

所以我SengMsg用这些参数调用:

self.SendMsg(2512, 2)

但是好像没什么效果!

可能是什么原因?我该如何调试呢?

4

2 回答 2

2

你不写你正在使用哪个版本的 wxPython / wxWidgets,但我假设它是 2.8.x 版本。这包含 Scintilla 版本 1.70,而 SVN 主干(即将作为 wxWidgets 版本 2.9 发布)具有 Scintilla 版本 1.75。对 Scintilla 头文件的grep显示SCI_GETCARETSTYLESCI_SETCARETSTYLE仅在 wxWidgets 主干中,因此在 wxWidgets 2.8 中根本不会处理这些消息。

于 2009-04-29T19:16:28.087 回答
0

尝试

self.SendMsg(msg=2512, lp=2)
于 2009-04-29T13:06:32.733 回答