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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование на контроле Panel... ...ничего не отображается... 
:(
    Опции темы
CyraxZ
Дата 31.5.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



Аналогично рисованию на форме (получаем объект Graphics методом Form.CreateGraphics() и рисуем на нём) получаю объект Graphics для контрола Panel (Panel.CreateGraphics) и рисую на нём... в результате ничего не отображается...
Пробовал и очистку панели методом Clear(произвольный цвет) - никакой реакции...
PM MAIL   Вверх
emmanuil
Дата 1.6.2007, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



Попробуй код, все нормально рисует. Возьми новую панельку и примени к ней этот код, должно работать
Код

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            points = new ArrayList();
            pen = new Pen(Color.Blue, 5);
        }

        ArrayList points;
        Pen pen;

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            points.Clear();
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point pt = new Point(e.X, e.Y);
                points.Add(pt);
                if (points.Count <= 1) return;
                Point[] pts = new Point[points.Count];
                points.CopyTo(pts, 0);
                Graphics graph = panel1.CreateGraphics();
                graph.DrawCurve(pen, pts);
            }
        }

PM MAIL   Вверх
Mag
Дата 2.6.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

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



Тоже такая же проблемка была. По примеру выше создал новую панельку, Работает!

emmanuil, Спасибо.

Это сообщение отредактировал(а) Mag - 2.6.2007, 19:13
--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
CyraxZ
Дата 2.6.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



Чёрт, просмотрел одну деталь...
Рисовал-то я на панельке в событии OnLoad формы, когда ещё панель не была создана...

Тут у меня попутно ещё такой вопрос возник:
Почему у панели Panel нет событий OnLoad и OnClose, подобно форме ?
Мне нужны события, генерируемые после создания панели (пока остановился на событии Layout, хотя это не совсем то) и перед её уничтожением или скрытием...
PM MAIL   Вверх
emmanuil
Дата 5.6.2007, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



У панели есть события:
Paint - когда рисует панель,
Disposed - когда вызывается метод Dispose,
VisibleChanged - когда изменяется свойство Visible.
VisibleChanged - происходит два раза при создании формы. В первый раз, еогда панель добавляется на форму(visible = false), а второй уже когда visible = true. А потом Происходит Paint
Я думаю тебе подойдет последнее в обоих случаях. Проверяй Visible и выполняй код.
PM MAIL   Вверх
CyraxZ
Дата 27.6.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



По поводу Dispose: почему наследуемые события не отображаются в Property Window ?

А что касается VisibleChanged, то это событие (у панели) при формировании формы у меня вызывается 2 раза с Visible = false (почему - непонятно) и 3-й раз - с Visible = true.
И не будет ли проблем при использовании этого события, скажем, при перекрытии формы другой формой ?  Ведь в этом случае Visible = true и начинают выполняться действия, которые должны выполняться при закрытии формы/панели...
PM MAIL   Вверх
CyraxZ
Дата 27.6.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



... (не туда напостил)

Это сообщение отредактировал(а) CyraxZ - 27.6.2007, 18:34
PM MAIL   Вверх
CyraxZ
Дата 29.6.2007, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



dsi...
PM MAIL   Вверх
CyraxZ
Дата 29.6.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



Вопрос уже ребром встал. Глюки страшные из-за того, что отписка от событий, при обработке которых перерисовывается панель, происходит после того, как панель деструктурируется. В итоге имеем попытки рисования на панели тогда, когда её уже нет...

Нужно найти или сформировать событие, генерируемое перед уничтожением панели (аналог события закрытия формы)...
PM MAIL   Вверх
tol05
Дата 30.6.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      panel1.Disposed += Alert;  //Вот на него привязывайся
    }

    private void Alert(object sender, EventArgs e)
    {
      Text = "The panel has been disposed";
    }

    private void button1_Click(object sender, EventArgs e)
    {
      panel1.Dispose();
    }
  }



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
emmanuil
Дата 2.7.2007, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



CyraxZ, ты самостоятельно уничтожаешь панель, то как я и говорил, а tol05 показал, используй событие dispose. А если ты не контролируешь этот процесс, то тогда VisibleChanged, в обработчике проверяй существование панели и visible. А если все же не получится выложи этот код, разберемся

Добавлено через 14 минут и 54 секунды
Еще можно деструктор переписать
PM MAIL   Вверх
CyraxZ
Дата 4.7.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



Обсуждение откладывается на месяц (вышел в отпуск... ура...)
PM MAIL   Вверх
mr.DUDA
Дата 11.7.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Чтобы не делать ничего после уничтожения панели или т.п. контрола, достаточно проверить свойство IsDisposed.


--------------------
user posted image
PM MAIL WWW   Вверх
CyraxZ
Дата 1.8.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

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



Цитата

Чтобы не делать ничего после уничтожения панели или т.п. контрола, достаточно проверить свойство IsDisposed.


Чтобы ничего не проверять, лучше делать все дела в обработчике события, которое генерируется до фактического закрытия и освобождения формы, а не после, как Disposed. Тогда не придётся ничего проверять...
В случае с Disposed бывают ситуации, когда событие генерируется прямо перед уничтожением формы/контрола. И в обработчике этого события приходится работать с уничтоженным контролом. Проверка на IsDisposed обязательна...
Собственно, нужно найти событие, которое генерируется до уничтожения формы/контрола.


tol05
По поводу события Disposed.
В хелпе указано:
Код

public delegate void EventHandler(Object sender, EventArgs e);
public event EventHandler NoDataEventHandler;

Тогда почему следующая строка не работает:
Код

this.MainSchemePanel.Disposed += System.EventHandler(MainSchemePanel_Dispose);

а эта - работает:
Код

this.MainSchemePanel.Disposed += MainSchemePanel_Dispose;

Ведь для событий справа от инремента всегда должно стоять приведение к типу соответствующего делегата...
PM MAIL   Вверх
tol05
Дата 2.8.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(CyraxZ @  1.8.2007,  23:08 Найти цитируемый пост)
Тогда почему следующая строка не работает:

код C#    
1:    
this.MainSchemePanel.Disposed += System.EventHandler(MainSchemePanel_Dispose);    

а эта - работает:

код C#    
1:    
this.MainSchemePanel.Disposed += MainSchemePanel_Dispose;

да потому, что нужно писать
Код

this.MainSchemePanel.Disposed += new System.EventHandler(MainSchemePanel_Dispose);



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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