Я использую диалог вкачестве главного окна и на нем много кнопок. Нужно также обрабатывать акселераторы на эти кнопки, а как заставить диалоговое окно их обрабатывать я не сообразил. p.s. ассемблер fasm v1.62
может быть акселераторы для меню, а не для кнопок? нужно для начала загрузить таблицу акселераторов invoke LoadAccelerators,hInst, ACC mov hAccel,EAX а потом обрабатывать сообщения от них в msgloop .While TRUE invoke GetMessage,ADDR msg,NULL,0,0 .Break .If !EAX invoke TranslateAccelerator,hWnd,hAccel,ADDR msg .If !EAX invoke IsDialogMessage, hWnd, ADDR msg .If !EAX invoke TranslateMessage,ADDR msg invoke DispatchMessage,ADDR msg .EndIf .EndIf .EndW
может быть акселераторы для меню, а не для кнопок? Вот именно что для кнопок. Вообще-то я пишу калькулятор, т.к. кнопок много то использую диалог вкачестве окна. Насколько я понимаю вы написали код цикла сообщений, но помоему при создании диалога эту работу берет на себя винда. Вообще-то у меня была мысль как это сделать, но пока не получилось. Использовать шаблон диалога как шаблон класа?
marlboro попробуй установить WH_MSGFILTER и вызвать TranslateAccelerator() из ловушки P.S. я вообще-то по гуевым интерфейсам не спец, так что могу ошибаться
Нет разницы для чего акселераторы. Они вообще не знают для чего они. TranslateAccelerator отлавливает сообщения WM_KEYDOWN и WM_SYSKEYDOWN и преобразует их в WM_COMMAND и WM_SYSCOMMAND (если есть соответствующий акселератор). Ты используешь DialogBoxParam? Если используешь CreateDialogParam, то все как и при CreateWindowEx. Для DialogBoxParam'а намного сложнее. Можно сделать так: proc DlgProc,hwnd,umsg,wparam,lparam msg MSG enter cmp umsg,WM_KEYDOWN je translate_accel cmp umsg,WM_SYSKEYDOWN je translate_accel cmp umsg,WM_COMMAND jne default invoke MessageBox,[hdlg],'Акселератор сработал','Инфо',0 jmp finish default: xor eax,eax return translate_accel: mov eax,[umsg] mov [msg.message],eax mov eax,[hdlg] mov [msg.hwnd],eax mov eax,[wparam] mov [msg.wparam],eax mov eax,[lparam] mov [msg.lparam],eax lea eax,[msg] invoke TranslateAccelerator,[hdlg],[hAccel],eax or eax,eax jnz finish ;... finish: mov eax,1 return endp Такой код работает, если фокус ввода находится на DialogBox'е, а не на любом контроле, иначе сообщения WM_KEYDOWN и WM_SYSKEYDOWN просто не придут (при нажатии клавиш в данном случае вообще не будут приходить сообщения окну). Т.о. нужно всегда переустанавливать фокус на родительское окно (замучаешься, это уж точно). Очевидный вывод: используй CreateDialogParam и петлю сообщений, yessno
Может быть еще как-то можно через WM_NOTIFY, может еще кто подскажет. Только не забудь тогда включить стиль BS_NOTIFY.
dr_dred > Нет разницы для чего акселераторы. > Они вообще не знают для чего они. при создании модального диалога, вынь создает цикл выборки сообщений, который не обрабатывает акселераторов до тех пор пока не будет установлена ловушка WH_MSGFILTER, из которой должна быть вызвана TranslateAccelerator
marlboro именно. винда вообще много чего делает за тебя, если ты не оговоришь обратное при создании диалога можно много чего оговорить дополнительно, да и сам диалог можно по-разному выводить приложил пример окна с обработкой акселераторов для меню _625062747__Demo_2005_06_26.rar
kaspersky Не спорю, так как этого не знал. А вот примерчик мой работает, если фокус стоит на DialgBox.
Jupiter Вот ты написал приерчик. Ну энто же всем известно, как это делается для CreateWindowEx. Неужели ты считаешь marlboro ламером? Лучше попробуй сделать то же самое для DialogBoxParam, где сам петлю сообщений не сделаешь.
dr_dred > А вот примерчик мой работает, > если фокус стоит на DialgBox. в том-то и дело, что он может не стоять... а чем не нравится пример с ловушкой?
а чем не нравится пример с ловушкой? С ловушкой конечно интересно, но слишком наворочено. Очевидный вывод: используй CreateDialogParam и петлю сообщений, yessno Вот и я думал использовать CreateDialogParam, и вроде Iczelion №10 читал, да только не очень понял механизм использования CreateDialogParam. Если можно киньте примерчик какой-нибудь простенький. p.s. желательно на fasm'е т.к. не очень понимаю как на нем задать следующие ресурсы: MyDialog DIALOG 10, 10, 205, 60 STYLE 0x0004|DS_CENTER|WS_CAPTION|WS_MINIMIZEBOX| WS_SYSMENU|WS_VISIBLE|WS_OVERLAPPED|DS_MODALFRAME| DS_3DLOOK CAPTION "Our First Dialog Box" CLASS "DLGCLASS" BEGIN EDITTEXT IDC_EDIT, 15,17,111,13, ES_AUTOHSCROLL | ES_LEFT DEFPUSHBUTTON "Say Hello", IDC_BUTTON, 141,10,52,13 PUSHBUTTON "E&xit", IDC_EXIT, 141,26,52,13, WS_GROUP END
dr_dred а что мешает вызывать CreateDialogParam вместо CreateWindowEx? Код (Text): Invoke CreateDialogParam,hInstance,IDD_MAIN,NULL,Offset DlgProc,NULL mov hWnd,EAX Invoke ShowWindow,hWnd,SW_SHOWDEFAULT Invoke UpdateWindow,hWnd во-первых, я, когда на вопрос отвечаю, не считаю, что задавший его - ламер во-вторых, подозревать человека, ответившего на вопрос не так, как бы ответил на него ты, в том, что он всех считает ламерами, похоже на попытку искать ламера в себе и, наконец, в третьих, доктор дред, а не комплекс ли у вас? (не хочу переходить на личности и вести себя бестактно по отношению к вам, поэтому предлагаю не обсуждать тему ламерства впредь) нет ничего проще! вызываешь CreateDialogParam (см. пример выше) marlboro всё то же самое, что и предыдущем (приаттаченном мною) примере, только с вышеупомянутыми поправками на CreateDialogParam объявление класса в ресурсе вообще можно опустить конкретная реализация: http://www.winasm.net/forum/index.php?showtopic=328# http://www.winasm.net/forum/index.php?act=Attach&type=post&id=3235
Jupiter Ладно, за все извиняюсь. Еще в wc.cbWndExtra нужно положить DLGWINDOWEXTRA. marlboro Что бы class не смущал, нужно править макрос dialog: macro dialog ....,fontname,fontsize,classname { ... ... du menu+0,classname,0,title,0 ... } или что-то в этом роде. Если лень, но у тебя есть rc.exe, компилируй ресурсы обычным способом, а FASM'е пиши так: section '.rsrc' resource from 'res_name.res' data readable kaspersky, я не говорил, что пример с ловушкой мне не нравится, просто я так не пробовал делать, и не могу высказаться на этот счет.