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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог LockWindowUpdate(VCL) в .Net, запрет перерисовки компонента 
V
    Опции темы
HCman
Дата 24.4.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть собственный контрол, в определенный момент времени, в нем передочиваются его дочернии (внутреннии) контролы и при этом происходит жуткое мерцания самого контрола. Можно ли от этого избавиться?
PM MAIL   Вверх
XavierElf
Дата 24.4.2007, 09:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);


--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
HCman
Дата 24.4.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вставил это в конструктор своего контрола, непомогло :-(
PM MAIL   Вверх
XavierElf
Дата 24.4.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



От кого наследуешь свой контрол?
Покажи код своего метода Paint.
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
HCman
Дата 24.4.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



"Свой Paint" не писал ;-) А наследую от обычного UserControl.

PM MAIL   Вверх
XavierElf
Дата 24.4.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(HCman @  24.4.2007,  09:56 Найти цитируемый пост)
"Свой Paint" не писал ;-) А наследую от обычного UserControl.

Интересно, а где производится отрисовка контрола?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
HCman
Дата 24.4.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



т.е.? У меня в контроле есть несколько внутренних контролов, по нажатию на один из них, они перепридочеваются в области родительского контрола. Зачем мне реализовывать свою прорисовку я не понимаю.
Мне нужно просто залочить(заблокировать) данный компонент на прорисовку, т.е. аналогично VCL:
Код

  LockWindowUpdate(UserControl.HWND).

а в дальнейшем 
Код

  LockWindowUpdate(0).


В .Net нашел BeginUpdate и EndUpdate, но они только у некоторых контролов, от которых я не наследуюсь, и не особо ходел бы наследоваться.


Это сообщение отредактировал(а) HCman - 24.4.2007, 10:08
PM MAIL   Вверх
XavierElf
Дата 24.4.2007, 10:31 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



По моему правильнее будет сделать что-то вроде:
Код

public class MyReadyControl : ...
{
   SubControl control1;
   ...
   public MyReadyControl()
   {
      control1 = new SubControl();
   }

   public override bool Paint(Graphics g, RectangleF boundingRect)
   {
      RectangleF control1rect = boundingRect;
      control1.Paint(g, control1rect);
      return true;
   }
   ...
}

public partial class MyControl : UserControl, IDisposable
{
   MyReadyControl ctrl;
   ...
   public MyControl()
   {
      ctrl = new MyReadyControl();
      ctrl.Invalidated += MyControl_Invalidated;
      InitializeComponent();
      this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
   }

   protected override void OnPaint(PaintEventArgs e)
   {
      RectangleF rect = this.ClientRectangle;
      rect.Height--;
      rect.Width--;
      ctrl.Paint(e.Graphics, rect);
      base.OnPaint(e);
   }
...
}

По крайней мере я так делал, когда было нужно.
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
HCman
Дата 24.4.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, но такое мне не подойдет. Нужно именно запрет прорисовки в определенный момент. Идельно былобы если бы работал код:
Код

this.BeginUpdate();
SubControl1.Dock = DockStyle.Top;
SubControl2.Dock = DockStyle.Top;
SubControl3.Dock = DockStyle.Top;
SubControl4.Dock = DockStyle.Fill;
SubControl5.Dock = DockStyle.Botton;
SubControl6.Dock = DockStyle.Botton;
this.EndUpdate();

Вот только нужны аналоги BeginUpdate/EndUpdate, или хотя бы способ их реализации.
PM MAIL   Вверх
mr.DUDA
Дата 25.4.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



HCman, поищи на форуме .NET по ключевому слову WM_PAINT, я давал пример как заблокировать отрисовку.


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


Новичок



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

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



Помог код
Код

        const short WM_PAINT = 0x00f;
        public bool _Paint;

        protected override void WndProc(ref Message m)
        {
            if(m.Msg == WM_PAINT)
            {
                if(_Paint)
                    base.WndProc(ref m);
                else
                    m.Result = IntPtr.Zero;
            }
            else
                base.WndProc(ref m);
        }

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

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


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

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


 




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


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

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