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

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

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

« : 08-04-2008 13:07 » 

Нарисовал я себе простой контрол.
Рисую в нем рамку.
В конструкторе m_nThick = 1;
Код:
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{

CDC   *dc;
CRect rect;
CPen pen;
      .........
CPoint point, dpoint;

pen.CreatePen(PS_SOLID, m_nThick, m_clrBorderColor);
      .........

dc->DrawRect(&rect, &CBrush(m_clrBgColor));


oldPen = dc->SelectObject((CPen*)&pen);

      .............
dc->SelectObject(oldPen);
}
рисует так как надо.
Хочу при наведении мішки рамка утолщалась:
Код:
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
CRect rect;
GetClientRect(&rect);

if(IsInRect(rect, point))
{
if(m_nThick != 3)
{
                  m_nThick = 3;
Invalidate(FALSE);
}
}
else
{
if(m_nThick != 1)
{
m_nThick = 1;
Invalidate(FALSE);
}
}

CButton::OnMouseMove(nFlags, point);
}
а она становится только толще при наведении, а когда убираю курсор, то ничего не происходит.
если ловить нажатие мышки. то работает.
Код:
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point) 
{
SetStatusColor(m_clrBgColor);
m_nThick = 1;
CButton::OnLButtonDown(nFlags, point);
}
Подскажите, пожалуйста, что не так.
Записан
Джон
просто
Администратор

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

« Ответ #1 : 08-04-2008 14:34 » 

Очень просто. Когда мыш покидает твою кнопку, то его сообщения уже не приходят в твою кнопку. Даже твой тест IsInRect не нужен. Если сообщение пришло - значит "ин рект". Ага

Проще говоря твой код равносилен вот этому:

Код:
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
CRect rect;

if(m_nThick != 3)
{
                m_nThick = 3;
Invalidate(FALSE);
}

CButton::OnMouseMove(nFlags, point);
}
« Последнее редактирование: 08-04-2008 14:37 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #2 : 08-04-2008 15:01 » 

Спасибо большое. А не подскажете, как тогда узнать что она ушла с моего контрола?
Записан
Джон
просто
Администратор

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

« Ответ #3 : 08-04-2008 15:23 » 

Хммм... есть один способ. Для это надо зарегистрировать сообщение мыша MouseLeave. И реагировать на него. НО! Дело в том, что оно не всегда срабатывает. Например, если ОЧЕНЬ БЫСТРО убрать мыша с кнопки.

Поэтому, если есть возможность, то лучше всего реагировать на WM_MOUSEMOVE в родительском окне. Тогда оставляешь свой код, с небольшим изменением:

Код:
void CParentOfMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
CRect rect;
m_wndMyButton.GetWindowRect(&rect);
        ScreenToClient(&rect); // тут не уверен - посмотри в дебаггере значения и сравни их с координатами мыша

// >>>> if(IsInRect(rect, point)) // это что за ф-я? у CRect есть уже ф-я для проверки...
        if(rect.PtInRect(point))
{
if(m_wndMyButton.GetThick() != 3)
{
                        m_wndMyButton.SetThick(3);
m_wndMyButton.Invalidate(FALSE);
}
}
else
{
if(m_wndMyButton.GetThick() != 1)
{
                        m_wndMyButton.SetThick(1);
m_wndMyButton.Invalidate(FALSE);
}
}

_super::OnMouseMove(nFlags, point);
}

Код ессно не тестировал, но думаю идея ясна. Лучше конечно всё засунуть в мембер ф-ю напр ShowHover(TRUE/FALSE) она сэкономит тебе Get/Set:

Код:
void CMyButton::ShowHover(BOOL bShow) 
{
   ...
}

тогда

Код:
void CParentOfMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
CRect rect;
m_wndMyButton.GetWindowRect(&rect);
        ScreenToClient(&rect); // тут не уверен - посмотри в дебаггере значения и сравни их с координатами мыша

        m_wndMyButton.ShowHover(rect.PtInRect(point));

_super::OnMouseMove(nFlags, point);
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 08-04-2008 16:40 » 

Джон, tom4ik85, а есть 100% вариант Улыбаюсь Когда по контролу маузмувнули - запустить таймер на 300...1000 мс и по таймеру проверить - не ушла ли мышь уже с контрола (::GetCursorPos). Если нет таймер тикает дальше, если да - гасим таймер.

Джон, Джон, а что за  _super:: , я почитал мсдн - так и не понял назначение, ведь всегда по имени класса можно мембер вызвать ...
« Последнее редактирование: 08-04-2008 16:44 от Алексей1153++ » Записан

Джон
просто
Администратор

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

« Ответ #5 : 08-04-2008 18:14 » 

Лёш, я тебе никогда не рассказывал, как один товарищ текущее время определял создавая файл, а потом считывая время его создания? Ага "Через попу стеклорезом" (с)

А чем тебе не нравится метод в родителе?

2. __super это очень забавная вещица. В данном случае, я понятия не имею от какого класса наследован родитель. Те по идее я должен был бы написать CDialog::OnMouseMove(nFlags, point); или что-то типа CMyDialog12345::OnMouseMove(nFlags, point); . А __super::OnMouseMove(nFlags, point); позволяет мне не обращать внимание на такие мелочи, ведь будет вызвана ближайшая доступная ф-я базового класса на любом уровне даже тогда когда явно она не видна (сложные случаи интерфейсов и/или шаблонов).
« Последнее редактирование: 08-04-2008 18:20 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 08-04-2008 18:26 » 

метод в родителе не нравится, вообще. А контрол автономно всё делает, чем тебе так не нравится ? ) Не принимается пример со временем Отлично

2 - то есть __super  - это как бызаменитель имени родителя ?
Записан

Джон
просто
Администратор

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

« Ответ #7 : 08-04-2008 19:02 » 

>> не нравится, вообще

Аааааа ну дык.

Ну тогда сделай диалог с... ну скажем 5ю кнопками по твоему 100%-таймерному принципу. Ага И как в водевиле было "Ты всё поймёшь, ты всё увидишь сам" (с) Заодно предусмотри возможность многократного вхождения на кнопку в течении одной секунды. Ага Это так на вскидку.

2. нууу как бы. Если тебе так проще.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 08-04-2008 19:05 » 

Джон, имеются формы с 64000 такими контролами Ага Одновременно на экране - около 320 , всё отлично работает.

по курсору контрол меняет цвет, и остаётся такой шлейф из этого цвета, если мышой мувать ))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 08-04-2008 19:09 » 

многократное вхождение на кнопку - ну и что ? ) Если таймер ещё не сработал, то просто перезапустить, а то и вообще не трогать его
Записан

Джон
просто
Администратор

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

« Ответ #10 : 08-04-2008 19:09 » 

Не верю!!!! ПОкажи. Или ты 64000 разных таймера запускаешь?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

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

« Ответ #11 : 08-04-2008 19:13 » 

Ну вот, шлейф... Грязная работёнка. Перелопачивать кучу ненеужных мессаджей. Задействовать тысячи хэндлов таймеров. Это 100% решение? Я же говорю "через попу стеклорезом"

А вот какие у тебя конкретные претензии к методу в родителе? Он кстати свободен от шлейфов.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 08-04-2008 19:16 » 

Джон, проект на работе )
 Завтра напишу болванку с контролом , так как проект прислать не могу - оно с секретами фирмы Ага

>>64000 разных таймера запускаешь? О нет, ты наверное не понял идею - таймер запускается только тогда, когда мышь двинулась над контролом. Если мышь уехала - таймер через 300мс завянет (KillTimer) , если не уехала - будет раз в 300мс проверять, где курсор. Перезапускаться при этом он не будет - я взвёл флажок, что таймер уже запущен. Если юзер мувает мышь, то контролы, рядом стоящие (это в виде таблицы) по очереди шлейфом запустят по одному таймеру , который так же и подохнет через 300 с большой вероятностью. Даже если двигать курсор по кругу - ну сколько ты максимум таймеров одновременно запустишь ? ) А если это не 300 мс, а 100 ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 08-04-2008 19:18 » 

Джон, шлейф - это для красоты. Тормозов не наблюдается

Ну а поставить такие условия, когда тормоза начинаются - это возможно, наверное, но это же интерфейс, а не вычисляющая программа. Не страшно ) Не устроит - пишите в родителе, пжалста ) По мне, так в родителе - это и будет через стеклорез ))
« Последнее редактирование: 08-04-2008 19:20 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 09-04-2008 04:04 » 

Джон, вот болванка.
один экзешник - таймер 1000мс , другой - 100мс.

контролов 255 - больше визард не дал на форму кинуть Отлично

(у меня использовались контролы, которые на себе дочерние делали, поэтому у меня их и было гораздо больше , но для примера сойдёт и 255 - всё равно на экране не сильно много за раз помещается)

нажимаем тремя пальцами известные кнопки , муваем по контролам и смотрим впухание процессора. Ага

* ctrl1.zip (39.72 Кб - загружено 922 раз.)
« Последнее редактирование: 09-04-2008 04:07 от Алексей1153++ » Записан

Джон
просто
Администратор

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

« Ответ #15 : 09-04-2008 08:35 » 

А код где?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 09-04-2008 08:43 » 

Джон, шас кину. Над кучей Create не ржать - лень делать массив ))) У меня мысль сейчас в другом проекте

(и в самом классе контрола на скорую руку кое что просто забил, чтоб не разбираться)

поиск кода, в который не верит Джон можно начать с обработчика таймера Улыбаюсь
Код:
void CChecksGridStatic1153::OnTimer(UINT nIDEvent) 
{
if(nIDEvent==TrackTimerID)
{
KillTimer(TrackTimerID);

//смотрим, где курсор
POINT pnt;
if(GetCursorPos(&pnt))
{
if(WindowFromPoint(pnt)!=this)
{
m_wCheckTracked_nzb=0;
}
}
Invalidate(0);
}

CStatic::OnTimer(nIDEvent);
}

* ctrl1_PRJ.zip (26.46 Кб - загружено 918 раз.)
« Последнее редактирование: 09-04-2008 09:08 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 09-04-2008 08:49 » 

готово
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 09-04-2008 09:27 » 

забыл пояснить

каждый контрольчик - это "одномерная" горизонтальная таблица, просто сейчас размер задан 1 ячейка. Каждая ячейка - это аналог чек-бокса.

когда курсор двигается над контролом -
Код:
void CChecksGridStatic1153::OnMouseMove(UINT nFlags, CPoint point) 
{
if(GetCheckFromPoint(point,&m_wCheckTracked_nzb))
{
}
else
{
m_wCheckTracked_nzb=0;
}
Invalidate(0);

CStatic::OnMouseMove(nFlags, point);
}
происходит проверка, над какой ячейкой контрола курсор (-> m_wCheckTracked_nzb).
Номер ячейки -  m_wCheckTracked_nzb , но, так как у насчейчас ячейка одна, то "ячейка" == "весь контрол".
Если курсор лесом, то обнуляется m_wCheckTracked_nzb - "курсор не на контроле".
Далее элемент перерисовывается.

В перерисовке: в процессе отрисовки ячеек , проверяется, есть ли ячейка, над которой был недавно курсор
Код:
void CChecksGridStatic1153::PaintElement(CDC *dc,long ldcW,long ldcH)
{
...
...
if(m_wCheckTracked_nzb==ci+1 )
{
//курсор

if(m_wMarkedCell_nzb)
{
dc->FillSolidRect(&chkRect,RGB(255,128,64));
}
else
{
dc->FillSolidRect(&chkRect,RGB(168,211,255));
}

SetTimer(TrackTimerID,TrackTimerTime,0);
}
else
{
//простой фон
dc->FillSolidRect(&chkRect,m_dwdBkColor);//белый фон
}
...
...
там же запустится таймер. Запускается здесь он каждый раз , флажка "поставленности" нет.

в обработчике таймера: таймер останавливается сразу, затем , если курсор не над контролом - обнуляем номер ячейки, над которой мували.

----------------
Всё так путанно изза предназначения данного контрола, а когда надо тупо отследить выход за границу контрола - всё можно упростить
Записан

Джон
просто
Администратор

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

« Ответ #19 : 09-04-2008 09:57 » 

Ок, попозже гляну. Ща времени нет. Кстати, красиво. Ага В принципе вся анимация так и делается, если такая задача поставлена. Ага Тебе надо было ещё fade сделать (чтоб цвет не сразу на белый менялся, а постепенно). Средняя реакция человеческого глаза 0,25 сек.
« Последнее редактирование: 09-04-2008 09:58 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #20 : 09-04-2008 12:00 » 

Спасибо всем огромное. Сделал о оба способа работают Улыбаюсь
Записан
Джон
просто
Администратор

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

« Ответ #21 : 09-04-2008 13:38 » 

Пока читаю сообщения в теме, до кода ещё не  добрался.

Итак:

поиск кода, в который не верит Джон можно начать с обработчика таймера Улыбаюсь

Я не "не верю", в код. Я не верю, что это 100% решение для поставленной задачи.

Вобще-то я не увидел запуска таймера в OnMouseMove... Собственно меня это интересовало.

Когда по контролу маузмувнули - запустить таймер на 300...1000 мс

Ладно будем посмотреть...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #22 : 10-04-2008 08:18 » 

Я попробовал сделать Fade Улыбаюсь
Код:
void CMyButton::OnTimer(UINT nIDEvent) 
{
if(nIDEvent == 1)
{
CPoint p;
GetCursorPos(&p);
if(WindowFromPoint(p) != this)
{
InRect = FALSE;
KillTimer(1);
m_nFade = 0;
SetTimer(3, 150, NULL);
}
else
{
KillTimer(3);
}
}
else if(nIDEvent == 2)
{
if(m_nFade <= 6)
{
UINT temp = 255-5*m_nFade;
m_nFade++;
SetBgColor(RGB(temp,temp,temp));
}
else
{
m_nFade = 0;
KillTimer(2);
}
}
else if(nIDEvent == 3)
{
if(m_nFade <= 6)
{
UINT temp = 225+5*m_nFade;
m_nFade++;
SetBgColor(RGB(temp,temp,temp));
}
else
{
m_nFade = 0;
KillTimer(3);
}
}
CButton::OnTimer(nIDEvent);
}
Но у мня кроме фона рисуется еще прямоугольничек другого цвета
так вот, если уменьшить таймер хотя бы до 25мс, чтоб плавный переход был,
заметно, что перерисовывается все Жаль
И если быстро мышкой водить, то глючит Улыбаюсь
Но я еще придумываю как правильно сделать Улыбаюсь
Записан
tom4ik85
Участник

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

« Ответ #23 : 10-04-2008 09:23 » 

если по срабатыванию таймера 2 и 3 (по входу и выходу мышки) дописать проверку, находится ли она на контроле, то не будет проблем с быстрым перемещение мышки. но все равно осталась проблемка перерисовки всего контрола - заметно мигание.
Я думал, может завести несколько флажков, по которым выполняется перерисовка отдельных форм внутри контрола, но может есть более простое решение?
Записан
Джон
просто
Администратор

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

« Ответ #24 : 10-04-2008 09:58 » 

fade лучше сделать в цикле пошагово с временной задержкой (50-100 мс) и управлением -> остановить цикл при повторном входе мыша в окно.

Чтобы избавится от моргания - надо использовать двойной буфер. Можешь посмотреть в коде у Лёшки. Он там как раз его рализовал. Идея очень простая. Если каждый объект вырисовывать сразу на экран, то получается "моргание", тк все объекты прямоугольные и отрисовыаются по очереди. Выход: сначала рисовать в буфер (в память), а потом результат одним махом отображать на экран.

Кстати я так кода с запуском таймера в OnMouseMove и не видел. Хитрый кот его просто закоментировал. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #25 : 10-04-2008 10:07 » 

У меня так сделано
Код:
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
if(InRect == FALSE)
{
SetTimer(1, 10, NULL);
m_nFade = 0;
SetTimer(2, 1, NULL);
InRect = TRUE;
}
CButton::OnMouseMove(nFlags, point);
}
А у него таймер запускается в PaintElement() по условию, которое меняется в OnMouseMove()
Записан
tom4ik85
Участник

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

« Ответ #26 : 10-04-2008 10:52 » 

Кидаю, что получилось.
Здесь просто убрал background, поэтому не мигает.
Пока не получается нарисовать в одном DC, а потом скопировать результат в другой Жаль
Буду разбираться Улыбаюсь
Таймер, который определяет на контроле ли еще мышка - 10мс
2 таймера для fade по 1 мс. 10 итераций.
По-моему вполне нормально Улыбаюсь
А в цикле с задержкой кажется сложнее будет.
Хотя нужно попробовать.


* MyCtrl_1.rar (6.73 Кб - загружено 947 раз.)
Записан
Джон
просто
Администратор

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

« Ответ #27 : 10-04-2008 11:15 » 

>> 2 таймера для fade по 1 мс. 10 итераций.

Таймер никогда такую точность не даст... У него погрешность 20 мс. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

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

« Ответ #28 : 10-04-2008 11:17 » 

Кидаю, что получилось.

Опять 25, а код где?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #29 : 10-04-2008 11:23 » 

Это не важно получается, потому что отрисовывает быстро.
Ведь такая погрешность будет, если система сильно загружена и сообщения не успевают отрабатываться.
Если я правильно понимаю конечно Улыбаюсь
Даже если он за 200мс (10*20мс) отрисует все равно практически незаметно Улыбаюсь

* temp.rar (11.74 Кб - загружено 891 раз.)
Записан
Джон
просто
Администратор

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

« Ответ #30 : 10-04-2008 15:06 » 

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

Проблема остаётся с реализацией.  Насколько всё надёжно, стабильно, оптимально... То с чем больше всего в будущем возникает проблем.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #31 : 11-04-2008 06:26 » 

Джон, фейд мне был там не нужен ) Основная функция окрашивания была в том, чтобы объяснить юзеру , что этот контрол как-то реагирует на мышь. А именно - это набор чек-боксов.

Цитата
Вобще-то я не увидел запуска таймера в OnMouseMove...
я ж написал выше - именно в этой реализации таймер пускается не в самом маузмуве, а в очередной перерисовке контрола. А инициируется это всё именно в OnMouseMove - через косвенную переменную. А закомментировал потому, что для решения задачи не подошёл вызов именно оттуда )) И сразу хитрый! ))

Но, Джон, твои сомнения то всё же рассеялись теперь, надеюся ? Ага


PS
tom4ik85, согласен с Джоном, у тебя красиво получилось )
Записан

tom4ik85
Участник

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

« Ответ #32 : 11-04-2008 08:18 » 

Спасибо Улыбаюсь
Извините, если оффтоп, но не получается у меня нарисовать в другом контексте, а потом вывести на элемент все вместе Жаль
Код:
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
CDC* dc;
CDC tempDc;
CRect rect(0,0,92,92);
CPen pen;
CPen* oldPen;

pen.CreatePen(PS_SOLID, m_nThick, m_clrBorderColor);
      dc = CDC::FromHandle(lpDrawItemStruct->hDC);
      tempDc.CreateCompatibleDC(dc); // создаю временный контекст на основе имеющегося
      oldPen = tempDc.SelectObject((CPen*)&pen);
      // рисую во временном
      tempDc.SelectObject(oldPen);
tempDc.Rectangle(&rect);
tempDc.Draw3dRect(&rect, RGB(100,100,100), RGB(0,0,0));
      // копирую из временного в мой
dc->BitBlt(0,0,100,100,&DC, 0,0, SRCCOPY);

ReleaseDC(&tempDc);

}
Не выводит ничего на экран.
Подскажите пожалуйста что я не понимаю
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #33 : 11-04-2008 08:34 » 

tom4ik85, там нужно ещё к озушному контексту битмап создать и присобачить

в моём элементе сделано так (кстати, когда то сам Джон и поделился секретом Ага )
Код:
void CMyControl::OnPaint() 
{
CPaintDC dcReal(this);

//теперь определение размеров области плоттера
long ldcW,ldcH;
CRect PlotterRect;
GetClientRect(&PlotterRect);

ldcW=PlotterRect.Width();
ldcH=PlotterRect.Height();
if(ldcW<0)ldcW=0;
if(ldcH<0)ldcH=0;

//создаём в памяти контекст
CDC dcPlotter;
CBitmap bmpMem;

dcPlotter.CreateCompatibleDC(&dcReal);
bmpMem.CreateCompatibleBitmap(&dcReal,ldcW,ldcH);

//крепим картинку к виртуальному девайсу
CBitmap *oldbmpMem=dcPlotter.SelectObject(&bmpMem);

//РИСУЕМ в отдельной процедуре
PaintControl(&dcPlotter,ldcW,ldcH);

//копируем из памяти (dcPlotter) на экран (dcReal)
dcReal.BitBlt(0,0,ldcW,ldcH,&dcPlotter,0,0,SRCCOPY);

//удаляем битмап и виртуальный контекст
dcPlotter.SelectObject(oldbmpMem);
bmpMem.DeleteObject();
ReleaseDC(&dcPlotter);
}

void CMyControl::PaintControl(CDC *dc,long ldcW,long ldcH)
{
//рисуем на dc.
//Точка 0,0 - верхний левый угол.
//ldcW, ldcH - размеры "окна" по вертикали и горизонтали
}

Записан

Джон
просто
Администратор

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

« Ответ #34 : 11-04-2008 08:57 » 

И сразу хитрый! ))

Конечно хитрый. Улыбаюсь) А что? Не так? Ага


Цитата
Но, Джон, твои сомнения то всё же рассеялись теперь, надеюся ? Ага

Сомнения насчёт чего? Что это будет работать? У меня их никогда и не было! Узнавать текущую дату через создание файла тоже работает железно. Можешь попробовать.
Или сомнения по поводу 100% решения для данной задачи? Тут тоже у "лично меня" сомнений не было. Оно таковым не является. Причины я уже перечислял. Ещё только добавлю. Понимаешь, если я делаю контрол (ф-ю, класс...) с расчётом на будущее, то стараюсь делать оптимально, используя принцип разумной достаточности. А не навешивая всё что только возможно "лишь бы работало". Хорошо, когда постоянство гарантировано.
Я тебя вон уже сколько лет знаю, а ты всё ещё 6ой студии не изменил. А у нас спектр задач настолько широкий, что мне приходится работать на 6, 2003, 2005, а теперь уже и 2008 студиях, на как минимум двух системах windows и Vista, с полным набором SDK, DDK, WDK.
Добавляй к С++ ещё C# и задачи от БД до дров. Поэтому я должен быть всегда уверен, что снова используемый компонент был сделан наиоптимальнейшим на данный момент и для данных условий образом. И с этой философией я не родился, а жизнь научила. Причём жёстко.

Поэтому и начинающих хочется предостеречь.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

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

« Ответ #35 : 11-04-2008 09:02 » 

когда то сам Джон и поделился секретом Ага )

Опередил. Ага Я как раз искал. Иногда у меня замки бывают - или я уже это рассказывал, или только хотел рассказать.

tom4ik85, так для справки. Форум у нас очень древний и на нём скоплено такое количество богатств, что воплотить их в яхты, джеты и виллы на Багамах на даёт только их плохая организация. Но для людей умеющих пользоваться поиском они немного приоткрывают свои тайны:

https://forum.shelek.ru/index.php/topic,620.msg52009#msg52009

Так для общей теории почитай. Будт полезно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #36 : 11-04-2008 09:04 » 

Спасибо Улыбаюсь
Записан
Джон
просто
Администратор

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

« Ответ #37 : 11-04-2008 09:06 » 

tom4ik85, кстати. Давай пользу начнёшь приносить? Я ща глянул, Лёшка прав, надо статью сделать. Вот ты свежим взглядом и оцени что не так. Что не понятно, что надо подробней, а что выкинуть. Ок?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 11-04-2008 09:20 » 

Джон, для интерфейса это нормально и оптимально - я так считаю. А таймер на винде будет хоть из какой среды
Записан

Джон
просто
Администратор

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

« Ответ #39 : 11-04-2008 11:02 » 

Лёш, ты сможешь эту оптимальность потом доказывать брызгающему слюной клиенту, у которого "девочки" сидят на WinMe, после того как он пару раз (если сможет) проведёт по такого рода "контролам", каждый из которых создаёт хэндл таймера. У tom4ik85, ещё больше шансов. Ага

Ещё, раз - я не против таймера. Я против таймера, как оптимального решения ЭТОЙ задачи.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 11-04-2008 11:14 » 

ну так была бы под рукой та Me у меня ) Я б проверил. И под 98 интересно было бы прогнать , а под вистой работает - уже проверяли.
Может, таймер и не оптимально, зато объект получился законченным - бери за шкварку и кидай на диалог. И никаких те дум о дополнительном для этого коде в родителе (create не в счёт) Улыбаюсь
Записан

ChaoticCube
ChaoticCube
Помогающий

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


« Ответ #41 : 11-04-2008 12:49 » 

Хм. Есть 100% рабочий способ =)

Есть такое понятие как захват мыши. То есть на мышь ставится стандартный обсервер - и все ее мессаги (пофигу где она находится) шлются нужному окошку.

Если не ошибаюсь функции SetCapture и ReleaseCapture
Записан

Сила ночи, сила дня - одинакого фигня....
Джон
просто
Администратор

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

« Ответ #42 : 11-04-2008 13:25 » 

Лёш, так я про это и говорю. А мне приходится прогонять готовые проги, не только под разными версиями, но и разными конфигурациями, ибо если у клиента не стоит СП4 под w2k, а только СП2 и он счастлив, то мне ещё надо аргументировать, почему ему надо его поставить. Поэтому для меня "сделал как-нибудь лишь бы работало" - непозволительная роскошь. Кстати, история программного обеспечения это тоже наглядно показывает. Как только видишь где-нить "программа работает только на ... при ... и с ..." так и знай - сделано по принципу "не знаю как у вас, а у меня всё работает зашибись".

А подобные ошибки очень болезненны. Представь ситуацию: уже всё сделано, проверено, отлажено, продано. Всё работает. И вдруг БАЦ!:

- Ваша программа не запускается.
- А какая у вас система?
- NT4.
- Аааа ну дык. Поставьте винь2000.
- На 600 рабочих мест? Да и железо у нас старое, 2000 не тянет. Да и останавливать производственный процесс даже на один день стоит ....

...

В итоге всё сводится к ошибке программы и надо переделывать. Бесплатно. Вернее не бесплатно, но за свой счёт. Тк никто не заставлял использовать "старый надёжный контролл, который у меня прекрасно работал всё время".
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

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

« Ответ #43 : 11-04-2008 13:32 » 

ChaoticCube, вызов одной ф-ции в OnMouseMove родителя - тоже 100% рабочий.
Просто есть люди, которым он ПРОСТО НЕ НРАВИТСЯ. Ага

Кстати, если сравнивать таймер с регистрацие событий мыша, то... надо будет посмотреть, сравнить.

А насчёт капчи... надо подумать. Может быть и так можно сделать. Ща в голове нет всех технических подробностей. Те ты предлагаешь по первому соббщению сразу капчить, а потом проверять PtInRect, как только выходит, делать релиз. Может быть и сработает. Как говорится код в студию. Или я сам потом попробую.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 11-04-2008 13:56 » 

Джон, ChaoticCube, капча это - раз, и всё. А таймер - это гистерезис Улыбаюсь Если, конечно это нужно.

Джон, а как тебе такая мысль: виндовский таймер - лесом. Делаем статическую процедуру для класса контрола и запускаем процесс, который будет выполнять роль общего для всех экземпляров класса таймера, а заодно и менеджера по раздаче "сообщений" - например, контрол попросил через N тактов прислать ему такое то сообщение.
Поток тупо отсчитывает такты , зависая, скажем, при помощи Sleep(20).
Ну мысль, конечно, нуждается в развитии, зато от ОС теперь мало зависит )
Записан

Джон
просто
Администратор

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

« Ответ #45 : 11-04-2008 14:29 » 

Лёш, сразу чтоб ты меня не понял неправильно. У Ме проблема была с количеством одновременно задействованных хэндлов - это 100%. При превышении некоего минимального количества получал вылет проги с ошибкой "недостаточно ресурсов". Таймер конечно же работает на всех.

Насчёт капчи я бы не был так категоричен, я думаю прокатить, НО как я уже сказал - не помню всех технических подробностей. Надо попробовать. Я делал капчу только для нажатия и отпускания мышиных кнопок и drag-n-drop.

Ну, а на самом деле, если уж так очень хочется, то можно сделать гораздо проще. Те способом, по которому актуалиизируются тулбары. Ну типа ф-ю OnUpdateЪЪ все знают, а кто её вызывает? Ага
Есть, есть такая партия, те тфу, что я говорю - конечно же ф-я Ага и имя ей CWinApp::OnIdle

Подставь её вместо твоего процесса и всё. Никаких задержек не надо. Надо только сделать интерфейс или базовый класс для контролов. Зато это будет круто - любой контрол получит возможность делать всё что угодно "автоматически".
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #46 : 11-04-2008 14:35 » 

Джон, так айдл не сможет мягкие переходы делать Улыбаюсь Кстати, вот интересно, как это делается в тех самых плюшевых элементах винды, которые я всегда с ужасом выключаю и привожу к виду классическому ? Улыбаюсь
Записан

Джон
просто
Администратор

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

« Ответ #47 : 11-04-2008 14:50 » 

Так, стоп. Мы про анимацию плюшевых элементов говорим или про фиксирование момента покидания мышом окошка? Я всегда про последнее. Те в условиях задачи требовалось показать hover эффект. Сомневаюсь, что изменение толщины линии с 3х до 1 пикселя и наоборот требует какой-нить анимации. Кстати надо будет тряхнуть стариной и сделать примерчик с MouseLeave. А то... давно это было.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #48 : 11-04-2008 14:55 » 

Джон, я просто попытался скрестить как и определение покидания, так и эффект отрисовки )
Записан

Джон
просто
Администратор

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

« Ответ #49 : 11-04-2008 15:02 » 

Я бы лучше разделил эти два события... Одно управляющее. Другое - свойство самого контрола.
Сделав это по OnIdle ты получаешь управляющий процесс. Что он иннициирует - уже головняки контрола. Как я уже сказал. Это не обязательно должно быть рисование. Это может быть всё, что угодно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 11-04-2008 15:14 » 

Джон, ну, тогда айдл хорошо подходит для определения покидания при помощи GetCursorPos()
Записан

Джон
просто
Администратор

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

« Ответ #51 : 11-04-2008 15:29 » 

Это я имел ввиду. Вопрос только как перекинуть сообщение из Арр в контрол?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #52 : 11-04-2008 15:35 » 

Джон, может статик-мембер класса контрола попробовать использовать, но только этот мембер должен хранить указатели на все созданные экземпляры. Сложновато выходит как-то

Записан

Джон
просто
Администратор

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

« Ответ #53 : 11-04-2008 15:56 » 

Лёш, честно - ща не знаю. Даже не думал. Но тулбары работают без всякой регистрации и пр. Ага Значит можно. Надо разбраться с маршрутами OnIdle. Я с ней не разбирался и ничего не делал. Поэтому с ходу не знаю.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #54 : 11-04-2008 16:08 » 

так тулбарам то они , поди, тупо рассылают извещения
Записан

ChaoticCube
ChaoticCube
Помогающий

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


« Ответ #55 : 12-04-2008 00:19 » 

Капча сделана как раз для этого. Да привязка к операционке будет, конечно же. Но мне почему то показалось что человек не виджеты свои пишет, а именно эмэфсю юзает.

На тему на паренте сделать - способ кривой изначально. Представим что этот контрол завтра надо будет на 1000 диаложков прорисовать - слишком много геммороя - везде добавлять метод. Не говоря уже о том что этот парент может быть в постороннем коде, который менять низзя (ну как внешний компонент приходит и все). Контрол должен быть вещью в себе.

Да и на онИдл занимать системное время - как-то жалко. А если внешнее приложение в onIdle итак делает дофига? - кончится тем что ОnIdle будет вызываться раз в столетие =). Незачем OnIdle грузить без особой на то надобности.

Вообще - мне кажется что дискуссия началась с того что о капче забыли. А счас идет в сторону - "а как бы еще извратится?" =)

Сорри, код писать не буду - просто лень запускать студию дома - а на работе не до того. Но в кратце на вход мышки - захват. Дальше обработка OnMove - и диагностика по координатам. Делается за 5 минут в общем.
« Последнее редактирование: 12-04-2008 00:21 от ChaoticCube » Записан

Сила ночи, сила дня - одинакого фигня....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #56 : 12-04-2008 05:49 » 

ChaoticCube, капча неудобна, когда контролов больше, чем один , а дискуссия идёт не про изврат, а про то, как инкапсулировать в класс контрола определение выхода курсора за границу Улыбаюсь
Записан

Джон
просто
Администратор

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

« Ответ #57 : 12-04-2008 08:39 » 

ChaoticCube, мне кажется ты не совсем понимаешь смысл OnIdle - это как раз сообщение о ничего не деланьи. Ага

Про капчу я тоже так себе это и представил. Руки дойдут - попробую.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #58 : 14-04-2008 10:49 » 

Я попробую с SetCapture и ReleaseCapture сделать.
Чуть позже отпишусь о результатах Улыбаюсь
Записан
tom4ik85
Участник

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

« Ответ #59 : 14-04-2008 11:38 » 

Нормально работает с Capture
Код:
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
if(InRect == FALSE)
{
SetBgColor(RGB(0,255,0));
SetCapture();
InRect = TRUE;
}
else
{
CRect rect;
GetWindowRect(&rect);
ClientToScreen(&point);

if(!rect.PtInRect(point))
{
InRect = FALSE;
SetBgColor(RGB(255,0,0));
ReleaseCapture();
}

}
CButton::OnMouseMove(nFlags, point);
}
Записан
Джон
просто
Администратор

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

« Ответ #60 : 14-04-2008 12:55 » 

tom4ik85, поставь несколько контролов рядышком и поводи через них быстро мышом. Комп нагрузи.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

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

« Ответ #61 : 14-04-2008 13:13 » 

Нагрузил програмкой prime95 и посмотрел - вроде все нормально.
Я по крайней мере не заметил.

* MyCtrl_1.rar (43.41 Кб - загружено 723 раз.)
« Последнее редактирование: 14-04-2008 13:19 от tom4ik85 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #62 : 14-04-2008 14:18 » 

tom4ik85, капча работает с небольшими по размеру конами хорошо. А вот если элемент (скажем плоттер) будет больше чем, скажем, МС-калькулятор, то: двигаем калькулятор над контролом, активируем капчу контрола и паримся, пытаясь нажать на кнопки калькулятора Отлично
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #63 : 14-04-2008 14:22 » 

tom4ik85, а я глюк нашёл.

ты не просто рисуй контрол, ты прямоугольник исходного контрола то подгоняй тоже!

Смотри, если одну из кнопок сделать размером , скажем, 240*240 , то элемент остаётся зелёный, даже если мышь ушла с "элемента", но ещё находится над исходным контролом
Записан

tom4ik85
Участник

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

« Ответ #64 : 14-04-2008 14:46 » 

Это наблюдалось и с другими решениями (таймер и родительское окно).
Там я решал изменяя регион окна отрисовки.
А в этом не получается Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #65 : 14-04-2008 15:16 » 

tom4ik85, сделай так :
Код:
класс_контрола::OnPaint()
{
   bool bNeedMoveWindow=false;
   CRect abs_r;//абсолютные координаты окна контрола
   GetWindowRect(&abs_r);
   if(abs_r.GetWidth()>нужной_ширины)
   {
       bNeedMoveWindow=true;
       abs_r.right=abs_r.left+нужная_ширина-1;
   }
   if(abs_r.GetHeight()>нужной_высоты)
   {
       bNeedMoveWindow=true;
       abs_r.bottom=abs_r.top+нужная_dscjnf-1;
   }
   if(bNeedMoveWindow)
   {
      ::MapWindowPoints(0,pParent,&abs_r,2);
      MoveWindow(&abs_r,1);
      Invalidate(1);//чуть позднее снова будет вызвано OnPaint, но сюда уже не попадём
   }
}

код не прогонял, возможно с глюком.

Можно разместить и не в OnPaint
Записан

tom4ik85
Участник

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

« Ответ #66 : 15-04-2008 10:52 » 

Начал писать статью и не мог не упомянуть про возможность обраротки WM_MOUSELEAVE.
Попробовал, но не заметил чтоб были проблемы с быстрым перемещением. Все нормально отрабатывается.
Может кто-то подскажет или как это увидеть можно или еще какие проблемы с этим способом??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #67 : 15-04-2008 11:14 » 

Поробуй переместить программно курсор с контрола в точку, заведомо лежащую не на контроле, при помощи
 
SetCursorPos
Записан

tom4ik85
Участник

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

« Ответ #68 : 15-04-2008 11:23 » 

нормально отрабатывает
в примере SetCursorPos вызывается по щелчку левой кнопкой мыша

* MyCtrl_1.rar (44.46 Кб - загружено 704 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #69 : 15-04-2008 11:35 » 

не совсем чистый эксперимент , срабатывает только после отпускания кнопки мыши. А если удерживать - то нифига )

Перемести по таймеру, запусти таймер секунд на 5
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #70 : 15-04-2008 11:36 » 

и опять таки разберись с размерами контрола ) Опять "невидимые границы" за пределами рисунка
Записан

Джон
просто
Администратор

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

« Ответ #71 : 15-04-2008 14:30 » 

Начал писать статью и не мог не упомянуть про возможность обраротки WM_MOUSELEAVE.
Попробовал, но не заметил чтоб были проблемы с быстрым перемещением. Все нормально отрабатывается.
Может кто-то подскажет или как это увидеть можно или еще какие проблемы с этим способом??

Для начала надо описать системы, на которых производилось тестирование. Мой опыт когда это не (всегда) срабатывало:

Я делал такое 5 лет назад в 6ой студии, под w2k+SP (PIII 700 MHz) задача была сделать ресурсонезависимый PropertySheet в стиле начальных настроек проекта студии 2003  (слева captions, справа странички). Расстояние между кнопоками было 0. Просто подсвечивалась вся область. В прицепе рабочий прототип (как был). Мне удавалось раньше заставить его НЕ работать. Ща не получается. Жаль (XP+SP2, PIV  2 GHz).

Смутные сомнения... Попробуй поставить контрол на самый край родительского окна приложения и быстро покинь его. Вроде как в этот момент проблемы были.

зы Вобще-то это должен быть самый "родной" способ. Но (не соврать) тогда не у меня одного с этим проблемы были.

* MyWizard.zip (70.36 Кб - загружено 705 раз.)
« Последнее редактирование: 15-04-2008 14:32 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines