· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Акселераторы :-?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Авг 28, 2003 21:30:29

Проблема эта, как мне кажется, немного нестандартна! А нестандартна потому, что я сверяюсь уже по второй книге и рабочей проге - все равно ничего не работает!!!
Собственно в чем дело:
Решил воспользоваться акселераторами, а не получается ! просто не работают они! Я сейчас буду объяснять, как я делаю, а вы(пожалуйста) поправте где я не прав!
Вобщем создаю я файл ресурсов с меню(как полагается)(в файле не только меню, неподумайте, там и диалоговое окно и .... ну все как полагается):)
...
#define VK_F12 0x7B
...
MENU1 MENU
{
POPUP "Help"
{
MENUITEM "About/t", 105
}
}
...
ACCEL1 ACCELERATORS
{
VK_F12, 105, VIRTKEY, NOINVERT
}
...
Далее в самой программе в разделе DATA указываю
...
TABACC DD ?
NAMACC DB "ACCEL1",0
HINST DD ?
ACC DD ?
...
В разделе кода пишу:
...
START: PUSH 0
CALL GetModuleHandleA@4
MOV [HINST],EAX
PUSH OFFSET NAMACC
PUSH [HINST]
CALL LoadAcceleratorsA@8
MOV [ACC],EAX
...
Затем делаю такой обработчик событий(диалоговое окно у меня немадальное):
...
MSG_LOOP: PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA@16
CMP EAX,0
JE END_LOOP
PUSH OFFSET MSG
PUSH [ACC]
PUSH [NEWHWND] - получил при создании диалогового окна (CreatoDialogParam)
CALL TranslateAcceleratorA@12
CMP EAX,0
JNE MSG_LOOP
PUSH OFFSET MSG
CALL TranslateMessage@4
PUSH OFFSET MSG
CALL DispatchMessageA@4
JMP MSG_LOOP
END_LOOP: PUSH 0
CALL ExitProcess@4
...
В процедуре окна, сообщение при клике на меню Help->About появляется обычное MessageBox сообщение!
Но при нажатии на кнопку F12 НИЧЕГО не происходит! я уже как только не пробовал! в двух(повторюсь) книгах сверял... ничего! помогите!


Дата: Авг 29, 2003 20:55:06

Что ниужели никто не сталкивался с подобной проблемой??
Ну хоть скажите правильно я все сделал???


Дата: Авг 29, 2003 21:02:49

Sergey
Зайди на сайт www.dmkpress.ru и скачай файлы для книги Зубкова "Асма для ..." вроде была реализация...


Дата: Авг 29, 2003 21:24:52 · Поправил: AsmGuru62

Все ли функции возвращают правильные значения?
Может быть LoadAcceleratorA() не может загрузить таблицу?
---
Кроме того, не модальный диалог связан с вызовом
IsDialogMessage()...
---
И ещё: как выглядит сам обработчик.
DLGPROC и WNDPROC - это разные обработчики.
DLGPROC возвращает BOOL, а WNDPROC - LRESULT.


Дата: Авг 29, 2003 21:31:07

KiNDeR
у меня, кстати, ихняя книга какраз таки и лежит под носом! я с ней уже сверялся не один раз просматривал!!
AsmGuru62
да нет вроде таблица грузится я ставил проверку на ноль(типа если ноль то выход!) все нормально работало!

????


Дата: Авг 29, 2003 21:32:41

AsmGuru62
IsDialogMessage()...
У мне до этого был пример из книги я там обработка сообщенийй была как я написал и все работало!! поэтому-то я и застрял!........


Дата: Авг 29, 2003 21:34:17

Sergey
Кинь прогу на мыло, посмотрю, и прогани ее под отладчиком и внимательно просмотри все шаги.


Дата: Авг 29, 2003 21:35:11

т.е. разные обработчики! не хочешь же ты сказать, что все зависит от названия??? :))
У меня просто стандартная процедура! которая обрабатывает сообщения от окна!


Дата: Авг 29, 2003 21:41:57

KiNDeR
Лови! и как раз у меня к тебе будет еще пару вопросов по этой проге! Она у меня, так сказать, первая после теории и ... поэтому может немного смешная и не доделанная! ну да ладно!!
Подскажешь как сделать чтобы в строке эдит (маленькой серой, где ридонли, не ставился курсор)


Дата: Авг 29, 2003 22:12:03 · Поправил: KiNDeR

Подскажешь как сделать чтобы в строке эдит (маленькой серой, где ридонли, не ставился курсор)
Sergey
Сделай ее не активной то есть "дизабле"

И это так, на вскидку...
Функция TranslateAcceleratorA выпониться только тогда когда, диалог закроешь, перенеси ее обработку в процедуру диалога.
Я еще подумаю и скажу...


Дата: Авг 29, 2003 22:20:16 · Поправил: KiNDeR

Sergey
Для функции DialogBoxParam, функцию ShowWindow вызывать не нужно...


Дата: Авг 30, 2003 19:55:11

KiNDeR
Насчет последнего, цитата:
3. Для того чтобы немодальный диалог появился на экране, нужно либо указать у него свойство WS_VISIBLE, либо после создания диалога выполнить команду ShowWindow.
Я бы не указывал эту функцию если бы не прочитал это! ??
И кстати у этого же авнора функция TranslateAcceleratorA тоже используется как у меня в примере..... я же как раз и говорю, что что-то здесь не то! либо авторы ошибаются(причем оба?), либо я косячу... У меня есть еще прога в которой тоже с акселераторами(пример, как раз, из главы с диалоговыми окнами) --- так она работает??!!
Нипайму я ничего.....


Дата: Авг 30, 2003 23:10:01

Sergey
KiNDeR совершенно прав. DialogBoxParam покажет диалог вскоре после WM_INITDIALOG даже без WS_VISIBLE в шаблоне, т.е. ShowWindow лишний раз вызывать не обязательно. Почитайте описание DialogBox и DialogBoxParam.


Дата: Авг 31, 2003 12:29:01

Sergey
Ты прогони свою прогу под отладчиком. И посмотри как она себя ведет. Или поставь бряк на TranslateAcceleratorA и посмотри где прервется, а прервется где угодно только не в твоей программе. Хотя прервется и в тоей, когда диалог закроешь.
Лучше юзай RegisterHotKey вместо акселераторов.
RSDN.RU выдает кучу ссылок на запрос "Акселераторы в диалоге", но там описание только под си. Если интересно, то можешь покопать...


Дата: Авг 31, 2003 17:38:22

Ok!! Спасибо . будем пробовать!
Ну а хоть узнать в чем то причина была можно? другая то прога работает?? только в ней нет ничего кроме кнопки.. может быть это из-за того, что я ставлю СетФокус на строку редактирования??
Не сочтите это за назойливость, просто я хочу разобраться во всем этом! Чтобы в будущем небыло проблем :))

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068