Ну, это возможно, но вам нужно реализовать производный элемент управления 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 Window System не требует пользовательского интерфейса самостоятельно.Он обеспечивает базовую структуру для создания сред графического интерфейса: рисование и перемещение окон на экране и взаимодействие с мышью и клавиатурой.