首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从文本控件检索字符位置的工作区坐标

从文本控件检索字符位置的工作区坐标
EN

Stack Overflow用户
提问于 2011-04-10 20:41:21
回答 4查看 1.1K关注 0票数 3

我需要编写一个函数,它可以从文本编辑控件中的字符位置获取屏幕坐标。我正在使用wxWidgets框架提供的文本编辑控件。wxTextCtrl没有公开任何能够提供此信息的API函数。在Windows上,我可以通过向文本控件发送波夫罗玛来获取信息。

我想知道如何在Linux等其他环境中也这样做。现在,这只需要在运行在X窗口系统之上的桌面环境上完成,比如GNOME、KDE和XFCE。有办法吗?在这些DE上,谁会像文本编辑那样绘制控件?它是由X管理的,还是由特定DE设计的?

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-24 06:25:44

当然,这是可能的,但是您需要实现一个wxTextCtrl派生控件,它依赖于任何特定的wxWidgets端口(wxMSW、wxGTK等)的底层平台功能。

所以,因为您已经询问了Linux实现的情况。让我解释一下如何在wxGTK 2.9中实现它。下面是wxTextCtrlExt控件的定义:

代码语言:javascript
运行
AI代码解释
复制
#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实现:

代码语言:javascript
运行
AI代码解释
复制
#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);
}

您还可能希望将缓冲区坐标转换为部件的坐标:

代码语言:javascript
运行
AI代码解释
复制
    // 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类的子对象的指针:

代码语言:javascript
运行
AI代码解释
复制
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环境的基本框架:在屏幕上绘制和移动窗口,并与鼠标和键盘交互。

票数 3
EN

Stack Overflow用户

发布于 2011-04-19 19:55:08

我不完全清楚所寻求的字符位置,但解决方案可能涉及到wxTextCtrl::XYToPosition()和/或wxTextCtrl::PositionToXY(),但还不清楚结果应该在哪个坐标系中表示。

wxTextCtrl继承了提供wxWindow::GetPosition()wxWindow。父程序由wxWindow::GetParent找到。

在他们之间,我怀疑答案很容易得到。

票数 0
EN

Stack Overflow用户

发布于 2011-04-22 03:22:05

我的上一次wxWidgets经历已经有一段时间了,但是如果您找不到一种更简单(更短)的方法,那么在插入符号之前计算文本的范围(例如使用wxDC::GetTextExtent())是否是一种可能的方法来找到您想要的位置?这将给出一个相对于wxTextCtrl中文本开头的位置。您可能需要考虑边框大小和边框与实际文本之间的间距。如果有必要,可以通过wxTextCtrl::HitTest()进行细化?

顺便说一下,wxStyledTextCtrl怎么样?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5616821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档