Здравствуйте, AXP, Вы писали:
AXP>Хочу написать UserControl — неследник от TextBox или от TextBoxBase — не важно. Нужна поддержка цветного текста. AXP>Искал по инету. Видел http://rsdn.ru/article/dotnet/dotnetcontrols.xml
но там не про UserControl. В конце было написано про продолжения, которого так и не было. Может кто подскажет где есть какой мануал?
AXP>Заранее спасибо.
AXP>PS Пишу под Compact Framework на C#
Насколько я помню, основная идея — это переопределить некоторые методы, в частности, OnPaint. Вот тут есть пример про ListBox,
Что то я не вникну только никак. Создал компонент на основе TextBox, он нормально дабавляется, если изменить его свойства программно — все меняется.
Попробовал заменить OnPaint — ничего не вышло. Вот код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ColoredTextBox
{
public partial class ColoredTextBox : TextBox
{
public ColoredTextBox()
{
InitializeComponent();
this.Multiline = true;
this.Width = 50;
this.Height = 50;
this.WordWrap = false;
this.ScrollBars = ScrollBars.Both;
}
protected override void OnPaint(PaintEventArgs e)
{
Pen blackPen = new Pen(Color.Black, 3);
Rectangle rectangle1 = new Rectangle(0, 0, 20, 10);
e.Graphics.DrawRectangle(blackPen, rectangle1);
MessageBox.Show("Paint!");
base.OnPaint(e);
}
}
}
При перерисовке не черного квадрата не виджно, не вылазит MassegaBex "Paint!"
Что я делаю не так?
Re[3]: Нужна документация по написанию компонентов
AXP>> protected override void OnPaint(PaintEventArgs e) AXP>> { AXP>> Pen blackPen = new Pen(Color.Black, 3); AXP>> Rectangle rectangle1 = new Rectangle(0, 0, 20, 10); AXP>> e.Graphics.DrawRectangle(blackPen, rectangle1); AXP>> MessageBox.Show("Paint!"); AXP>> base.OnPaint(e); AXP>> } AXP>> } AXP>>} AXP>>[/ccode]
AXP>>При перерисовке не черного квадрата не виджно, не вылазит MassegaBex "Paint!"
AXP>>Что я делаю не так?
J_K>Попробуй base.OnPaint(e); поставить в самом начале, а не в конце. Иначе ты просто перерисовываешь методом базового класса.
Ну да так вначале и делал. 0 эффекта. Я вобще base.OnPaint(e); убирал. Да и независима от того где он стоял MwssageBox то должен же был выдаваться!
Re[5]: Нужна документация по написанию компонентов
Здравствуйте, AXP, Вы писали:
AXP>Здравствуйте, J_K, Вы писали:
AXP>>> protected override void OnPaint(PaintEventArgs e) AXP>>> { AXP>>> Pen blackPen = new Pen(Color.Black, 3); AXP>>> Rectangle rectangle1 = new Rectangle(0, 0, 20, 10); AXP>>> e.Graphics.DrawRectangle(blackPen, rectangle1); AXP>>> MessageBox.Show("Paint!"); AXP>>> base.OnPaint(e); AXP>>> } AXP>>> } AXP>>>} AXP>>>[/ccode]
AXP>>>При перерисовке не черного квадрата не виджно, не вылазит MassegaBex "Paint!"
AXP>>>Что я делаю не так?
J_K>>Попробуй base.OnPaint(e); поставить в самом начале, а не в конце. Иначе ты просто перерисовываешь методом базового класса. AXP>Ну да так вначале и делал. 0 эффекта. Я вобще base.OnPaint(e); убирал. Да и независима от того где он стоял MwssageBox то должен же был выдаваться!
Попробуй:
1. Убрать из кода MessageBox.Show("Paint!");
2. Проверить под отладкой, заходит ли он вообще в обработчик.
Life is very short and there's no time
for fussing and fighting... (C) Paul McCartney & John Lennon
Re[6]: Нужна документация по написанию компонентов
Здравствуйте, AXP, Вы писали:
AXP>нет, не заходит. Я об этом и говорю. В чем то я не прав. никак не помйму, в чем.
Скорей всего отрисовка отдана операционке. См. метод Controi.SetStyle и перечисление ControlStyles.
[FlagsAttribute]
public enum ControlStyles
Member name
Description
...
...
UserPaint
If true, the control paints itself rather than the operating system doing so. If false, the Paint event is not raised. This style only applies to classes derived from Control.
...
...
... << RSDN@Home 1.2.0 alpha rev. 678>>
Re[8]: Нужна документация по написанию компонентов
ДА>Скорей всего отрисовка отдана операционке. См. метод Controi.SetStyle и перечисление ControlStyles.
Вот как. Ну а если так, то как лучше поступить? Отменить перерисовку операционкой и рисовать самому?
Или есть способ частично рисовать самому (только текст)? Не хотелось бы накладывать один рисунок на другой — лишнее время. Тем более, что работает все это на кпк...
Re[9]: Нужна документация по написанию компонентов
Здравствуйте, AXP, Вы писали:
ДА>>Скорей всего отрисовка отдана операционке. См. метод Controi.SetStyle и перечисление ControlStyles. AXP>Вот как. Ну а если так, то как лучше поступить? Отменить перерисовку операционкой и рисовать самому? AXP>Или есть способ частично рисовать самому (только текст)? Не хотелось бы накладывать один рисунок на другой — лишнее время. Тем более, что работает все это на кпк...
Попробуй поставь UserPaint и в OnPaint вызвать base.OnPaint может отрисует... Самому не нужно было ни разу.
... << RSDN@Home 1.2.0 alpha rev. 678>>
Re[3]: Нужна документация по написанию компонентов
Здравствуйте, AXP, Вы писали:
AXP>Спасибо. Очень полезно оказалось.
AXP>Что то я не вникну только никак. Создал компонент на основе TextBox, он нормально дабавляется, если изменить его свойства программно — все меняется. AXP>Попробовал заменить OnPaint — ничего не вышло. Вот код:
AXP>При перерисовке не черного квадрата не виджно, не вылазит MassegaBex "Paint!"
AXP>Что я делаю не так?
Было подобное, но только я с окном бился (формой), оказалось — переопределенный OnPaint нормально отработает на наследнике твоего контрола!
Т.е. просто отнаследуй контрол от твоего и на нем смотри должно заработать.
Здравствуйте, AXP, Вы писали:
AXP>Хочу написать UserControl — неследник от TextBox или от TextBoxBase — не важно. Нужна поддержка цветного текста. AXP>Искал по инету. Видел http://rsdn.ru/article/dotnet/dotnetcontrols.xml
но там не про UserControl. В конце было написано про продолжения, которого так и не было. Может кто подскажет где есть какой мануал?
AXP>Заранее спасибо.
AXP>PS Пишу под Compact Framework на C#
Ну как успехи?
Life is very short and there's no time
for fussing and fighting... (C) Paul McCartney & John Lennon
Re[9]: Нужна документация по написанию компонентов
Здравствуйте, AXP, Вы писали:
AXP>Вот как. Ну а если так, то как лучше поступить? Отменить перерисовку операционкой и рисовать самому? AXP>Или есть способ частично рисовать самому (только текст)? Не хотелось бы накладывать один рисунок на другой — лишнее время. Тем более, что работает все это на кпк...
Вызови в конструкторе SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer). Если надо чтобы поле ввода меняло размеры то добавь еще флаг ResizeRedraw. И в коде отрисовки сначала вызывай base.OnPaint() — он нарисует тебе стандартное поле ввода а потом поверх него нарисуй что-то свое.