Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Размещение картинки с событиями OnClick, OnMouseOver, клик правой кнопкой  (Прочитано 37064 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 21-01-2008 19:43 » 

Подскажите плз, возможно ли в Visual C++ (Microsoft Visual Studio 2005) вставить картинку в окно, чтоб она поддерживала такие события как:

1. Клик левой (нужно открытие второго окна)
2. При нахождении курсора мыши над картинкой (нужен показ информации об объекте, над которым в данный момент находится курсор мыши)
3. Клик правой (произвести некоторые действия с переменными главного окна и убрать картинку с окна)

В учебнике кнопка-картинка была реализована через CBitmapButton, но там у неё 4 состояния тогда возможны и связана с BITMAP изображением через "IMAGX","IMAGF","IMAGU","IMAGD" -если не ошибаюсь. Слишком сложно, и не понятно-возможны ли события которые мне нужны выше О_о
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-01-2008 20:26 » 

По идее, в любой Static можно рисовать картинку - и навесить обработку соответствующих событий от static-а. Все описанные события вполне можно тогда отслеживать и обрабатывать.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 21-01-2008 20:27 » 

FallenSoul, а как ты , сам(а), вот блин, забыл sex Улыбаюсь , думаешь
Лично я, не зная ни синтаксиса, ни возможностей твоего апликейшн, думаю что возможно
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 21-01-2008 20:42 » 

По идее, в любой Static можно рисовать картинку - и навесить обработку соответствующих событий от static-а. Все описанные события вполне можно тогда отслеживать и обрабатывать.

Ну я собственно не сомневался что это достаточно мощная программа, чтоб поддерживать столь примитивные события. Вопрос в реализации :\ Не мог бы ты подсказать на примитиве или в каком направлении искать?

FallenSoul, а как ты , сам(а), вот блин, забыл sex Улыбаюсь , думаешь
Лично я, не зная ни синтаксиса, ни возможностей твоего апликейшн, думаю что возможно

Узнать бы как :\
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 21-01-2008 21:08 » 

 как я понимаю здесь вопрос глобальный,
FallenSoul, ты вставляешь некий объект на/в некий "окно", который уже имеет события?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 21-01-2008 21:14 » 

как я понимаю здесь вопрос глобальный,
FallenSoul, ты вставляешь некий объект на/в некий "окно", который уже имеет события?

Я открываю новый проект(Dialog типа),-и всё. Передо мной чистое окно,и я хочу поместить туда картинку фиксированного размера и задать её обработчики событий.
« Последнее редактирование: 21-01-2008 21:16 от FallenSoul » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 21-01-2008 21:19 » 

Создаёшь контрол для битмапа (CStatic) со стилем SS_BITMAP (оно же Type=Bitmap в свойствах контрола), загружаешь битмап и у статика метод SetBitmap смотришь. Обработчики добавляешь, как для любого контрола.

P.S. Единственное, в чём я не уверен - можно ли производить обработку требуемых событий, кроме левого клика, от статика в родителе... Как-то не приходилось это делать. Впрочем, всегда можно найти выход Улыбаюсь
« Последнее редактирование: 21-01-2008 21:37 от Вад » Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 21-01-2008 21:40 » 

Мб я не туда смотрел в учебнике, или не правильно чтото понимал. Что подразумевается под контролом для битмапа?! О_О

Если это Add Variable->На элементе и там категория переменной Control, то что за элемент тогда битмап?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 21-01-2008 22:14 » 

Так. Если делаешь через редактор ресурсов, то добавляешь Picture Control и у него ставишь в свойствах Type=Bitmap. Для него же делаешь Add variable, добавляя к диалогу переменную типа CStatic. Для загрузки битмапа из ресурсов можно воспользоваться классом CBitmap и его методом LoadBitmap, который имеет параметром ID ресурса картинки. В методе OnInitDialog твоего диалога (или где это ещё требуется) для твоей переменной класса CStatic вызываешь метод SetBitmap, куда передаёшь HBITMAP. В принципе, можно напрямую загружать битмап в HBITMAP, но можно и сконвертить CBitmap. Методом GetSafeHandle, по-моему...
« Последнее редактирование: 21-01-2008 22:18 от Вад » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 21-01-2008 22:19 » 

ух-ты, слова-то какие и много...

извините ребята, я не местный, а что  сам битмап, как наследник окна не обладает свойствами окна?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 21-01-2008 22:25 » 

Sla, контрол-то обладает свойствами, но чтобы обработать событие, придётся, наверное, либо свой класс создавать, либо руками вписывать - я тут посмотрел, редактор ресурсов не позволяет обработчики для таких событий к статику из соответствующего диалога (Add event handler) добавлять, по крайней мере в VS 7.1
« Последнее редактирование: 21-01-2008 22:33 от Вад » Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 21-01-2008 22:39 » 

Так. Если делаешь через редактор ресурсов, то добавляешь Picture Control и у него ставишь в свойствах Type=Bitmap. Для него же делаешь Add variable, добавляя к диалогу переменную типа CStatic. Для загрузки битмапа из ресурсов можно воспользоваться классом CBitmap и его методом LoadBitmap, который имеет параметром ID ресурса картинки. В методе OnInitDialog твоего диалога (или где это ещё требуется) для твоей переменной класса CStatic вызываешь метод SetBitmap, куда передаёшь HBITMAP. В принципе, можно напрямую загружать битмап в HBITMAP, но можно и сконвертить CBitmap. Методом GetSafeHandle, по-моему...

Вот 1 в 1 так делается в учебнике-я тоже так сделал, расположил 10 Pict Controlov,-на каждом свой битмап. Однако события которые они позволяют следущие :

NM_THEMECHANGED, STN_CLICKED, STN_DBLCLK, STN_DISABLE, STN_ENABLE.

Пытался мучить STN_CLICKED, STN_DBLCLK -но это не события клика или двойного клика на картинку-чтото другое. Вопрос и был в следующем-можно как-то самому написать, или расположить картинку аналогично в окне но чтоб она поддерживала события первого поста( возможно не через Picture Control).
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 21-01-2008 22:53 » 

Я пока могу только предложить сделать свой класс диалога со стилем Child, и в экземплярах этого диалога рисовать (хошь - в статик, хошь - просто на окно через BitBlt), при этом размер окна согласовывать с размером картинки, и уже в диалоге все события, какие нужны, обрабатывать.
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 21-01-2008 23:03 » 

Я пока могу только предложить сделать свой класс диалога со стилем Child, и в экземплярах этого диалога рисовать (хошь - в статик, хошь - просто на окно через BitBlt), при этом размер окна согласовывать с размером картинки, и уже в диалоге все события, какие нужны, обрабатывать.

Если я правильно понял то на главном окне, у меня будет находиться дочернее которое по размерам = размеру картинки, и "нахождение курсора" над картинкой или "клик" на картинке- на самом деле будут являться событиями этого "маленького" окошка? :\
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 21-01-2008 23:06 » 

FallenSoul, конечно, лично я так думаю,
там родитель, там наследник, повторюсь - я сам не местный
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 21-01-2008 23:08 » 

Спасибо. Пойду спать, завтра отпишусь по поводу полученного.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 22-01-2008 04:11 » 

чтобы ловить все сообщения, надо то всего лишь произвести класс от CStatic а к контролу привязать через визард экземпляр этого класса. И всё буит и даже больше Улыбаюсь
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 22-01-2008 08:12 » 

чтобы ловить все сообщения, надо то всего лишь произвести класс от CStatic а к контролу привязать через визард экземпляр этого класса. И всё буит и даже больше Улыбаюсь

Распиши плз поподробнее, а то я ещё плохо ориентируюсь
« Последнее редактирование: 22-01-2008 08:16 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 22-01-2008 09:05 » 

(только учесть следует, что сижу в студии VC++6, поэтому могут быть небольшие отличия в действиях)

имеется класс CSx , произведённый от CStatic. Кладём на диалог статик-контрол. Задаём ему идентификатор. Потом Ctrl+двойной клик по клнтролу - вписываем имя m_.... переменной (как всегда , стоЮ на мнении, что проще и надёжнее задавать имя как m_<идентификатор контрола>)  , ниже в окошке "Category" выбираем Control , а ещё ниже - название класса CSx . Также не забыть в заголовок диалога включить заголовок с описанием класса CSx
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 22-01-2008 09:24 » 

1. Add Class. Имя CSx, Base type: CStatic. Добавил
2. Поместил на диалог Pict Control, ID=ID_STATIC1.
3. Добавляю переменную, имя m_image, тип Control,-а класса там нет. :\ Или я чтото не так делаю?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 22-01-2008 10:02 » 

Лёш, недавно только было где-то. Покажи ему - я уже не помню где. Чел абсолютно забил на теорию и про notification и слышать не хочет. Клики через них сделает, а курсор - надо HitTest делать в OnSetCursor.

На больше времени нет.

В 2005 делается просто - в свойствах кликаешь на плюсик рядом с нужным IDC  в списке выбираешь нужные нотификации - всё.

А MSDN всё-таки читать надо - это элементарные вещи.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 22-01-2008 10:08 » 

В 2005 делается просто - в свойствах кликаешь на плюсик рядом с нужным IDC  в списке выбираешь нужные нотификации - всё.

Кликаю, но там всего 5 событий, и среди них нет клика, двойного клика, клика правой, нахождения курсора над объектом
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #22 : 22-01-2008 10:52 » 

Клик среди них есть. Остальные - учи мат.часть - ключевое слово NOTIFICATION. Курсор надо объектом... тоже можно замутить - только сложнее, надо зарегистрировать эти события для твоего окна. Только зачем? Чем тебе OnSetCursor не подходит? Или ты вобще элементарный ToolTipCtrl имеешь ввиду?

А вобще, ты начинаешь с конца и ждёшь решения - сформулируй свою задачу. Какой именно контрол тебе нужен? Может проще свой сделать? С CWnd.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 22-01-2008 11:02 » 

Клик среди них есть. Остальные - учи мат.часть - ключевое слово NOTIFICATION. Курсор надо объектом... тоже можно замутить - только сложнее, надо зарегистрировать эти события для твоего окна. Только зачем? Чем тебе OnSetCursor не подходит? Или ты вобще элементарный ToolTipCtrl имеешь ввиду?

А вобще, ты начинаешь с конца и ждёшь решения - сформулируй свою задачу. Какой именно контрол тебе нужен? Может проще свой сделать? С CWnd.

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

Задача моя такая: Хочу иметь на главном окне "пустую картинку", нажатие на которую вызовет окно в котором будет список объектов, выбрав один из которых его картинка заменит пустую картинку. При нахождении курсора над картинкой объекта, чтоб выводилось "окно подсказка" с параметрами этого объекта; Когда курсор покинул пределы картинки-подсказка убиралась, а в случае нажатия правой кнопкой на картинке-она убиралась и на её место опять вставала "пустая картинка".

« Последнее редактирование: 22-01-2008 11:06 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 22-01-2008 11:06 » 

Джон, ну , не хотит шлышать - эт уже не в нашей компетенции, так сказать Улыбаюсь

FallenSoul, класс не виден - это , наверное, из шестой студии глюк тянется. Лечится так: в папке проекта мочи файл *.clw  ,  а в студии потом жми ctrl+W и жди, когда все эти окошки закроются. Потом класс появится в списке
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 22-01-2008 11:08 » 

https://forum.shelek.ru/index.php/topic,13720.0.html

тут кое что подобное было
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 22-01-2008 11:40 » 

Если я опять же правильно понял,- мне надо мой объект "картинка" сделать дочерним классом, и как базовый взять тот, который может обрабатывать события которые мне требуются и он их будет получать через notification? :\
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #27 : 22-01-2008 12:29 » new

Лёшка - да именно это, спасибо. Нет времени всё по десять раз переписывать.

FallenSoul, почитай что там про сообщения дочернего окна стоит. Коротко - да ты правильно понял, лучше всего сделать дочерний объект и либо в нём реагировать, либо отправлять родительскому окну нужные тебе нотификации.

При нахождении курсора над картинкой объекта, чтоб выводилось "окно подсказка" с параметрами этого объекта; Когда курсор покинул пределы картинки-подсказка убиралась

Это будет труднее всего (всё остальное просто) копай в сторону trackmouseevent WM_MOUSELEAVE.  Я такое делал, но очень давно - подробности не помню. Возникнут вопросы - помогу.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 22-01-2008 12:59 » 

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

Вот с этого места можно чуть подробнее? Конкретно реализация. У меня есть картинка на окне,-при нажатии правой кнопкой на неё у меня есть 2 опции Add Variable, Add Class. Насколько я знаю, в Add Variable можно связать объект на окне с переменной через которую можно компонентными функциями этого объекта изменять его свойства и значения в коде программы. В Add Class можно ввести class name и выбрать Base Class (CDialog, CDHtmlDialog, CFormView...). -если создать перед этим класс Image допустим с типом CStatic -то он всё равно не отображается в списке. :/


Вот я бы с радостью это нашел в книгах или учебниках, но там докучи всего остального и время на это займёт очень много. Если у тебя есть на примете действительно "хорошие",без углубления в вещи, сложные для понятия новичков, книги по MS Visual C++ или просто Visual C++,- я их с удовольствием прочитаю. Ввиду отсутствия таких я только просмотрел видео с экрана с аудиокомментами по ToolBox и многооконным приложениям,-а как ты правильно сказал, никакой теории у меня(кроме C++ из Borland 3.1) нет
« Последнее редактирование: 22-01-2008 13:19 от FallenSoul » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 22-01-2008 14:29 » 

У меня ща активная 2003, но принцип один, а времени нет.

1. Добавить класс - MFC class -> Даёшь имя и выбираешь базовый класс (СStatic или СWnd)

2. Идёшь в новый класс и добавляешь к нему хэндлы для событий мышки - ПРЯМ В НЕГО.

3. В событиях посылаешь сообщения родителю (как именно какие notification посылаются - смотри MSDN, для пример и просто сообщения подойдут - почитай MSDN про PostMessage)

    GetParent()->PostMessage(MYWND_MSG_RMOUSE, (WPARAM)0,(LPARAM)0);

4. В родителе встраиваешь хендля для  MYWND_MSG_RMOUSE и тд

5. Переопределяешь тип твоего контрола в родителе. Например у тебя была переменная

CStatic m_wndMyPic; -> CMyStatic m_wndMyPic;

В принципе всё.

А лучший источник инфы - MSDN
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines