Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5 / 5 / 1
Регистрация: 11.12.2009
Сообщений: 86

OpenGl и нажатие клавиш

13.05.2010, 08:58. Показов 3664. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте! Есть проблема. Бьюсь и не могу понять.

По нажатию клавиши не происходит никакого действия. А должно происходить движение на определенную постоянную величину объекта в компоненте OpenGlControl:

C#
1
2
3
4
5
6
7
8
9
private void OpenGlControl_KeyDown(object sender, KeyEventArgs e)
        {   base.OnKeyDown(e);
 
            if (e.KeyCode == Keys.A) 
            {   Gl.glTranslated(9,0,0);      // по нажатию кнопки А перемещение на 9 по оси X
                Draw();                          // функция отрисовки фигуры уже перемещенной
            }
           
        }
Почему не происходит перемещения?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2010, 08:58
Ответы с готовыми решениями:

Одновременное нажатие клавиш
Доброго времени суток. У меня такой вопрос - возможно ли как - то обрабатывать событие происходящее при одновременном нажатии 2 и более...

Перехватить нажатие трех клавиш
нужно выдать сообщение по нажатии комбинации клавиш. Нашел на форуме тему где приводится пример нажатия 2ух клавиш, но вот вопрос, как...

Нажатие клавиш в неактивном окне
Здравствуйте. Есть окно, оно не активно. Нужно программно послать нажатие какой-то клавиши, например Пробела, не делая окно активным

6
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
13.05.2010, 20:07
Установи у формы свойство KeyPreview = true;
0
5 / 5 / 1
Регистрация: 11.12.2009
Сообщений: 86
14.05.2010, 18:26  [ТС]
это уже установил в конструкторе формы

C#
1
2
3
4
5
public ImageOpenGl()
{    InitializeComponent();
      ...
      this.KeyPreview = true;
}
а мне надо прописать действия в функции нажатия клавиши _KeyDown для формы или для компоненты OpenGlControl?

свойство KeyPreview я же устанавливаю для формы, а получаеца нажатие происходит для OpenGlControl...

Добавлено через 20 часов 18 минут
ребят, ну посоветуйте хоть что-нить...
0
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
14.05.2010, 21:04
Покажи код
0
5 / 5 / 1
Регистрация: 11.12.2009
Сообщений: 86
14.05.2010, 22:42  [ТС]
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
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;
using Tao.OpenGl;
 
 
namespace WindowsFormsApplication1
{
    public partial class ImageOpenGl : Form
    {   double[,] _Circle = new double[51,2];
        
        public ImageOpenGl()
        {   InitializeComponent();
            OpenGlControl.InitializeContexts();
            Init();
            this.KeyPreview = true;
        }
 
        private static bool Init()
        {   Gl.glShadeModel(Gl.GL_SMOOTH);             // сглаживание граней или GL_FLAT(без сглаживания)
            Gl.glClearColor(0F, 1F, 1F, 0.0F);         // очистка окна черным цветом
            Gl.glClearDepth(1.0F);
            Gl.glEnable(Gl.GL_DEPTH_TEST);      // натсройка параметров OpenGl для визуцализации
            Gl.glDepthFunc(Gl.GL_LEQUAL);       //  ..
            Gl.glEnable(Gl.GL_COLOR_MATERIAL);  //  ..
            Gl.glEnable(Gl.GL_LIGHTING);        //  ..
            Gl.glEnable(Gl.GL_LIGHT0);          //  ..
            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);
            return true;
        }
 
        private void ConstructCircle()
        {   double sinAngel = Math.Sin(2*3.14/50);
            double cosAngel = Math.Cos(2*3.14/50);
            
            _Circle[0,0] = 0.5;
            _Circle[0,1] = 0;
 
            for (int i = 1; i <= 50; i++)
            {   _Circle[i,0]=_Circle[i-1,0]*cosAngel-_Circle[i-1,1]*sinAngel;
                _Circle[i,1]=_Circle[i-1,0]*sinAngel+_Circle[i-1,1]*cosAngel;
            }      
        }
 
        private void Draw()         // отрисовка фона
        {   ConstructCircle();
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glLoadIdentity();
            Gl.glTranslated(0.0, -0.5, -10.0);           // перемещение по оси y и z
            Gl.glColor3d(0, 0.5, 0);
            
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glVertex2d(OpenGlControl.Width/100, -1);
            Gl.glVertex2d(-OpenGlControl.Width/100, -1);
            Gl.glVertex2d(-OpenGlControl.Width/100, -6);
            Gl.glVertex2d(OpenGlControl.Width/100, -6);
            Gl.glEnd();
 
            DrawClouds(-1, -0.7);
            DrawClouds(0.6, 0);
            DrawClouds(4, -0.2);
            DrawClouds(2.2, -1.7);
 
            Gl.glFlush();                   // дожидаемся конца визуализации кадра
        }
 
        private void DrawBallon()       // функция рисования шара воздушного
        {   Gl.glColor3d(0, 0, 0);
            Gl.glBegin(Gl.GL_LINE_LOOP);
            Gl.glVertex2d(0.375, -0.7);
            Gl.glVertex2d(0.625, -0.7);
            Gl.glVertex2d(0.5, -1);
            Gl.glVertex2d(0.25, -1);
            Gl.glVertex2d(0.125, -0.7);
            Gl.glVertex2d(0.375, -0.7);
            Gl.glVertex2d(0.375, -0.5);
            Gl.glVertex2d(0.400, -0.5);
            for (int i = 0; i <= 25; i++)
                Gl.glVertex2d(_Circle[i,0]+0.375,_Circle[i,1]+0.6);
            Gl.glVertex2d(0.350, -0.5);
            Gl.glVertex2d(0.375, -0.5);
            Gl.glEnd();
 
            Gl.glColor3d(0.6, 0.4, 0.2);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex2d(0.25, -1);
            Gl.glVertex2d(0.125, -0.7);
            Gl.glVertex2d(0.625, -0.7);
            Gl.glVertex2d(0.5, -1);
            Gl.glEnd();
 
            Gl.glColor3d(0, 0.4, 0.5);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex2d(0.375, -0.5);
            Gl.glVertex2d(0.400, -0.5);
            for (int i = 0; i <= 25; i++)
                Gl.glVertex2d(_Circle[i,0]+0.375,_Circle[i,1]+0.6);
            Gl.glVertex2d(0.350, -0.5);
            Gl.glEnd();
        }
 
        private void OpenGlControl_Paint(object sender, PaintEventArgs e)
        {   Draw();     // отрисовка фона
            DrawBallon();   // перерисовка воздушного шарика
        }
 
        private void ImageOpenGl_KeyDown(object sender, KeyEventArgs e)
        {   base.OnKeyDown(e);
 
            if (e.KeyCode == Keys.A)
            {   Gl.glTranslated(9, 0, 0);   // смещение шарика вправо на 9 единиц
                DrawBallon();// перерисовка шарика
            }
        }
 
    }
}
0
 Аватар для IICuX
87 / 87 / 26
Регистрация: 04.01.2010
Сообщений: 270
15.05.2010, 02:56
C#
1
2
3
4
5
6
7
8
9
        private void ImageOpenGl_KeyDown(object sender, KeyEventArgs e)
        {   
            if (e.KeyCode == Keys.A)
            {   Gl.glTranslated(9, 0, 0);       // смещение шарика вправо на 9 единиц
                DrawBallon();// перерисовка шарика
            }
            base.OnKeyDown(e);
 
        }
вот так попробуй
0
5 / 5 / 1
Регистрация: 11.12.2009
Сообщений: 86
15.05.2010, 05:07  [ТС]
IICuX, как было, так и осталось =(

ребят, забыл сказать еще: после нажатия на буковку А он долго думает и потом выдает мне "необработанное исключение типа "System.StackOverflowException" произошло в Tao.OpenGl.dll.... Убедитесь в отсутствии бесконечного цикла или рекурсии"

раньше, в предыдущей лабе делал подобное: по нажатию вызывалась функция, которая перемещала объект туда или сюда. и все работало, щас почему-то не хочет... в чем проблема, не знаю.. не может быть в том, что this.KeyPreview = true присваиваю для формы свойство, а функцию нажатия клавиши вызываю для компонента OpenGlControl, в то время как у OpeтGlControl нет такого свойства KeyPreview? О_о
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2010, 05:07
Помогаю со студенческими работами здесь

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

Послать нажатие клавиш неактивному приложению
Знаю можно послать нажатие клавиш активному приложению через System.Windows.Forms.SendKeys(...) А можно как-то послать неактивному? ...

richtextbox программное нажатие клавиш клавиатуры
как в RichtextBox программно нажать клавишу &quot;Right&quot; клавиатуры?

Узнать хэндл окна и отправить нажатие клавиш
Мне нужно отправить текст программе не активирую саму программу у меня есть хэндл программы но нет хэндла текстового поля нужно узнать...

Программное нажатие клавиш с определённым интервалом в браузерной игре
Столкнулся с такой проблемой. Необходимо автоматизировать действие в браузерке. Написал такой код: using System; using...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru