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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как считать одновременное нажатие нескольких клави, ш? 
:(
    Опции темы
VisualProgrammerNET
Дата 12.2.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



Вот у меня такая тема. При нажатии клавиш направления, нарисованный на форме кружочек перемещается в соответствующем направлении на несколько пикселей. А как сделать так, чтобы кружок мог ходить по диагонали? Т.е. при нажатии одновременно двух клавиш.

smile


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
andrx
Дата 13.2.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


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

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



VisualProgrammerNET !
далеко не идеал, но попробуй хотя бы так :

Код

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace move
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.PictureBox pictureBox1;
        private int xx;
        private int yy;


        private System.ComponentModel.Container components = null;

        public Form1()
        {
            InitializeComponent();
            this.xx = 0;
            this.yy = 0;
        }
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.SuspendLayout();
            // pictureBox1
            this.pictureBox1.BackColor = System.Drawing.Color.Blue;
            this.pictureBox1.Location = new System.Drawing.Point(112, 104);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(8, 8);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // Form1
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.pictureBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
            this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
            this.ResumeLayout(false);

        }
        #endregion

        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

        private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Up:    { this.yy = -1; break;    }
                case Keys.Down:    { this.yy = 1; break;    }
                case Keys.Left:    { this.xx = -1; break;    }
                case Keys.Right:    { this.xx = 1; break;    }
            }
            this.pictureBox1.Top += this.yy;
            this.pictureBox1.Left += this.xx;
        }
        private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            this.xx = 0;
            this.yy = 0;
        }
    }
}

--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
mr.DUDA
Дата 13.2.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


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


Эксперт
****


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

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



Как вариант - использовать API-функцию GetKeyState вкупе с таймером.
PM   Вверх
Ch0bits
  Дата 13.2.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Теперь всё работает! smile На основе кода andrx
Код

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace move
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.PictureBox pictureBox1;
        private int xx;
        private int yy;
        private System.ComponentModel.Container components = null;
        public Form1()
        {
            InitializeComponent();
            this.xx = 0;
            this.yy = 0;
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }
        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.SuspendLayout();
            // pictureBox1
            this.pictureBox1.BackColor = System.Drawing.Color.Blue;
            this.pictureBox1.Location = new System.Drawing.Point(112, 104);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(8, 8);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // Form1
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.pictureBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
            this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
            this.ResumeLayout(false);
        }
        #endregion
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        // Максимальный интервал при двойном нажатии, ms
        private const int MaxInterval = 300;

        private DateTime LastPress;
        private Keys LastKey;

        private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            TimeSpan TS = DateTime.Now - LastPress;
            if (TS.TotalMilliseconds <= MaxInterval && LastKey!=e.KeyCode)
            {
                // Обрабатывает двойное нажатие!
                MessageBox.Show("Двойное нажатие обрабатывается тут!");
                return;
            }
            LastKey = e.KeyCode;
            LastPress = DateTime.Now;
            // Классический обработчик
            switch (e.KeyCode)
            {
                case Keys.Up: { this.yy = -1; break; }
                case Keys.Down: { this.yy = 1; break; }
                case Keys.Left: { this.xx = -1; break; }
                case Keys.Right: { this.xx = 1; break; }
            }
            this.pictureBox1.Top += this.yy;
            this.pictureBox1.Left += this.xx;
        }
        private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            this.xx = 0;
            this.yy = 0;
        }
    }
}

PM WWW   Вверх
andrx
Дата 13.2.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


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

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



Цитата(mr.DUDA @ 13.2.2006, 16:41 Найти цитируемый пост)
Так не пойдёт, т.к. одновременно обрабатывается только 1 нажатая клавиша. Вроде бы, в WinForms нельзя обработать более чем одну клавишу одновременно.


mr.DUDA абсолютно и полностью согласен,
я ведь по сути предлагал перевести проблему в другое "русло" !

Ch0bits, повторюсь, что к сожалению, mr.DUDA абсолютно и полностью прав.
Предложенный код оказывается беспомощным если :
1. Нажать и удерживать кнопку вниз
2. Нажать и удерживать кнопку вправо, удерживая при этом кнопку вниз
3. Отпустить кнопку вправо - ВОТ ТУТ И ВСЕ рисунок замрет на месте

Exception предлагает правильный, но более сложный вариант, зато 100%

Это сообщение отредактировал(а) andrx - 13.2.2006, 19:02
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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