我需要编写一个函数,它可以从文本编辑控件中的字符位置获取屏幕坐标。我正在使用wxWidgets
框架提供的文本编辑控件。wxTextCtrl
没有公开任何能够提供此信息的API函数。在Windows上,我可以通过向文本控件发送波夫罗玛来获取信息。
我想知道如何在Linux等其他环境中也这样做。现在,这只需要在运行在X窗口系统之上的桌面环境上完成,比如GNOME、KDE和XFCE。有办法吗?在这些DE上,谁会像文本编辑那样绘制控件?它是由X管理的,还是由特定DE设计的?
任何帮助都将不胜感激。
发布于 2011-04-24 06:25:44
当然,这是可能的,但是您需要实现一个wxTextCtrl
派生控件,它依赖于任何特定的wxWidgets端口(wxMSW、wxGTK等)的底层平台功能。
所以,因为您已经询问了Linux实现的情况。让我解释一下如何在wxGTK 2.9中实现它。下面是wxTextCtrlExt
控件的定义:
#include <wx/textctrl.h>
#include <wx/gdicmn.h>
//-----------------------------------------------------------------------------
// wxTextCtrlExt
//-----------------------------------------------------------------------------
class wxTextCtrlExt : public wxTextCtrl
{
public:
wxTextCtrlExt() : wxTextCtrl() { }
wxTextCtrlExt(wxWindow* parent,
wxWindowID id,
const wxString& value = wxEmptyString,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxTE_MULTILINE,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxTextCtrlNameStr)
: wxTextCtrl(parent, id, value, pos, size, style, validator, name ) { }
wxPoint GetPositionCoords(long pos);
};
以及wxGTK实现:
#include "wxTextCtrlExt.h"
#include <wx/defs.h>
#include <gtk/gtk.h>
wxPoint wxTextCtrlExt::GetPositionCoords(long pos)
{
if ( IsMultiLine() ) {
GtkTextView* txtView = GTK_TEXT_VIEW(m_focusWidget);
GtkTextBuffer* txtBuffer = gtk_text_view_get_buffer(txtView);
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset(txtBuffer, &iter, pos);
GdkRectangle location; // output location in buffer coordinates
gtk_text_view_get_iter_location(txtView, &iter, &location);
return wxPoint(location.x, location.y);
}
return wxPoint(0,0);
}
您还可能希望将缓冲区坐标转换为部件的坐标:
// If we need to convert our coordinates to
GdkPoint out;
gtk_text_view_buffer_to_window_coords(txtView, GTK_TEXT_WINDOW_WIDGET, location.x, location.y, &out.x, &out.y );
return wxPoint(out.x, out.y);
如您所见,这个特定的实现没有考虑到一行文本条目,这就是在创建wxTE_MULTILINE
控件时需要使用wxTextCtrlExt
样式的原因。
下面是如何使用它。让我们将m_Text2
作为指向wxTextCtrlExt
类的子对象的指针:
long iCharPos = m_Text2->GetInsertionPoint();
long iCharPosMax = m_Text2->GetLastPosition();
wxPoint pos = m_Text2->GetPositionCoords(iCharPos);
现在我们在pos
中得到了字符位置坐标。就这样!
一些你可能感兴趣的链接:
现在都是关于你的第二个问题了。
在这些DE上,谁会像文本编辑那样绘制控件?它是由X管理的,还是由特定DE设计的?
这取决于您使用的wxWidgets端口。wxMSW和wxGTK端口分别使用Win32和GTK+2本机控件。基于wxUniversal的端口(如wxX11、wxMGL)由wxWidgets自己绘制所有控件。X窗口系统本身并不强制用户界面。它提供了构建GUI环境的基本框架:在屏幕上绘制和移动窗口,并与鼠标和键盘交互。
发布于 2011-04-19 19:55:08
我不完全清楚所寻求的字符位置,但解决方案可能涉及到wxTextCtrl::XYToPosition()
和/或wxTextCtrl::PositionToXY()
,但还不清楚结果应该在哪个坐标系中表示。
wxTextCtrl
继承了提供wxWindow::GetPosition()
的wxWindow
。父程序由wxWindow::GetParent
找到。
在他们之间,我怀疑答案很容易得到。
发布于 2011-04-22 03:22:05
我的上一次wxWidgets经历已经有一段时间了,但是如果您找不到一种更简单(更短)的方法,那么在插入符号之前计算文本的范围(例如使用wxDC::GetTextExtent())是否是一种可能的方法来找到您想要的位置?这将给出一个相对于wxTextCtrl中文本开头的位置。您可能需要考虑边框大小和边框与实际文本之间的间距。如果有必要,可以通过wxTextCtrl::HitTest()进行细化?
顺便说一下,wxStyledTextCtrl怎么样?
https://stackoverflow.com/questions/5616821
复制