Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
7 / 7 / 2
Регистрация: 11.01.2013
Сообщений: 120
1

Пока нажата клавиша

14.04.2016, 17:16. Просмотров 2956. Ответов 12
Метки нет (Все метки)

Приветствую всех.
Просветите пожалуйста как сделать чтобы событие происходило пока нажата клавиша.
Как то типа вот этого:

While (butom.Click)

Пишу на c# mvs 2010
Вот сам код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace CK_Lab2
{
    public partial class Form1 : Form
    {
        Graphics g;
        Pen p;
        Brush b;
        Brush fon;
 
        int xox1, xox2, yox1, yox2, xoy1, xoy2, yoy1, yoy2;
 
        int xc, yc; //Координаты центра
        int xf, yf; //Координаты конца отрезка
        int xe, ye;//Координаты центра элипса
        int r, rf;
        int a = 0;
     
        // x21 = (int)(x11+(x21-x11)*Math.Cos(a)-(y21-y11)*Math.Sin(a));
        // y21 = (int)(y11 + (x21 - x11) * Math.Sin(a) + (y21 - y11) * Math.Cos(a));
 
        void figura(int xcm, int ycm, int xfm, int yfm)
        { 
            xc= pictureBox1.Width/2+xcm;
            yc= pictureBox1.Height/2+ycm;
 
            r = 50;
            rf = 100;
 
            //Вычисление Координат центра элипса
            xe = pictureBox1.Width / 2 ; 
            ye = pictureBox1.Height / 2 ;
 
            for(int i=0; i<8; i++)
            {
              xf=xc + (int)(rf * Math.Cos(a));
              yf=yc - (int)(rf * Math.Sin(a));
               
                 g.DrawLine(p,xc,yc,xf,yf);
                a = a + 35;
            } 
           
            g.DrawEllipse(p, xc - r / 2, yc - r / 2, r, r);           
            
        }
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
            g = pictureBox1.CreateGraphics();
            fon = new SolidBrush(Color.White);
            g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);
 
           
            p = new Pen(Color.Blue,1);
            xox1 = pictureBox1.Width / 2;
            xox2 = pictureBox1.Width / 2;
            yox1 = 0;
            yox2 = pictureBox1.Height;
 
            xoy1 = 0;
            xoy2 = pictureBox1.Width;
            yoy1 = pictureBox1.Height / 2;
            yoy2 = pictureBox1.Height / 2;
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
           g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);      
               
              figura(0,0,0,0);
          
           g.DrawLine(p, xox1, yox1, xox2, yox2);
           g.DrawLine(p, xoy1, yoy1, xoy2, yoy2);
            
        }
 
        private void button1_Click(object sender, EventArgs e) //Вот это надо вызвать пока нажата клавиша
                                                                                   // Или при каждом нажатие
        {
            int xcm = 0;
            int ycm=0;
            int xfm = 0;
            int yfm=0;
 
            g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);
           
           xcm= xcm-1;
           
 figura(xcm, 0, xcm, 0);
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2016, 17:16
Ответы с готовыми решениями:

Если нажата клавиша, то запустить таймер
//button1.Click += delegate { timer.Interval =...

Функция которая проверяет нужная ли клавиша нажата
Доброго времени суток! Нужно написать функию которая проверяет правильная ли клавиша нажата. В...

Как определять, какая клавиша была нажата?
1) как определять, какая клавиша была нажата? 2) как определить время, которое проходит между...

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

12
74 / 65 / 47
Регистрация: 26.03.2015
Сообщений: 205
14.04.2016, 17:45 2
Для этого есть событие button.MouseDown - возникает, когда нажата клавиша. А событие button.MouseUp возникает, когда клавишу отпускают
0
7 / 7 / 2
Регистрация: 11.01.2013
Сообщений: 120
14.04.2016, 18:06  [ТС] 3
Как то вот подробней нельзя?
Был бы очень признателен если с примерами.
0
2 / 2 / 3
Регистрация: 13.10.2012
Сообщений: 120
14.04.2016, 18:12 4
Куда уж еще подробней, сделайте на форме 2 этих события, и проверьте как они работают

C#
1
2
3
4
5
6
7
8
9
 private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            label1.Text = "Нажали";
        }
 
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            label1.Text = "Отпустили";
        }
0
74 / 65 / 47
Регистрация: 26.03.2015
Сообщений: 205
14.04.2016, 18:17 5
Ну вот же
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            int xcm = 0;
            int ycm = 0;
            int xfm = 0;
            int yfm = 0;
 
            g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);
 
            xcm = xcm - 1;
 
            figura(xcm, 0, xcm, 0);
        }
 
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);
 
            figura(0, 0, 0, 0);
 
            g.DrawLine(p, xox1, yox1, xox2, yox2);
            g.DrawLine(p, xoy1, yoy1, xoy2, yoy2);
        }
На самом деле, не до конца въехал в логику вашей программы, поэтому при отпускании кнопки будет то же действие, что и при клике по пикчебоксу. Сами отредактируйте уж)
0
7 / 7 / 2
Регистрация: 11.01.2013
Сообщений: 120
14.04.2016, 18:21  [ТС] 6
Спасибо за ответ.
Логика очень проста, программа просто еще не доработана.
При каждом нажатии или пока нажата клавиша нужно чтобы переменная xcm уменьшалась на 1.
0
74 / 65 / 47
Регистрация: 26.03.2015
Сообщений: 205
14.04.2016, 18:27 7
Цитата Сообщение от koto_fey Посмотреть сообщение
пока нажата клавиша нужно чтобы переменная xcm уменьшалась на 1.
к слову, что это значит? Потому что если вам надо, чтобы пока нажата клавиша переменная уменьшалась, скажем, каждый 100 милисекунд, то это не совсем такой код, как я написал. Мой сработает один раз
0
7 / 7 / 2
Регистрация: 11.01.2013
Сообщений: 120
14.04.2016, 18:40  [ТС] 8
Вот именно.
Мне нужно чтобы переменная уменьшалась пока клавиша нажата, или каждый раз при нажатии.
Может быть не то использую?
Событие button1_click привязано к графической кнопке.
0
74 / 65 / 47
Регистрация: 26.03.2015
Сообщений: 205
14.04.2016, 18:47 9
button1_click вообще уберите тогда. добавьте на форму таймер, и напишите уменьшение переменной и все сопутсвующие действия в обработчик в события timer1.Tick
и напишите
C#
1
2
3
4
5
6
7
8
9
private void button1_MouseDown(object sender, MouseEventArgs e)
        {
           timer1.Start();
        }
 
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
           timer1.Stop();
        }
При нажатии (клике) таймер запуститтся и сразу остановится, переменная уменьшится один раз. при зажатой клавише переменная будет уменьшаться 10 раз в секунду

ПС: вы в следующий раз сразу формулируйте чего вы хотите. Чем точнее ТЗ, тем меньше уточняющих вопрос вы зададите
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
14.04.2016, 18:54 10
Надо событие подправить, добавив его в форму
0
7 / 7 / 2
Регистрация: 11.01.2013
Сообщений: 120
14.04.2016, 19:18  [ТС] 11
Вроде все правельно сделал, но результата нет. Смещается один раз и все.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace CK_Lab2
{
    public partial class Form1 : Form
    {
        Graphics g;
        Pen p;
        Brush b;
        Brush fon;
 
        int xox1, xox2, yox1, yox2, xoy1, xoy2, yoy1, yoy2;
 
        int xc, yc; //Координаты центра
        int xf, yf; //Координаты конца отрезка
        int xe, ye;//Координаты центра элипса
        int r, rf;
        int a = 0;
     
        // x21 = (int)(x11+(x21-x11)*Math.Cos(a)-(y21-y11)*Math.Sin(a));
        // y21 = (int)(y11 + (x21 - x11) * Math.Sin(a) + (y21 - y11) * Math.Cos(a));
 
        void figura(int xcm, int ycm, int xfm, int yfm)
        { 
            xc= pictureBox1.Width/2+xcm;
            yc= pictureBox1.Height/2+ycm;
 
            r = 50;
            rf = 100;
 
            //Вычисление Координат центра элипса
            xe = pictureBox1.Width / 2 ; 
            ye = pictureBox1.Height / 2 ;
 
            for(int i=0; i<8; i++)
            {
              xf=xc + (int)(rf * Math.Cos(a));
              yf=yc - (int)(rf * Math.Sin(a));
               
                 g.DrawLine(p,xc,yc,xf,yf);
                a = a + 35;
            } 
           
            g.DrawEllipse(p, xc - r / 2, yc - r / 2, r, r);           
            
        }
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
            g = pictureBox1.CreateGraphics();
            fon = new SolidBrush(Color.White);
            g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);
 
           
            p = new Pen(Color.Blue,1);
            xox1 = pictureBox1.Width / 2;
            xox2 = pictureBox1.Width / 2;
            yox1 = 0;
            yox2 = pictureBox1.Height;
 
            xoy1 = 0;
            xoy2 = pictureBox1.Width;
            yoy1 = pictureBox1.Height / 2;
            yoy2 = pictureBox1.Height / 2;
 
            
 
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
           g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);      
             
           figura(0,0,0,0);
           
           g.DrawLine(p, xox1, yox1, xox2, yox2);
           g.DrawLine(p, xoy1, yoy1, xoy2, yoy2);
            
        }
 
          private void timer1_Tick(object sender, EventArgs e)
        {
            int xcm = 0;
 
            g.FillRectangle(fon, 0, 0, pictureBox1.Width, pictureBox1.Height);
            g.DrawLine(p, xox1, yox1, xox2, yox2);
            g.DrawLine(p, xoy1, yoy1, xoy2, yoy2);
 
            xcm  --;
            figura(xcm, 0, xcm, 0);
            
        }
 
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
        
            timer1.Start();
 
        }
 
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            timer1.Stop();
        }
 
       
         
       
 
    }
}
0
74 / 65 / 47
Регистрация: 26.03.2015
Сообщений: 205
14.04.2016, 19:20 12
Лучший ответ Сообщение было отмечено koto_fey как решение

Решение

Вы при каждом тике таймера создаете новую переменную int xcm = 0; и уменьшаете эту новую переменную. вынесите объявление переменной за пределы таймера
1
7 / 7 / 2
Регистрация: 11.01.2013
Сообщений: 120
14.04.2016, 19:25  [ТС] 13
Спасибо!!!
Все работает. Да и правдо.
И тогда тоже видимо из-за этого не работало.
Видимо поздно, голова не варит.
Еще раз спасибо!
Как говориться "А ларчик открывался просто".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2016, 19:25

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

Перекрасить кнопку пока она нажата
Возможно ли как то сделать, что пока будет нажата кнопка на форме - у нее будет иной цвет?...

Выполнять операции, пока зажата клавиша
Извините за много текста!) Здравствуйте дорогие форумчане! Давно вас читаю, пользуюсь форумом,...

Не получается изменять местоположение объекта, пока мышь нажата
Я хотел написать программу, в которой рисуется орбита Земли и сама Земля. Причем землю можно будет...

Реализовать выполнение метода в фоне до тех пор пока не нажата кнопка стоп
Здравствуйте) Подскажите пожалуйста какой класс использовать для создания потока или может есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.