2011-07-24 39 views
0

我面臨着一個奇怪的問題EM_POSFROMCHAR當插入符號位於最後位置時,EM_POSFROMCHAR未返回適當的值

我想在文本控件中獲取當前插入符號位置的客戶區座標。這適用於所有其他情況,但當插入符號位於最後位置時總是返回-1

我在C++應用程序(wxWidgets)中這樣做。但爲了讓這裏發佈起來很簡單,我已經創建了一個C++/CLI端口。這裏是相關代碼(爲簡單起見,提取LOWWORD和HIWORD被刪除)。

HWND handle = (HWND) textControl->Handle.ToPointer(); 
LRESULT rc = ::SendMessage(handle, EM_POSFROMCHAR, textControl->SelectionStart, 0); 
MessageBox::Show(rc.ToString()); 

總是返回-1。我試圖通過textControl->SelectionStart - 1,它給了一個合適的價值。由於某種原因,它不適用於最後的位置。這適用於RichText控件。

我想通過.NET框架提供一個API來爲託管客戶端執行此操作。 TextBoxBase.GetPositionFromCharIndex。該功能也產生與上面解釋的相同的結果。我使用Reflector查看了它,並使用相同的代碼來獲取位置。

我有以下問題。

  1. 爲什麼在脫字符號位於最後位置時我沒有得到正確的值?
  2. 如果這是EM_POSFROMCHAR的問題,那麼解決此問題的方法是什麼?

我的意圖是在用戶鍵入文本時在插入位置顯示上下文菜單。類似於視覺工作室擁有的東西。

任何幫助,將不勝感激。

回答

0

我假設'在最後一個位置'你的意思是在最後一個可見字符後面?

如果字符是行分隔符,則返回的座標表示僅在行中最後一個可見字符之後的點。如果指定的索引大於控件中最後一個字符的索引,則控件返回-1。

通過這一邏輯,如果你有一個編輯控件,說2行,你給它在第1行的最後一個字符之後的索引,它計算換行符的座標。 最後一行或單行編輯控件中沒有這樣的字符。

至於解決方法,我不認爲有太多的編輯控制消息的方式。雖然你可能想看看GetCaretPos

相關問題