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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не меняется текст control-а? Чего не хватает. 
V
    Опции темы
Mastkir
Дата 30.11.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте smile 
На форме проекта разместил Label. В классе появилось

private System.Windows.Forms.Label label1;


Добавил функцию:

private void OnMouseHover(object sender, EventArgs e)
{
  label1.Text = x.ToString();
  x++;
}


Где x:static int x = 1;

Ну, т.е. хочу считать, сколько раз мышь остановится.

Все должно работать. Но не работает! smile  smile  smile 

Точнее работает самый первый раз, когда мышь остановилась (на контроле пишется 1)
И работает, если в этой функции BreakPoint поставить - программа туда зайдет, значение
label1.Text поменяется и текст на контроле обновится.

В других случаях ничего не обновляется. Почему?

Я и label1.Invalidate() пробовал писать. И Update() - ничего не помогает.


Помогите пожалуйста! Заранее спасибо!  smile 



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


Java-ненавистник :)
****


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

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



Цитата(Mastkir @  30.11.2006,  17:45 Найти цитируемый пост)
В других случаях ничего не обновляется. Почему?

В каких "других"?

MouseHover будет срабатывать только в том случае, если мышь пришла "извне" -- т.е. если ты просто поводил мышью по Label, то ничего не будет. А вот если уведёшь за его пределы, а потом вернёшься -- то сработает.


--------------------
Да. Именно так.
PM   Вверх
Mastkir
Дата 30.11.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Действительно, все именно так. Я думал она иначе работает.

smile  Спасибо.  smile 

Но что тогда использовать вместо OnMouseHover ? 
Мне нужна функция для инспекции объектов на карте: если мышь остановилась, значит пользователь выбрал объект. 

Только нужно, чтобы ему кнопки щелкать не пришлось(MouseClick и т.п.)
MouseMove также не подходит, т.к. тогда будут выбраны объекты, которые пользователь не выбирал, т.е. не остановливал мышь.

PM MAIL   Вверх
mr.DUDA
Дата 30.11.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



На таймере и переменной-счётчике можно сделать: вешаем на Timer (например, с задержкой в 0,1сек) обработчик, в котором проверяем разницу между предыдущим и текущим положением мыши (Cursor.Position), и если разница меньше чем некий порог (например, 2 на 2 пиксела) то увеличиваем счётчик иначе сбрасываем его в 0. При достижении счётчиком значения больше чем N (например, чем 10 - что соответствует 1 секунде для нашего примера), считаем что мышка задержалась над одним и тем же участком контрола, т.е. "остановилась" - и делаем что нужно сделать в этой ситуации.


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


GradVin
**


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

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



Вообщем моно обмануть систему, послав ложное сообщение, и спокойно использовать MouseHover, все что тебе нужно это 
ф-ция SendMessage из User32.Dll, и одна переменная. Дело в том что сама ОС, фиксирует сообщение MouseLeave (как сказал Дрон, когда курсор убегает с контрола, и после чего если обратно зайти на контрол и остановиться, то hover заново заиграет. Ну а мы его возьмем и круто надуем smile ). 

Пример:

Код

using System.Runtime.InteropServices; // Нужен для импорта ф-ции SendMessage

[DllImports ("User32")]
public static extern int SendMessageA (IntPtr hWnd, int wMsg, int wParam, int lParam); // нужна для послания ложного сообщ.

private bool HideLeave = false; // Переменная для того чтобы можно было нормально использовать MouseLeave

// Вообщем твой метод. Дополненный мною:)
private void OnMouseHover(object sender, EventArgs e)
{
  label1.Text = x.ToString();
  x++;
  HideLeave = true;
  SendMessageA (this.Handle, 0x2A3, 0, 0);
  HideLeave = false;
}
// Dark Dragon. 2006. Left Copyright :)

//Теперь чтобы небыло проблем с MouseLeave

private void OnMouseLeave (object sender, EventArgs e)
{
  if (HideLeave == false)
  {
     // Все что тебе нужно от события MouseLeave...
     // Ну а если от MouseLeave тебе ничего ненадо(вообще в программе), то забей на переменную HideLeave.
  }
}


Ну вот и усе. Готово. Hover играет и без выхода курсора за пределы контрола.

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


Шустрый
*


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

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



СПАСИБО за подробные объяснения. 

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

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


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

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


 




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


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

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