В диалоге не переводится фокус между контролами

Тема в разделе "WASM.WIN32", создана пользователем f00bar, 17 май 2006.

  1. f00bar

    f00bar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    6
    Добрый день.



    Проблема описана в сабже.



    Одно замечание...

    В Preview dialog (RadASM) все работает нормально (фокус скачет при нажатии Tab'а в нужной последовательности).

    После компиляции и запуска - диалог на Tab не реагирует.



    Rc:


    Код (Text):
    1.  
    2. #define IDD_DIALOG 1000
    3. #define IDC_STC1 1050
    4. #define IDC_STC2 1052
    5. #define IDC_STC3 1053
    6. #define IDC_CBO_RGN 1001
    7. #define IDC_CBO_CITY 1003
    8. #define IDC_EDT_STREET 1004
    9. #define IDC_BTN_SEARCH 1005
    10. #define IDC_EDT_LOG 1006
    11. #define IDC_CBO_AREA 1002
    12. #define IDC_STC4 1051
    13. IDD_DIALOG DIALOGEX 6,6,462,187
    14. CAPTION "test dialog"
    15. FONT 8,"MS Sans Serif",0,0
    16. CLASS "DLGCLASS"
    17. STYLE 0x10CB0800
    18. EXSTYLE 0x00000000
    19. BEGIN
    20.   CONTROL "",IDC_CBO_RGN,"ComboBox",0x10210143,4,18,133,153,0x00000000
    21.   CONTROL "",IDC_CBO_AREA,"ComboBox",0x50210143,4,48,133,123,0x00000000
    22.   CONTROL "",IDC_CBO_CITY,"ComboBox",0x50210143,4,77,133,92,0x00000000
    23.   CONTROL "",IDC_EDT_STREET,"Edit",0x50010080,4,107,133,15,0x00000200
    24.   CONTROL "Искать >>",IDC_BTN_SEARCH,"Button",0x50010000,62,140,76,19,0x00000000
    25.   CONTROL "",IDC_EDT_LOG,"Edit",0x503118C4,150,7,306,153,0x00000200
    26.   CONTROL "Регион:",IDC_STC1,"Static",0x50000000,4,7,133,8,0x00000000
    27.   CONTROL "Район:",IDC_STC4,"Static",0x50000000,4,35,133,9,0x00000000
    28.   CONTROL "Населенный пункт:",IDC_STC2,"Static",0x50000000,4,64,133,9,0x00000000
    29.   CONTROL "Улица:",IDC_STC3,"Static",0x50000000,4,94,133,9,0x00000000
    30. END
    31.  




    Спасибо за помощь!
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у контрола должен быть стиль WS_TABSTOP



    ЗЫ: диалоговые скрипты у вас какие-то кривые

    вот пример нормального скрипта:
    Код (Text):
    1. IDD_DIALOG_1 DIALOGEX 0, 0, 308, 198
    2. STYLE DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
    3. CAPTION "ISOFixer"
    4. FONT 8, "MS Sans Serif", 400, 0
    5. {
    6.  CONTROL "...", IDC_OPEN_ISOFILE, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 282, 13, 16, 12, WS_EX_NOPARENTNOTIFY | WS_EX_STATICEDGE
    7.  CONTROL "ISO file", -1, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 4, 5, 300, 25
    8.  CONTROL "", IDC_ISOFILE, "edit", ES_LEFT | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 14, 270, 10, WS_EX_NOPARENTNOTIFY | WS_EX_STATICEDGE
    9.  CONTROL "file", -1, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 4, 30, 300, 25
    10.  CONTROL "", IDC_FILE, "edit", ES_LEFT | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 39, 270, 10, WS_EX_NOPARENTNOTIFY | WS_EX_STATICEDGE
    11.  CONTROL "...", IDC_OPEN, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 282, 38, 16, 12, 131076
    12.  CONTROL "", -1, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 4, 168, 300, 25
    13.  CONTROL "Do it", IDC_DOIT, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 172, 64, 16, WS_EX_DLGMODALFRAME | WS_EX_NOPARENTNOTIFY | WS_EX_STATICEDGE
    14.  CONTROL "Exit", IDC_EXIT, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 173, 52, 14, WS_EX_NOPARENTNOTIFY | WS_EX_STATICEDGE
    15.  CONTROL "Log", -1, "button", BS_GROUPBOX | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_GROUP, 4, 58, 300, 106
    16.  CONTROL "", IDC_LISTBOX, "listbox", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 10, 68, 288, 96, WS_EX_NOPARENTNOTIFY | WS_EX_STATICEDGE
    17. }
     
  3. f00bar

    f00bar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    6
    WS_TABSTOP установлен.



    Скрипты не кривые. Они - автогенерированные RadASM'ом :)
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    давайте сорец тогда, будем посмотреть, ибо мои телепатические

    способности не безграничны
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Имхо поведение так-же задается диалоговой оконной процедурой по умолчанию...
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    Это как?
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    WS_EX_CONTROLPARENT ?

    А вообще - сравните WS_/WS_EX_ стили Preview и скомпиленного диалога.

    Только посмотрите это (а также наличие WS_TABSTOP у контролов) через что-то внешнее (например, Spy++).
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    зачем CLASS "DLGCLASS"???



    убери ее (строчку) и создавай диалог функциями DialogBoxParam/CreateDialogParam
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    2 rmn

    > зачем CLASS "DLGCLASS"???

    > убери ее (строчку) и создавай диалог функциями DialogBoxParam/CreateDialogParam



    Если CreateDialogParam - то без CLASS никак :) А заодно и о IsDialogMessage придется позаботиться.



    Другое дело - зачем "EXSTYLE 0x00000000" ?
     
  10. f00bar

    f00bar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    6
    kero:



    WS_EX_CONTROLPARENT не установлен



    Со Spy++ разницы в стилях не обнаружил.





    Rc сгенерирован RadASM'ом. Мне кажется, что наличие/отсутствие этой константы погоды не меняет.



    Всем спасибо!

    Может наковыряю что-нибудь позже.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    f00bar

    IsDialogMessage в коде есть? Без него табы не работают.
     
  12. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    RadASM совсем не знаю, но похоже дело вот в чем:

    видимо, RadASM строит Preview dialog через DialogBoxParam (=> класс #32770), что обеспечивает работу TAB;

    а в непоказанном коде используется CreateDialogParam, причем - без IsDialogMessage, что необходимо, хотя и недостаточно.
     
  13. f00bar

    f00bar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    6
    Спасибо, добрые люди :)



    Это почти решило проблему:


    Код (Text):
    1.  
    2. invoke IsDialogMessage, hWnd, addr msg
    3. .if eax==0
    4.   invoke TranslateMessage,addr msg
    5.   invoke DispatchMessage,addr msg
    6. .endif
    7.  




    Почти, потому что при активном WS_TABSTOP у edit control'а, фокус, дойдя до него, больше никуда не переводится. Если убрать WS_TABSTOP edit control'а, то по остальным элементам диалога фокус начинает переходить как задумано.



    Где грабли на этот раз?
     
  14. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Может быть у вас edit-control обрабатывает tab как символ и пишет его в свое окно. Нужно смотреть стили, насколько я помню.
     
  15. f00bar

    f00bar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    6
    Да. Проблема в том, что он MULTILINE.
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    multiline edit и должен обрабатывать таб как символ, поэтому либо избавиться от multiline, либо сабклассить edit и если нажат таб, принудительно переводить фокус на следующий контрол.
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    2 f00bar

    > Где грабли на этот раз?



    Это все тот же раз :)

    Если согласны отказаться от TAB внутри мультиэдита ради TAB для диалога - то можно и без сабклассинга.

    Откройте урок 10 (Диалоговое окно как основное) Iczelion-а и сравните 1-ый и 2-ой примеры.

    Вы сейчас трепыхаетесь в пределах 1-ого примера.

    Так вот: перепишите-ка свой код в духе примера №2.

    Кстати, Вам это уже советовали (rmn).
     
  18. f00bar

    f00bar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    6
    Да, я все понял.

    Всем спасибо за участие. Вопрос закрыт.