Я пытаюсь разработать TextCtrl с некоторыми строчными рисунками: простые вещи, которые я хочу нарисовать над текстом, рядом с ним, между строками и т. Д. И я приближаюсь к чертежу в Wx, как я это сделал до, на WxPanels: с DC: $ dc-> DrawLine (15, 15, 120, 120); и т.д.Можно ли рисовать на TextCtrl? И если да, то как?
До сих пор, я это делаю: в класс, производный от TextCtrl, я ловлю EVT_PAINT и реализовать свою собственную функцию OnPaint:
sub new {
my $class = shift;
my $parent = shift;
my $self = $class->SUPER::new($parent, -1, '', wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
EVT_PAINT($self, \&OnPaint);
return $self;
}
sub OnPaint {
print"OnPaint: @_ \n";
# @ravenspoint: this is there I would call the base's paint method
# first, right? But how??
my $linesCnt = $_[0]->GetNumberOfLines();
my $dc = Wx::PaintDC->new($_[0]);
$dc->DrawLine(
15, 15,
120, 120
);
# commented out as the base class' paint method will follow,
# erasing what we've just drawn
# $_[1]->Skip(1);
};
Теперь, вещь: либо линия или текст в элементе управления рисуется, когда я допускаю распространение события рисования или нет. Для любого гуру Wx это может быть очевидно, но для меня это не так. Поскольку я понимаю TextCtrl, это агломерат WxWindow и низкоуровневый способ рисования текста в нем с помощью dc и DrawText() и некоторых функций удобства сверху, для установки каретки и т. Д.
Это понимание означает для меня: чтобы иметь возможность рисовать, мне нужен доступ к уже подготовленному/нарисованному DC, чтобы я мог рисовать его. Правильно? Возможно ли это вообще и в WxPerl? В моей функции выше, я делаю свою краску до того, как элемент управления рисует текст, вот что я считаю причиной исчезновения линии, когда я раскомментирую Skip() - поскольку элемент управления затем очищает и перерисовывает DC.
Есть ли способ попасть в петлю после TextCtrl выполнил все чертежи?
P.S.
Plain TextCtrl, похоже, реализован путем вызова встроенной текстовой записи на большинстве платформ, хотя в документах это не упоминается.
Я выкопал в Кефре и Падре, которые оба показывают «индикатор правого края», тонкую вертикальную линию, обычно серое, нарисованное на текстовой области. Как они это делают? Сюрприз: они подкласса Wx :: Scintilla или старший Wx :: StyledTextCtrl, которые предлагают метод SetEdgeColumn() для его запуска.
Спрашиваю себя, что переопределение моего собственного текстового виджета - единственный способ получить доступ к графическому изображению на DC. (Качая головой в неверии)
Лужение с * EVT_ERASE_BACKGROUND * и RichtTextCtrl в PaintBackground() без успеха (ну, через несколько минут взлома).
Большинство элементов управления wxWidgets являются собственными виджетами, а те, которые не могут быть переопределены с использованием встроенной поддержки в будущих версиях библиотеки и/или базового инструментария (это очень часто происходит с wxGTK). –
Это пока не сказано, но TextCtrl может быть реализована путем использования собственного виджета. Но документы в этом немыслимы. Итак, большие пальцы вверх для подтверждения того, что TextCtrl - это собственный элемент управления. Хотя мне не повезло в рисовании RichTextCtrl ... – isync