wxWidgets: como mudar o estilo acento circunflexo em StyledTextCtrl (enviando um comando para scintilla)
Pergunta
wxWidgets tem wxStyledTextCtrl que (como eu entendo) usa Scintilla nos bastidores
Eu não sei muito sobre Scintilla API, mas eu meio que tem a idéia de que você emite comandos a ele.
Em particular, eu quero fazer o cursor têm um estilo bloco, que encontrei no Notepad ++ o seguinte trecho:
execute(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK)
Eu quero fazer o mesmo no StyledTextCtrl, mas não tenho idéia de como chegar ao controle scinitilla por trás da cena.
Como posso fazer isso?
P.S. Eu estou trabalhando em wxPython, mas suponho que não faz a diferença.
Update:
Depois de algumas escavações no c ++ fontes de wxWidgets, descobri que a maioria das funções é só chamar SendMsg
, por exemplo:
// Get the time in milliseconds that the caret is on and off. 0 = steady on.
void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds)
{
SendMsg(2076, periodMilliseconds, 0);
}
Então eu percebi que esta é a forma como se poderia enviar comandos para o componente scintilla subjacente.
Então, eu tenho os valores que eu preciso
#define CARETSTYLE_INVISIBLE 0 #define CARETSTYLE_LINE 1 #define CARETSTYLE_BLOCK 2 #define SCI_SETCARETSTYLE 2512 #define SCI_GETCARETSTYLE 2513
Assim SCI_SETCARETSTYLE
é 2512, e estilo do bloco é 2.
Então eu chamei SengMsg
com estes parâmetros:
self.SendMsg(2512, 2)
Mas não parecia haver qualquer efeito!
O que poderia ser a razão? Como eu posso depurar isso?
Solução
Você não escrever a versão do wxPython / wxWidgets você está usando, mas eu suponho que é a versão 2.8.x. Este contém Scintilla versão 1.70, enquanto o tronco SVN (que em breve será lançado como wxWidgets versão 2.9) tem Scintilla versão 1.75. A grep sobre os arquivos de cabeçalho Scintilla revela que SCI_GETCARETSTYLE e SCI_SETCARETSTYLE são apenas no tronco wxWidgets, então essas mensagens não serão tratadas em tudo em wxWidgets 2.8.
Outras dicas
Tente
self.SendMsg(msg=2512, lp=2)