Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Обработчик событий мыши


Автор: okaton 18.9.2007, 17:45
Доброго времени суток. 
Подскажите пожалуйста как мне в обработчике событий мыши textBox (не знаю как точно выразиться)
обратить нажатие кнопки в ноль.
То есть смысл такой у меня на форме textBox он должен быть прозрачный для мыши

Код

private void textBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
            {
               // Здесь надо как-то проигнорировать нажатие
            }
        }


Фокус должен остаться на форме

P.S. кстати можно ли фокус как-то обратить на форму?

По поводу фокуса. У меня на форме размещен textBox (tabstop=false), в свойствах формы события keypress стоит обработчик на enter.
На PreviewKeyDown тоже стоит обработчик который не дает стрелками фокус переместить на textbox. Смысл в том что когда загружаем форму по нажатию на enter должно произойти событие, но если нажать на textbox мышью фокус переместиться на него, обратно уже не получиться и enterОМ можно утыкаться (фокус переместился). Как сделать textbox прозрачный для мыши?

Автор: iad 18.9.2007, 19:43
Код

        public class MyTextBox : TextBox
        {
            protected override void OnMouseDown(MouseEventArgs e)
            {
                return;
                //base.OnMouseDown(e); - убили
            }
        }

Цитата(okaton @  18.9.2007,  18:45 Найти цитируемый пост)
Фокус должен остаться на форме
 а такое бывает? smile 

Автор: okaton 18.9.2007, 20:05
Как это едят?

Не работает

Автор: iad 18.9.2007, 20:19
Цитата(okaton @  18.9.2007,  21:05 Найти цитируемый пост)
Как это едят?
С помощью ООП
Цитата(okaton @  18.9.2007,  21:05 Найти цитируемый пост)
Не работает
Удивишься, работает!

Автор: okaton 18.9.2007, 20:23
Что такое ООП, почему-то у меня не работает (наверно туплю)

я правильно делаю?

Код

private void textBox3_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
            {
                base.OnMouseDown(e);                
            } 
        } 


Код

public class MyTextBox : TextBox
        {
            protected override void OnMouseDown(MouseEventArgs e)
            {
                return;
            }
        }

Автор: iad 18.9.2007, 20:37
Цитата(okaton @  18.9.2007,  21:23 Найти цитируемый пост)
я правильно делаю?
нет. А ООП - объектно ориентированное программирование... Одно из его особенностей -наследование.. Можно наследовать контрол и переопределить его функции. Это:
Код

public class MyTextBox : TextBox
        {
            protected override void OnMouseDown(MouseEventArgs e)
            {
                return;
            }
        }
-пример наследования с блокированием некоторых возможностей предка
сделай textBox3 типа MyTextBox, а не типа TextBox...

Автор: okaton 18.9.2007, 21:04
Может кто-нибуть объяснить мне как решить мою проблему?
Желательно более доступно.

По поводу фокуса. У меня на форме размещен textBox (tabstop=false), в свойствах формы события keypress стоит обработчик на enter.
На PreviewKeyDown тоже стоит обработчик который не дает стрелками фокус переместить на textbox. Смысл в том что когда загружаем форму по нажатию на enter должно произойти событие, но если нажать на textbox мышью фокус переместиться на него, обратно уже не получиться и enterОМ можно утыкаться (фокус переместился). Как сделать textbox прозрачный для мыши? 

Автор: NikeDeForest 19.9.2007, 18:23
ну а если в обработчике события мыши делать установку фокуса на форму?

Автор: okaton 19.9.2007, 20:55
А как? Уменя не получается. Я такого обработчика не нашел.

Автор: Aleksey2007 19.9.2007, 22:33
Попробуй так!
По событию навода курсора мыши MouseMove на TextBox делай его запретным т.е

TextBox.Enabled=false

думаю должно работать

Добавлено через 1 минуту и 50 секунд
И по событиям клика тоже, но такая лобуда столько событий надо обрабатывать но ты попробуй если так очень нужно бывает и не такое!

Автор: okaton 20.9.2007, 10:25
Если так сделать то текст  в TextBox станет серым плохочитаемым, надо подругому

Автор: Experimenter 20.9.2007, 18:49
okaton, последний пост iad'а перечитай, особенно последние две строчки

Автор: okaton 20.9.2007, 20:10
Experimenter,  Я перечитал если честно я не особенно представляю себе что это и как это работает:(( Мне надо поподробней

Автор: Experimenter 20.9.2007, 20:23
okaton, там, где ты объявляешь textbox3, вместо:
Код

TextBox textbox3 = new TextBox();

объяви:
Код

MyTextBox textbox3 = new MyTextBox();

и должно получиться...

Автор: okaton 20.9.2007, 20:29
Experimenter, а где он объявляется (я его не объявлял он сам сгенерировался)? в дезайнере формы такого объявления я не нашел там только так

Код

this.textBox3 = new System.Windows.Forms.TextBox();

Автор: Experimenter 20.9.2007, 20:41
дык перепиши:
Код
    
this.textBox3 = new System.Windows.Forms.MyTextBox();

и где-то выше в Windows Designer (или ниже, не пользуюсь дизайнером, вот ведь беда!)
Код

private MyTextBox textbox3

хотя дизайнер и предупреждает: "Не лазить руками!!!", но с тех пор, как Петцольда почитал, дизайнер меня ни о чем не предупреждает, ввиду того, что он отсутствует.

Автор: tdebugger 20.9.2007, 20:50
Обьясните мне, дураку, что мешает этот обработчик привязать и к текстбоксу...

Автор: okaton 20.9.2007, 20:56
Experimenter, 

Компилятор
Код

this.textBox3 = new System.Windows.Forms.MyTextBox();
 
вроде съел

А вот на
Код

private System.Windows.Forms.MyTextBox textBox3;


ругается
Цитата

The type or namespace name 'MyTextBox' does not exist in the namespace 'System.Windows.Forms' (are you missing an assembly reference?)


Добавлено через 1 минуту и 28 секунд
tdebugger, 

Цитата

Обьясните мне, дураку, что мешает этот обработчик привязать и к текстбоксу...


В каком смысле?

Автор: Experimenter 20.9.2007, 21:14
okaton,  блин, лоханулся
Код

this.textBox3 = new MyTextBox();

вот так надо, без всяких System.Windows.Forms.
Но, как я сейчас убедился, не помогает... Надо еще кучу событий переопределять в MyTextBox (GotFocus, Enter и т.д.)

Автор: okaton 20.9.2007, 21:14
Что-то ничего не получается, что делать?

Автор: tdebugger 20.9.2007, 21:23
С помощью десигнера мы сгенерировали обработчик нажатия кнопки на форме, пускай будет так:
Код

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            this.BackColor = Color.Green;
        }

 , а потом через Proprties->Events textbox'а выбрать этот же обработчик, или я не так и не то понял...

Автор: okaton 20.9.2007, 21:33
tdebugger,  ну не совсем, имеется ввиду вот что:

на форме textbox у которого tabstop=false  и на PreviewKeyDown тоже стоит обработчик который не дает стрелками фокус переместить на textbox.

Смысл в том что фокус переместить можно мышью по щелчку, а вот это как раз и не нужно.

Так вот нужно либо textBox сделать невидимым для мыши (чтобы щелкая по нему фокус не слезал на него с формы)

Либо поставить обработчик на textBox который фокус будет обращать на форму

так делать в моем случае нельзя textBox.enable = false;

Автор: Experimenter 20.9.2007, 21:33
okaton, ну и запарили же мы тебе мозги, гораздо проще все делается, хорошо, что tdebugger меня отрезвил
действительно, надо только:
Код

textbox3.TextChanged += textbox3_TextChanged;

и в обработчике повесить
Код

textbox3.Text = "";

Правда курсор устанавливать все равно можно в текстбоксе.
Вот что бывает, когда не спишь долго, извини!

Автор: okaton 20.9.2007, 21:39
Experimenter, да ладно хотите помочь уже супер!

Только вот у меня на самой форме обработчики весят и мне ни в коем случае нельзя убирать фокус с формы:(, 
обработчики на textBox повесить не вариант

Автор: Experimenter 20.9.2007, 21:53
Для того, чтоб фокус не был в текстбоксе при нажатии мыши, можно перекидывать фокус программно, на ярлык или кнопку
Код

textbox3.GotFocus += new System.EventHandler(textbox3_GotFocus);

       void txtSource_GotFocus(object sender, System.EventArgs e)
        {
            button1.Focus();
        }

Автор: okaton 20.9.2007, 21:58
Experimenter, согласен, но фокус должен остаться именно на форме

Автор: tdebugger 20.9.2007, 22:33
Установил KeyPreview формы в труе и произошло чудо...

Автор: okaton 21.9.2007, 10:22
tdebugger, а ты кроме KeyPreview=true больше ничего не делал, а то у меня чудеса отсутствуют?

Автор: tdebugger 21.9.2007, 22:42
Опять незадача... После установки KeyPreview в true весь клавиатурный ввод транслируется форме , независимо от того, где лежит фокус - разве у тебя не так?

Автор: okaton 21.9.2007, 22:49
tdebugger, так то оно так, но есть меленькая незадача если по текстбоксу щелкнуть то на нем будет мигать курсор (текст можно выделить, правой кнопкой щелкнуть), прям беда какая-то (за совет спасибо, воспользовался). Вот если б можно было хотябы в заблокированом текстбоксе цвет текста нормальным сделать... был бы тоже вариант. 

Автор: tdebugger 21.9.2007, 23:15
 А зачем нужен текстбокс с заблокированным вводом, лабел никак не подходит? 

Автор: tdebugger 22.9.2007, 01:48
У меня появились смутные догадки, что ты калькулятор задумал реализовать. По себе помню - рука  так и тянется текстбокс кинуть, а он там и даром не нужен...

Автор: Experimenter 22.9.2007, 21:45
okaton, все-таки не пойму, тебе просто не нравится, что курсор (каретка) моргает в текстбоксе? Если обработчиком запретить ввод текста, то только это остается... Чтоб убрать мигающую каретку в текстбоксе нужно подтягивать АПИ, пример у меня есть, работает. На VB.NET, правда, но это не проблема.

Автор: okaton 23.9.2007, 11:37
Я не калькулятор пишу. Окно которое я пытаюсь реализовать должно содержать некоторую информацию, лейблы можно сделать, но это долго текста много (и формы потом повторяются, но текст меняется), окно должно быть "элементарным", что бы на нем юзер не мог ничего кроме задуманного сделать, у пользователей могут возникнуть вопросы на которые придется отвечать (и это может продолжаться бесконечно долго). Да и вобще должна быть внутренняя красота программы, а мигающий курсор это не очень красиво (а еще меню возникающее при нажатии правой кнопки мыши).:(

Автор: Experimenter 27.9.2007, 06:50
ну и как, решил вопрос?

Автор: okaton 27.9.2007, 10:00
Experimenter, нет:(

Автор: Experimenter 27.9.2007, 11:40
Цитата

а еще меню возникающее при нажатии правой кнопки мыши

это убирается:
Код

textbox3.ContextMenu = new System.Windows.Forms.ContextMenu();

т.е. пустое меню вешается.
про мигающий курсор чуть попозже.

Автор: okaton 27.9.2007, 12:22
Experimenter, Спасибо большое, супер. Пользуюсь smile 

Автор: Experimenter 27.9.2007, 13:41
Уничтожение каретки по Петцольду:
1. Добавь в юзинги:
Код

using System.Runtime.InteropServices;

2. Добавь в поля класса:
Код

[DllImport("user32.dll")]
public static extern int DestroyCaret();

3. Где нужно, вызови метод:
Код

DestroyCaret();

Или вот так (это уже отсебятина):
Код

textbox3.GotFocus += delegate { DestroyCaret(); };

Однако текст при этом продолжает вводиться, так что нужно еще обработчик на событие TextChanged повесить.

Автор: okaton 27.9.2007, 13:56
Experimenter,  smile ОТЛИЧНО!!!


Цитата

Однако текст при этом продолжает вводиться


у меня ReadOnly = true с этим все в порядке

А случайно нет метода который не позволяет выделять текст?

Автор: Experimenter 27.9.2007, 14:15
Смутно догадываюсь, что на событие MouseMove нужно ответить: textbox3.Select(0, 0);

Автор: okaton 27.9.2007, 14:21
Experimenter, работает, правда как-то не красиво

Автор: okaton 28.9.2007, 19:33
В принципе вопрос считаю решенным, тему закрываю.
Результаты теми или иными способами достугнуты smile 
Выражаю всем огромную благодарность в особенности отдельное спасибо  Experimenter  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)