Нужна помощь с dialogbox'ами

Тема в разделе "WASM.WIN32", создана пользователем marlboro, 26 июн 2005.

  1. marlboro

    marlboro New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    35
    Я использую диалог вкачестве главного окна и на нем много

    кнопок. Нужно также обрабатывать акселераторы на эти кнопки, а как заставить диалоговое окно их обрабатывать я не сообразил.

    p.s. ассемблер fasm v1.62
     
  2. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    может быть акселераторы для меню, а не для кнопок?

    нужно для начала загрузить таблицу акселераторов

    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
     
  3. marlboro

    marlboro New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    35
    может быть акселераторы для меню, а не для кнопок?

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



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



    Вообще-то у меня была мысль как это сделать, но пока не получилось. Использовать шаблон диалога как шаблон класа?
     
  4. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    marlboro

    попробуй установить WH_MSGFILTER и вызвать TranslateAccelerator() из ловушки



    P.S. я вообще-то по гуевым интерфейсам не спец,

    так что могу ошибаться
     
  5. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Нет разницы для чего акселераторы. Они вообще не знают для чего они. 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 :)
     
  6. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Может быть еще как-то можно через WM_NOTIFY, может еще кто подскажет. Только не забудь тогда включить стиль BS_NOTIFY.
     
  7. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    dr_dred

    > Нет разницы для чего акселераторы.

    > Они вообще не знают для чего они.

    при создании модального диалога,

    вынь создает цикл выборки сообщений,

    который не обрабатывает акселераторов

    до тех пор пока не будет установлена

    ловушка WH_MSGFILTER, из которой должна

    быть вызвана TranslateAccelerator
     
  8. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    marlboro



    именно.



    винда вообще много чего делает за тебя, если ты не оговоришь обратное

    при создании диалога можно много чего оговорить дополнительно, да и сам диалог можно по-разному выводить



    приложил пример окна с обработкой акселераторов для меню





    [​IMG] _625062747__Demo_2005_06_26.rar
     
  9. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    kaspersky

    Не спорю, так как этого не знал. А вот примерчик мой работает, если фокус стоит на DialgBox.
     
  10. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Jupiter

    Вот ты написал приерчик. Ну энто же всем известно, как это делается для CreateWindowEx. Неужели ты считаешь marlboro ламером? Лучше попробуй сделать то же самое для DialogBoxParam, где сам петлю сообщений не сделаешь.
     
  11. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    dr_dred

    > А вот примерчик мой работает,

    > если фокус стоит на DialgBox.

    в том-то и дело, что он может не стоять...

    а чем не нравится пример с ловушкой?
     
  12. marlboro

    marlboro New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    35
    а чем не нравится пример с ловушкой?

    С ловушкой конечно интересно, но слишком наворочено.



    Очевидный вывод: используй 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
     
  13. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    dr_dred



    а что мешает вызывать CreateDialogParam вместо CreateWindowEx?
    Код (Text):
    1.  
    2.     Invoke CreateDialogParam,hInstance,IDD_MAIN,NULL,Offset DlgProc,NULL
    3.     mov hWnd,EAX
    4.  
    5.     Invoke ShowWindow,hWnd,SW_SHOWDEFAULT
    6.     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
     
  14. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    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, я не говорил, что пример с ловушкой мне не нравится, просто я так не пробовал делать, и не могу высказаться на этот счет.