Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование RichTextBox 
:(
    Опции темы
yngwie19
Дата 22.8.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте подскажите. Я наследую класс RichTextBox:
Код

class SRCell : RichTextBox
{
    
}

Можно ли переопределить событие LocationChanged ? или оно закрыто
PM MAIL   Вверх
diadiavova
Дата 23.8.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Переопределить можно метод, в котором оно инициируется
OnLocationChanged


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
yngwie19
Дата 23.8.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



diadiavova, Спасибо. Мне Вот что нужно сделать. На форме есть группа RichTextBox -ов. Мне нужно чтобы вокруг каждого ровно по его периметру был нарисован прямоугольник (DrawRectangle). Можно ли в моем наследуемом классе SRCell сделать так чтобы при создании такого ричтекстбокса приросовывалась такая рамка ?
P.s: Я создаю ричтекстбоксы через класс SRCell, который унаследован от RithTextBox
PM MAIL   Вверх
diadiavova
Дата 23.8.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(yngwie19 @  23.8.2009,  12:35 Найти цитируемый пост)
Мне нужно чтобы вокруг каждого ровно по его периметру был нарисован прямоугольник (DrawRectangle). Можно ли в моем наследуемом классе SRCell сделать так чтобы при создании такого ричтекстбокса приросовывалась такая рамка ?

Можно. Как-нибудь так
Код

    public partial class MyRTB : RichTextBox
    {
        public MyRTB()
        {
            InitializeComponent();
        }

        void Parent_Paint(object sender, PaintEventArgs e)
        {
            var r = new Rectangle(this.Location, this.Size);
            r.X -= 3;
            r.Y -= 3;
            r.Width += 6;
            r.Height += 6;
            e.Graphics.DrawRectangle(Pens.Red, r);
        }

        private void MyRTB_ParentChanged(object sender, EventArgs e)
        {
            try 
            {
                Parent.Paint += new PaintEventHandler(Parent_Paint);
            }
            catch { }
        }

    }



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
yngwie19
Дата 23.8.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



diadiavova, Спасибо тебе большое. У меня еще есть один вопрос:
1) Почему нужно обрабатывать ParentChanged?
Объясни пожалуйста как работает этот механизм. Я так понимаю, когда мы срабатывает ParentChanged, то на форме рисуется это?:
Код

 var r = new Rectangle(this.Location, this.Size);
            r.X -= 3;
            r.Y -= 3;
            r.Width += 6;
            r.Height += 6;
            e.Graphics.DrawRectangle(Pens.Red, r);



Это сообщение отредактировал(а) yngwie19 - 23.8.2009, 21:31
PM MAIL   Вверх
diadiavova
Дата 24.8.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(yngwie19 @  23.8.2009,  22:18 Найти цитируемый пост)
Я так понимаю, когда мы срабатывает ParentChanged, то на форме рисуется это?:

Не совсем. Если ты хочешь что-то нарисовать в родительском контейнере(на форме к примеру), то тебе надо обработать событие Paint этого контейнера. Но проблема в том, что твой ричтекстбокс в момент создания не расположен ни в каком контейнере, мало того, за время своего существования он может несколько раз сменить родителя. Так вот для того, чтобы прорисовка производилась именно в том контейнере, в котором он находится надо при помещении его в контейнер подписаться на событие Paint этого контейнера(и не раньше). И кстати на случай если контейнер будет меняться надо код сильно поменять. В этом случае тебе придётся предусмотреть, что при смене контейнера сам контейнер должен быть перерисован, в предыдущем родителе ничего прорисовываться не должно, так что от обработки прорисовки в бывших контейнерах надо вовремя отписываться и перерисовывать их тоже. То есть код должен выглядеть примерно так
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FramedRTB
{
    public partial class MyRTB : RichTextBox
    {
        public MyRTB()
        {
            InitializeComponent();
        }

        void Parent_Paint(object sender, PaintEventArgs e)
        {
            var r = new Rectangle(this.Location, this.Size);
            r.X -= 3;
            r.Y -= 3;
            r.Width += 6;
            r.Height += 6;
            e.Graphics.DrawRectangle(Pens.Red, r);
        }

        private void MyRTB_ParentChanged(object sender, EventArgs e)
        {
            try 
            {
                Parent.ControlRemoved += new ControlEventHandler(Parent_ControlRemoved);
                Parent.Paint += new PaintEventHandler(Parent_Paint);
                Parent.Invalidate();
            }
            catch { }
        }

        void Parent_ControlRemoved(object sender, ControlEventArgs e)
        {
            if (e.Control == this)
            {
                var sr = (Control)sender;
                sr.Paint -= Parent_Paint;
                sr.Invalidate();
            }
        }

    }
}



От всего этого геморроя можно избавиться если разместить ричтекстбокс в собственный контейнер. То есть создать свой юзерконтрол с ричтекстбоксом внутри.

Добавлено через 4 минуты и 25 секунд
Вот тут пример, где этот ричтекстбокс по нажатию кнопки меняет родителя и всё прорисовывается нормально.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  FramedRTB.rar 57,14 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
yngwie19
Дата 24.8.2009, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



diadiavova, очень интересно, Но Я думаю что вой ричэдит все время будет на форме и не будет менять родителя. В таком случае нужен этот участок кода?

Цитата(diadiavova @  24.8.2009,  00:00 Найти цитируемый пост)
 void Parent_ControlRemoved(object sender, ControlEventArgs e)
        {
            if (e.Control == this)
            {
                var sr = (Control)sender;
                sr.Paint -= Parent_Paint;
                sr.Invalidate();
            }
        }


Скажи пожалуйста, т.е событие ParentChanged происходит тогда, когда контрол меняет своего родителя и соответственно когда только создается?
PM MAIL   Вверх
yngwie19
Дата 24.8.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



кстати как мне задать нужный размер шрифта для моего RichTextBox?, при установке
Код

Font.Height = 10;

ошибка : 
Код

Property or indexer 'System.Drawing.Font.Height' cannot be assigned to -- it is read only

или это свойство только get? Как тогда задать нужный размер?
PM MAIL   Вверх
diadiavova
Дата 24.8.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(yngwie19 @  24.8.2009,  07:59 Найти цитируемый пост)
событие ParentChanged происходит тогда, когда контрол меняет своего родителя и соответственно когда только создается? 

Да. И в это время надо подписаться на событие Paint родителя.
А процитированный код нужен на случай если ртб поменяет родителя, чтобы в предыдущем родителе не продолжала прорисовываться рамка.

Это сообщение отредактировал(а) diadiavova - 24.8.2009, 11:25


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
yngwie19
Дата 24.8.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



diadiavova, понял, спасибо, не подскажешь по поводу шрифта? 
PM MAIL   Вверх
diadiavova
Дата 24.8.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(yngwie19 @  24.8.2009,  13:04 Найти цитируемый пост)
не подскажешь по поводу шрифта?  

Не заметил сразу вопрос. Шрифт надо целиком новый назначать.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
yngwie19
Дата 26.8.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



diadiavova, спасибо большое за этот обработчик:
Цитата(diadiavova @  24.8.2009,  00:00 Найти цитируемый пост)
void Parent_Paint(object sender, PaintEventArgs e)
        {
            var r = new Rectangle(this.Location, this.Size);
            r.X -= 3;
            r.Y -= 3;
            r.Width += 6;
            r.Height += 6;
            e.Graphics.DrawRectangle(Pens.Red, r);
        }

        private void MyRTB_ParentChanged(object sender, EventArgs e)
        {
            try 
            {
                Parent.ControlRemoved += new ControlEventHandler(Parent_ControlRemoved);
                Parent.Paint += new PaintEventHandler(Parent_Paint);
                Parent.Invalidate();
            }
            catch { }
        }

Но у меня есть некоторые трудности (надеюсь их можно решить). Вообщем Я создаю много таких RichTextBox - ов, и получается когда Я прокручиваю скрол формы вверх и вниз, они(созданные ричтекстбоксы, обведенные прямоугольниками) медленно перерисовываются и таким образом создается "рябь", можно ли как- нибудь избавится от этого ? 
PM MAIL   Вверх
diadiavova
Дата 26.8.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Обычно от мелькания двойная буферизация спасает(свойство DoubleBuffered контейнера в котором всё рисуется). Однако я ещё раз повторюсь, что в подобных ситациях лучше использовать контейнеры для контролов. То есть: создаёшь свой юзерконтрол вставляешь туда ричтекстбокс док=филл, можно поля настроить любые, бэкколор для контейнера и всё нормуль. А если ещё тебе надо и растягивать боксы в рантайме(как ты в других топиках спрашивал), то тем более. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
yngwie19
Дата 26.8.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



diadiavova, если тебе не трудно, набросай пожалуйста простенький пример как это выглядеть должно:
P.S: Спасибо тебе большое за помошь.
PM MAIL   Вверх
diadiavova
Дата 26.8.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Ну вот вроде наколдовал smile 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  RTBWrpr.rar 59,65 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.