EnableWindow

Тема в разделе "WASM.WIN32", создана пользователем cresta, 10 дек 2005.

Статус темы:
Закрыта.
  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Кусок wndproc. Активация/деактивация контролов в зависимости от состояния чекбокса.


    Код (Text):
    1. ;uMsg==WM_COMMAND, eax==LOWORD (wParam)==ID контрола, HIWORD(wParam)==BN_CLICKED
    2.             .elseif     eax==CHK_SOUND
    3.                 invoke  IsDlgButtonChecked, hDlg, eax
    4.                 mov     EnableSnd,eax
    5.                 mov     ebx,eax
    6.                 mov     esi,STC_SOUND
    7.                 @@:
    8.                 invoke  GetDlgItem, hWin, esi
    9.                 invoke  EnableWindow, eax, ebx
    10.                 inc     esi
    11.                 cmp     esi,BTN_SOUND+1
    12.                 jl     @B
    13.                
    14.             .elseif    eax==CHK_WIN
    15.                 invoke  IsDlgButtonChecked, hDlg, eax
    16.                 mov     EnableAll,eax
    17.                 mov     ebx,eax
    18.                 mov     esi,STC_BACK
    19.                 @@:
    20.                 invoke  GetDlgItem, hWin, esi
    21.                 invoke  EnableWindow, eax, ebx
    22.                 inc     esi
    23.                 cmp     esi,CHK_WIN
    24.                 jl      @B






    Второй цикл (по eax==CHK_WIN) работает как при посылке WM_COMMAND программно из другой процедуры, так и при WM_COMMAND от винды при клике мышью

    Перый цикл (по eax==CHK_SOUND) при клике мышью работает, а если сообщение послать самому из программы, то контролы с ID STC_SOUND - BTN_SOUND не становятся disable.



    Все параметры для GetDlgItem и EnableWindow одинаковы как при клике, так и при посылке WM_COMMAND программно. GetLastError равен нулю. EnableWindow возвращает ноль, что значит: предыдущее состояние было активное и переключено в неактивное. Хотя на деле так и остаются активными.


    Код (Text):
    1. Это параметры GetDlgItem и EnableWindow при каждом из трёх проходов цикла
    2. В случае клика мышью
    3. eax = 591498 (SetDlg.asm, 55)
    4. hWin = 984698 (SetDlg.asm, 57)
    5. esi = 1008 (SetDlg.asm, 58)
    6. ebx = 0 (SetDlg.asm, 59)
    7. ----------------------------------------
    8. eax = 591500 (SetDlg.asm, 55)
    9. hWin = 984698 (SetDlg.asm, 57)
    10. esi = 1009 (SetDlg.asm, 58)
    11. ebx = 0 (SetDlg.asm, 59)
    12. ----------------------------------------
    13. eax = 591508 (SetDlg.asm, 55)
    14. hWin = 984698 (SetDlg.asm, 57)
    15. esi = 1010 (SetDlg.asm, 58)
    16. ebx = 0 (SetDlg.asm, 59)
    17. ----------------------------------------
    18.  
    19. и в случае программного WM_COMMAND
    20. eax = 591498 (SetDlg.asm, 55)
    21. hWin = 984698 (SetDlg.asm, 57)
    22. esi = 1008 (SetDlg.asm, 58)
    23. ebx = 0 (SetDlg.asm, 59)
    24. ----------------------------------------
    25. eax = 591500 (SetDlg.asm, 55)
    26. hWin = 984698 (SetDlg.asm, 57)
    27. esi = 1009 (SetDlg.asm, 58)
    28. ebx = 0 (SetDlg.asm, 59)
    29. ----------------------------------------
    30. eax = 591508 (SetDlg.asm, 55)
    31. hWin = 984698 (SetDlg.asm, 57)
    32. esi = 1010 (SetDlg.asm, 58)
    33. ebx = 0 (SetDlg.asm, 59)




    Почему поведение может так отличаться при одинаковых входных данных?
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Как сделать контролы неактивными я знаю. Меня это не интересует.



    Меня интересует, ПОЧЕМУ



    invoke EnableWindow, 657370, 0

    не делает то же самое, что и

    invoke EnableWindow, 657370, 0

    при последующем вызове



    при условии что 657370 - валидный хэндл в обоих случаях.



    Иными словами, почему два одинаковых вызова приводят к разным результатам.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    зря потратил на тебя время :-(
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Если кто и потратил время зря, то это я. Благодаря твоей невнимательности и неумению читать вопрос.

    В следующий раз внимательно читай вопрос, прежде чем отвечать.
     
Статус темы:
Закрыта.