Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: C# и переделка контролов  (Прочитано 18113 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 12-10-2006 02:40 » new

Всем привет!

Потихоньку перехожу на C# Ага

В общем создал я свой класс производный от стандартной панели (Panel) и переопределил в нем OnPaint. Все вроде работает хорошо, но при изменении размера формы мой контрол перерисовывается както некорректно Не понял. Если добавить в OnResize формы вызов типа мой_контрол.Invalidate() то все нормально  А черт его знает....
Что нужно переопределить чтобы контрол нормально прорисовывался при ресайзе формы???
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #1 : 09-11-2006 07:11 » 

Привет!
на днях тоже решил узнать  побольше про C#, скачал с сайта книжку "Русская редакция Петцолъд.....".

Там про ресайз написано, что  действительно надо переопределить OnResize (и  OnMove ), и там  вызвать Invalidate().

"Вызов Invalidate() информирует Windows, что клиентская область больше не действительна. В итоге форма получит OnPaint, и вы сможите правильно перерисовать...."
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 15-02-2007 05:56 » 

Странно, такое ощущение что только у нас двоих подобные проблемы
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-02-2007 07:38 » 

Да Улыбаюсь.

Я переопределял OnPAint, но размер формы был статичен. Учту о тонкостях, описанных вами выше.
Записан

ещё один вопрос ...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 15-02-2007 13:39 » 

В общем создал я свой класс производный от стандартной панели (Panel) и переопределил в нем OnPaint. Все вроде работает хорошо, но при изменении размера формы мой контрол перерисовывается както некорректно Не понял. Если добавить в OnResize формы вызов типа мой_контрол.Invalidate() то все нормально  А черт его знает....
Что нужно переопределить чтобы контрол нормально прорисовывался при ресайзе формы???
Попробуй в своём переопределённом ( странно звучит как-то Улыбаюсь override типо так и переводится ?) OnPaint перед своими операциями сначала вызвать OnPaint базового класса.
Код:
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // дальше свою реализацию
}
З.Ы. С Петцолъдом спорить не берусь Улыбаюсь Invalidate()  так Invalidate() Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 15-02-2007 17:41 » 

Invalidate() используется для того, чтобы заставить ОС послать форме сообщение WM_PAINT и другие с ним связанные сообщения. Используется для принудительной перерисовки окна по желанию разработчика - ничего более. Уместность Invalidate определяется тем, какие сообщения посылает ОС окну на разные действий (например, изменение размеров окна), и (главное) в каком порядке.

P.S. И не нужно Петцольда возводить в пророки, а слова его пытаться принимать за абсолютную истину - чай, своя голова должна быть Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
vins
Гость
« Ответ #6 : 15-02-2007 19:03 » 

Можно указать стиль контрола ResizeRedraw

Control.SetStyle(ControlStyles style);
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #7 : 15-02-2007 19:15 » 

P.S. И не нужно Петцольда возводить в пророки, а слова его пытаться принимать за абсолютную истину - чай, своя голова должна быть Улыбаюсь
Хммм... это где же я интересно его в пророки возвёл и принял за абсолютную истину ? Я просто сказал что спорить с ним не намерен, а это не значит что я на него молюсь.
Заработало у человека с Invalidate(), ну и хорошо. И только это я и имел ввиду.
Да и человек спрашивал как сделать чтобы работало, а не как это работает
Но раз уж на то пошло, то извольте :

Использовать также можно и Control.Update() и Control.Refresh(). Все они в итоге посылают форме сообщение WM_PAINT только по разному.

Цитата
Control.Invalidate( ) / Control.Invalidate(bool) / Control.Invalidate(Rectangle) / Control.Invalidate(Rectangle, bool) / Control.Invalidate(Region) / Control.Invalidate(Region, bool)

The bool parameter denotes whether the user wants to invalidate the child controls of the control on which he is calling Invalidate. The Rectangle parameter are the bounds to invalidate and the region parameter is the region to invalidate. All the overloads essentially end up calling one of the RedrawWindow, InvaliateRect or InvalidateRgn functions. If RedrawWindow is called then this may result in a WM_PAINT message being posted to the application message queue (to invalidate the child controls).

The important thing to note here is that these functions only “invalidate” or “dirty” the client area by adding it to the current update region of the window of the control. This invalidated region, along with all other areas in the update region, is marked for painting when the next WM_PAINT message is received. As a result you may not see your control refreshing (and showing the invalidation) immediately (or synchronously).

Control.Update()

Update function calls the UpdateWindow function which updates the client area of the control by sending WM_PAINT message to the window (of the control) if the window's update region is not empty. This function sends a WM_PAINT directly to WNDPROC() bypassing the application message queue.

Thus, if the window update region is previously “invalidated” then calling “update” would immediately "update" (and cause repaint) the invalidation.

Control.Refresh()

By now, you might have guessed what Refresh( ) would be doing. Yes, it calls Invalidate(true) to invalidate the control and its children and then calls Update( ) to force paint the control so that the invalidation is synchronous.
« Последнее редактирование: 07-12-2007 19:46 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 15-02-2007 20:08 » 

Цитата: МОРОЗ
ммм... это где же я интересно его в пророки возвёл и принял за абсолютную истину ?
А я и не тебе P.S. адресовал Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines