Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth

Цитата:
Надо сделать так что бы при удержании кнопки нажатой непрерывно выполнялось какое то действие до момента отпускания этой кнопки.  

ИМХО ерунда, правда это можно попробовать сделать через WM_DRAWITEM у кнопки при отрисовки смотреть нажата она или нет и делать событие, но тут наверное лучше создавать поток (чтобы не стопорить отрисовку) и смотреть, если поток не запущен, то запустить иначе ничего не делать, а если стиль стал кнопка отпущена - то убить поток.

Цитата:
А что значит "не факт что каждому дауну будет соотв ап."? Это в каких случая?  

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

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

Да, иначе достаточно геморрно все это отслеживать. В принципе тут есть пользовател Maks(не помню цифры) он маньячится по сабклассингу, при этом очень красиво реализует. Так вот он через указатели хранит нужные данные у самого контрола. НО ИМХО собственный класс удобнее.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:17 12-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
С WM_DRAWITEM не удобно. приходится кнопку отрисовывать всегда, а мне не нужна видоизменять кнопку, надо только событие нажатия/отжатия ловить. И почему все таки не получается использовать BN_PUSHED/UNPUSHED?

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 11:28 12-10-2009
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth

Цитата:
И почему все таки не получается использовать BN_PUSHED/UNPUSHED?

А MS и не обещала, что они будут работать в 32-разрядных программах. Я же приводил цитату из MSDN про "only for compatibility with 16-bit versions of Microsoft Windows".
 


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 16:58 12-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
 
Вот MS удоты!!!
 
Тогда такой вопрос: а можно сделать так что бы с использованием BS_OWNERDRAW, в WM_DRAWITEM не рисавать свою кнопку а каким то образом вызывать стандартную картинку для данного действия, что бы как можно больше упростить данную процедуру?

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 23:27 12-10-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth
DrawThemeBackground(ButtonTheme, MyHdc, BP_PUSHBUTTON, NewStylte, MyRect, nil);
либо
 DrawFrameControl(MyHdc, MyRect, DFC_BUTTON, OldStylte);
в зависимости манифест используется или нет.
 
Просто сама по себе идея выполнять что то пока нажата кнопка не удачная, так как по хорошему при этом происходит блокировка отправки след событий, что чревато.
И еще - сколько я уже программлю, ни разу не встречал подобных условий задачи.
 


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 13-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Открою карты, мне нужны эти события для коммуникационной программы управления внешними приводами (эл. двигатели) через COM порт. А смысл в том что пока держишь кнопку сигнал поступает и двигатель работает, отпустил кнопку - стоп.
Если есть идеи как реализовать замысел, я с удовольствием выслушаю.

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 03:02 13-10-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth
Ну тады единственно правильный вариант, чтобы не было проблем.
Делаешь сабклассинг кнопки (обойдемся без BS_OWNERDRAW). Ставишь обработчик на WM_LBUTTONDOWN (Up нам не нужен, почему будет ясно дальше). В обработчике запускаешь свой код (мой совет, создавай поток, это самое грамотное решение).
В основной оконной функции ловишь WM_COMMAND с айдишником своей кнопки (это означает, что кнопку нажали и отпустили). В этом событии делаешь TerminateThread потоку.
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.
Хотя в принципе можно и это отловить через SetCapture ReleaseCapture. Если понадобится код дам.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:29 13-10-2009
xterm

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth
Может я ошибаюсь (уже давно напрямую с API не работаю), но если вдруг пользователю вашей программы придёт в голову нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт, и двигатель будет продолжать работать. На button down надо сделать capture mouse, кажется, и ловить отпускание кнопки. Надеюсь, ShIvADeSt меня поправит, если я не прав.
 
PS. Я ещё и читал невнимательно, это уже обсуждалось...

Всего записей: 96 | Зарегистр. 23-08-2009 | Отправлено: 04:51 13-10-2009 | Исправлено: xterm, 05:09 13-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Я примерно так же и думал отлавливать отжатие...  
Я вот думаю, а стоит ли создавать поток? В принципе никаких других действий, кроме как циклической посылки пакетов в компорт, производиться не будет. А сама по себе работа с компортом ведется в асинхронном режиме, там и так свой поток...
 
xterm
 
Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 05:03 13-10-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth

Цитата:
Как сказал ShIvADeSt отжатие будет фиксироваться в WM_COMMAND как простое BN_CLICKED.

не совсем так, если сделать вот так

Цитата:
нажать на кнопку и увести курсор мыши за её границы, и там отпустить, то button up не придёт

то события BN_CLICKED не будет (я про это писал
Цитата:
Я не думаю, что пользователь будет левыми способами релизить кнопку, так чтобы событие BN_Clicked не наступило.
)
то есть если просто нажать и потом отпустить, то все ок. Иначе Set (Release) Capture.
Если подобные случаи возможны, то дам код.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:19 13-10-2009
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
В этом событии делаешь TerminateThread потоку.
Мда... Более вредного совета на примете нет?

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 08:37 13-10-2009
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth
И надо ещё не забыть, что с кнопками можно и с клавиатуры работать, а не только мышкой.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 08:49 13-10-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Мда... Более вредного совета на примете нет?

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

Цитата:
И надо ещё не забыть, что с кнопками можно и с клавиатуры работать, а не только мышкой.

Согласен, надо добавить по хорошему WM_CHAR и WM_KEYDOWN (хотя у чара только на момент отпускания срабатывает).

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:59 13-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Невероятно но факт!
Сделал проект, с вкладками и кнопкой. Создал сабкласс для кнопки, ловлю WM_LBUTTONDOWN на кнопке, увожу курсор с кнопки, отжимаю клавишу мыши, и сабкласс кнопки ловит WM_LBUTTONUP! И это вне зависимости в какой части экрана я отпустил кнопку мыши.

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 18:04 13-10-2009 | Исправлено: peacedeth, 18:54 13-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Решил сделать управление с клавиатуры, но никак не могу поймать сообщение о нажатии клавиш. Сообщения  WM_KEYDOWN не приходят не в одну процедуру-обработчик (ни в оконную, ни в процедуру диалога). Ловится только процедурой обработаки сообщений кнопки (которую сделал сабклассингом)  когда фокус стоит на какой нибудь из кнопок.
 
У меня в окне несколько вкладок. Каждая вкладка диалог имеющий свою процедуру. Как ловить сообщения о нажатии клавишь в каждой вкладке по отдельности?

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 00:39 14-10-2009 | Исправлено: peacedeth, 00:39 14-10-2009
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth

Цитата:
Каждая вкладка диалог имеющий свою процедуру. Как ловить сообщения о нажатии клавишь в каждой вкладке по отдельности?

Диалог модальный или немодальный?
Если модальный - делать ему сабклассинг. Если немодальный - ловить в цикле опроса очереди сообщений до вызова IsDialogMessage.
А зачем такие сложности?


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 01:15 14-10-2009
peacedeth

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
 
Немодальный. А почему я нигде не могу поймать нажатие клавиши, даже в оконной процедуре?

Всего записей: 12 | Зарегистр. 28-02-2007 | Отправлено: 02:26 14-10-2009
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Если необходимо моментально прервать работу потока, то я другого способа не знаю.
Моментально необязательно. Человеческие пальцы не будут работать с той точностью, чтобы десятки или сотни миллисекунд играли роль. Немоментальные - это не прибить поток, а попросить его завершиться. Решений куча, от банального volatile флага, периодического опроса объектов синхронизации (ИМХО лучший выбор в подавляющем большинстве случаев), приостановка потока с последующим возобновлением вместо разрушения с дальнейшим созданием нового, итп.
TerminateThread() плохо хотя бы тем, что после ~2000 запусков-прибитий, а скорее даже раньше, у процесса кончится виртуальная память (а у винды - возможно, свап, а если и не кончится, то раздуется, правда, не на 2Гб, поменьше). Плюс поток за собой ничего не чистит, даже деструкторы объектов на стеке не отработают. И весь этот мусор остаётся с процессом, пока он сам весь не кончится.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 03:49 14-10-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
Согласен со всем этим, но так как от вопрошающего так и не увидел надо моментально или нет, то предложил этот вариант.
Будет уточнение - будет конкретизация.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:28 14-10-2009
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
peacedeth
WM_KEYDOWN диспетчеризуется в IsDialogMessage по логике работы диалога. Потому надо ловить его до того.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 10:01 14-10-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru