Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45

Как при нажатии мыши по элементу начать выполнять действие?

08.09.2015, 23:06. Показов 2801. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, товарищи
Изучаю windows form, решил соединить с OpenGL, пока все получается (нужно что бы в окне отрисовывалось 2D изображение, простые квадратики, маленький вопрос, возможно ли это можно сделать без участия OpenGL?).
Для соединения создал элемент - окно для OpenGL внутри WindowsForm таким образом:

C++
1
2
3
4
5
6
// cp: объект с параметрами создаваемого окна для OpenGL. Родитель это класс Windows Form
            // Указываю форму в качестве родителя.
            cp->Parent = parentForm->Handle; // Заносит в параметры дескриптор окна, с которым связан элемент управления
            cp->Style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Стили окна
 
            this->CreateHandle(cp); // Создает окно и дескриптор используя указанные в классе параметры
Все работает, кнопки у WF и отрисовка у OGL.

Так вот когда я нажимаю на рабочее окно WF, он реагирует на события мыши, а когда нажимаю на место отрисовки OGL на мышь не реагирует. Я так понял он этого не делает потому что у меня событие мыши обрабатываются только при нажатии на фон окна, а на нажатии на элемент я этого не сделал.
Вопрос: как это сделать? Для фона я просто влазил в свойства формы -> события -> mouseDown, а что делать для этого элемента который был создан не посредствам конструктора?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2015, 23:06
Ответы с готовыми решениями:

Выполнять действие, пока нажата кнопка мыши
Требуется чтобы некий цикл выполнялся до тех пор пока нажата кнопка мыши. Например: Begin Fild:= new PictureBox; Fild.Image :=...

Сделать так, чтобы при двойном нажатии левой кнопки мыши по ссылке происходило некое действие
Мне нужно сделать так, чтобы при двойном нажатии левой кнопки мыши по ссылке происходило некое действие. Код примерно такой: function...

Как выполнять действие только при запросе XHR
Как такое реализовать ?

12
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
09.09.2015, 07:59
Цитата Сообщение от babanty Посмотреть сообщение
что бы в окне отрисовывалось 2D изображение, простые квадратики, маленький вопрос, возможно ли это можно сделать без участия OpenGL?
Можно. В обработчике события Paint
C++
1
2
3
Void MainForm_Paint(Object sender, PaintEventArgs e) {
    e->Graphics->DrawRectangle(Pens::Black, 100, 100, 200, 200);
}
Используется GDI+.
Цитата Сообщение от babanty Посмотреть сообщение
а что делать для этого элемента который был создан не посредствам конструктора?
Всё что вы рисуете на форме - будь то рисование с помощью Graphics или OpenGL, это никаких событий не генерирует (кроме события Paint). Поэтому придётся проверять расположение мыши вручную, если курсор расположен под элементом - то делать что-то. Где расположен ваш квадратик опять же придётся определять вручную, но так как вы сами его рисуете, это не должно стать проблемой.
1
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
09.09.2015, 09:55  [ТС]
tezaurismosis, Спасибо за ответ Тогда попробую в ручную, не подскажете, как можно в с++ вывести в переменные глобальные координаты мыши, а так же ее события? (может быть есть какая нибудь литература? а то все обыскал, только по С# информацию находил)

Кстати не много более полный код, а то какой то не информативный кусок сперва вставил..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public ref class COpenGL: public System::Windows::Forms::NativeWindow //
    { //NativeWindow
    public:
        COpenGL(System::Windows::Forms::Form ^ parentForm, GLsizei iWidth, GLsizei iHeight) // 
        {
            CreateParams^ cp = gcnew CreateParams; // создает класс параметров для создания окна ВФ
            
            cp->X = 0;// =\\=
            cp->Y = 0;// =\\=
            cp->Height = iHeight;// =\\=
            cp->Width = iWidth;// =\\=
 
            cp->Parent = parentForm->Handle; // 
    
            cp->Style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Стили окна
 
            // Create the actual window
            this->CreateHandle(cp); // Создает окно и дескриптор используя указанные в классе параметры
 
            m_hDC = GetDC((HWND)this->Handle.ToPointer());
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
09.09.2015, 10:03
Цитата Сообщение от babanty Посмотреть сообщение
только по С# информацию находил
Информация в основном по C#. Но библиотеки используются те же, поэтому перевести не так сложно.
Цитата Сообщение от babanty Посмотреть сообщение
вывести в переменные глобальные координаты мыши
Первый вариант - обрабатываете событие MouseMove для формы, во втором аргументе лежат координаты
C++
1
2
3
Void MainForm_MouseMove(Object sender, MouseEventArgs e) {
    MessageBox::Show(String::Format("{0}; {1}", e->X, e->Y);
}
Другой способ - Cursor::Position. Это работает в любом месте, не только в обработчике
C++
1
2
auto pos = Cursor::Position();
MessageBox::Show(String::Format("{0}; {1}", pos.X, pos.Y);
1
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
09.09.2015, 12:15  [ТС]
tezaurismosis, первый вариант, как я уже в заголовке темы писал у меня работает, но только для в области WF, а в области OpenGL которая была создана посредствам NativeWindow реакции ни какой нет (так же как например при нажатии на button или label т.к. в их свойствах это не указано). Я могу в свойствах задать реакцию и на нажатие на любые элементы, но для NativeWindow сделанного в ручную нет таких свойств, да и в обще в классе нет реакции на мышь. Пробовал наследовать из лейбла в отдельном классе реакцию на мышь, но ни чего не получилось.

А вот код
C++
1
2
auto pos = Cursor::Position();
MessageBox::Show(String::Format("{0}; {1}", pos.X, pos.Y);
заработал только вот он показывает позицию мыши, а события мыши в Cursor как я понял нет (https://msdn.microsoft.com/ru-... .110).aspx)

Был бы очень благодарен если бы еще подсказали код который реагирует на события мыши
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
09.09.2015, 13:34
Цитата Сообщение от babanty Посмотреть сообщение
а в области OpenGL которая была создана посредствам NativeWindow реакции ни какой нет
А вот это проблема серьёзнее. Тут идей нет. Разве что идти дальше путём WinAPI и отлавливать сообщения от мыши, WM_MOUSEMOVE например.
К сожалению, такого никогда не делал, поэтому конкретнее вряд ли посоветую.
Или можете скинуть проект, я попробую сделать такое.
Чтобы проект влез во вложение форума, удалите из папки файл sdf и запакуйте архиватором.

Добавлено через 1 час 2 минуты
Удалось обработать сообщение от Windows - для этого нужно переопределить WndProc. Ох и помучился я с этим синтаксисом
В коде формы
C++
1
2
3
4
5
6
7
8
9
10
protected: Void WndProc(Message %msg) override {
    // #define WM_LBUTTONUP 0x0202
    if (msg.Msg == 0x0202) {
        void* ptr = msg.LParam.ToPointer();
        int x = GET_X_LPARAM(ptr);
        int y = GET_Y_LPARAM(ptr);
        MessageBox::Show(String::Format(L"{0}; {1}", x, y));
    }
    Form::WndProc(msg);
}
1
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
09.09.2015, 15:32  [ТС]
tezaurismosis, я тоже скоро плакать буду, Ваш код работает в пределах WF, а на OpenGL нет... Подготовил проект, почистил, закомментил, может быть посмотрите? Может я даже просто не туда Ваш код вставил..
Вложения
Тип файла: 7z OpenGL_on_a_Windows_Form ex.7z (1.77 Мб, 2 просмотров)
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
09.09.2015, 18:06
babanty, GLUT не скинете? Никак не могу найти готовые либы с заголовочниками, а компилировать из исходников - долгая песня.
0
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
09.09.2015, 18:43  [ТС]
http://www.swiftless.com/tutor... ivers.html
Там описано куда закидывать, все просто, скачать library; include; dll

Добавлено через 2 минуты
tezaurismosis, Может и Вам OpenGL понравится
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
09.09.2015, 19:20
babanty, посмотрел, скомпилировал, вовне области рисования OpenGL работает, внутри - нет. Пока не знаю, что и предложить. Может, есть средства для перехвата сообщений в самом OpenGL.

Добавлено через 21 минуту
Сейчас мне разбираться в OpenGL нет времени, но вот какая идея - есть функция glutMouseFunc, которая ловит события мыши. Как она именно работает - не разобрался.
Есть какая-то особенность в том, куда её помещать и обрабатывать. Вот код, чтобы понять идею, до рабочего состояния не доведён, к сожалению.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void onMouseButton(int button, int state, int x, int y) {
    LPWSTR str = new wchar_t[16];
    wsprintf(str, L"%d; %d", x, y);
    MessageBoxW(NULL, str, L"Message", MB_OK);
    glutPostRedisplay();
}
 
#pragma region OpenGL
void GUI_create(const char* name, int w, int h) // Создание OGL GUI: имя окна, ширина, высота
{
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // мод дисплея (!) на анимацию GLUT_DOUBLE
    // Вот сюда я вставил glutMouseFunc, но она не срабатывает. Нужно в другое место
    glutMouseFunc(onMouseButton);
    glutInitWindowSize(w, h); // указание высоты и ширины окна
                              //glutInitWindowPosition(100, 100); позиция GUI
    glutCreateWindow(name);  // создание окна
    glClearColor(0.0, 0.0, 0.0, 1.0);  //цвет фона
    glMatrixMode(GL_PROJECTION); // ?
    glLoadIdentity(); // ?
    gluOrtho2D(0, w, 0, h); // оригинальная область, в которой все рисуется (для увеличения и уменьшения экрана)
}
0
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
09.09.2015, 22:34  [ТС]
tezaurismosis, Большое спасибо за помощь
Тему закрою позже, может что придет на ум
По поводу обработчика событий мыши от OpenGL, то это первое что я сделал, они со всем не совместимы.
Я вот думаю, есть какой то обработчик не зависимый от windows form и OpenGL. Я им пользовался на языке autoit, на сколько я знаю он сделан на WinApi, попробую на нем...
Кстати, я так понял Вы С# знаете? Хотел бы узнать, данную затею может быть на нем было бы проще написать? С++ изучаю всего 2 недели, мне перейти на С# очень легко, я еще ни к чему не привык
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
10.09.2015, 09:15
babanty, изначально OpenGL написан на Си, соответственно лучшая привязка будет именно на нём.
Однако на C# писать, как по мне, одно удовольствие. К тому же, существуют обёртки OpenGL для C#, например OpenTK.
Да и связь Windows Forms и C++ с помощью "расширенного" языка C++/CLI по своей сути - костыль.
Дело ваше, но я бы рекомендовал познакомиться с C# и составить своё мнение о языке.
0
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
15.09.2015, 14:34  [ТС]
tezaurismosis, нашел решение
Написал программу на С# согласно данным урокам:
http://esate.ru/uroki/OpenGL/uroki-OpenGL-c-sharp/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2015, 14:34
Помогаю со студенческими работами здесь

Как сделать действие при нажатии на кнопку
Здраствуйте дорогие форумчане прошу выручить новичка в php ... у меня есть такая кнопку <input type="submit" value=" ...

Действие при нажатии на объект. Как сделать?
Здравствуйте коллеги. Подсткажите пожалуйста как сделать? Вопрос 1 Лежит книга, при нажатии на нее перед игроком на экране...

Выполнять действие при вводе определенных символов в Edit
Здравствуйте. Суть вопроса вот в чем: При написании калькулятора, хочется что бы нажатие клавиши "+" программа воспринимала...

При нажатии средней кнопки мыши, а также при нажатии на ссылки в браузере Firefox открываются рекламные сайты
При нажатии средней кнопки мыши, а также при нажатии на ссылки в браузере Firefox открываются рекламные сайты Антивирус касперского...

Выполнять определенное действие при наведении курсора на элемент управления
привет всем, прошу помочь, у меня возник вопрос как выполнять определенное действие при наведении курсора на допустим кнопку, тоесть при...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru