在notepad ++插件中获取当前光标位置

时间:2014-01-07 14:57:18

标签: c++ notepad++

我正在尝试获取光标所在的行号。但是我没有找到简单的方法来获得该线。相反,我试图获取当前位置,然后使用SCI_LINEFROMPOSITION将其转换为行。

::SendMessage(nppData._nppHandle,SCI_GETCURRENTPOS,0,(LPARAM)&first);
::SendMessage(nppData._scintillaMainHandle,SCI_GETCURRENTPOS,0,(LPARAM)&second);
::SendMessage(nppData._scintillaSecondHandle,SCI_GETCURRENTPOS,0,(LPARAM)&third);

这些调用中的每一个都不会更改最后一个参数的值。很遗憾,我找不到SCI_GETCURRENTPOS的示例。我能够将文本插入到文件中,因此我可以通过这种方式查看值:

std::wstringstream wss;
wss << "First value read" << first << std::endl;
wss << "Second value read" << second << std::endl;
wss << "Third value read" << third << std::endl;
insertTextIntoCurrentFile(wss.str().c_str());

我该如何获得当前行?在这种情况下,HWND的预期SendMessage是哪个?

3 个答案:

答案 0 :(得分:2)

我能够通过搜索记事本加上讨论来解决这个问题。 答案是从SendMessage读取返回值。

获取Scintilla HWND

int currentEdit;
::SendMessage(nppData._nppHandle, NPPM_GETCURRENTSCINTILLA, 0, (LPARAM)&currentEdit);
HWND curScint = (currentEdit == 0 ) ?
nppData._scintillaMainHandle:nppData._scintillaSecondHandle;

获取当前光标位置:

int cursorPosition = ::SendMessage(curScint,SCI_GETCURRENTPOS,0,0);

答案 1 :(得分:2)

以下答案是您的初始问题和您自己答案的组合的澄清版本(这使我找到了这个完整的解决方案)。

// Position of the cursor in the entire buffer
int cursorPosition = ::SendMessage(nppData._scintillaMainHandle, SCI_GETCURRENTPOS, 0, 0);

// Line position of the cursor in the editor
int currentLine = ::SendMessage(nppData._nppHandle, NPPM_GETCURRENTLINE, 0, 0);

// Column position of the cursor in the editor
int currentColumn = ::SendMessage(nppData._nppHandle, NPPM_GETCURRENTCOLUMN, 0, 0);

答案 2 :(得分:0)

这是一种无需调用SendMessage()的方法,只需使用methods from standard Scintilla API –伪代码如下:

currentLineNumber = editor.SCI_LINEFROMPOSITION(editor.SCI_GETCURRENTPOS())

这对于将代码保持在较高级别或用于其他语言(例如N ++ Python Script插件)中的脚本很有用,因为在这些语言中,调用已记录的API很容易,但是SendMessage()的方式可能会更困难。 (经过测试-可以。)