BM_GETCHECK не работает

Тема в разделе "WASM.BEGINNERS", создана пользователем murtix, 2 дек 2006.

  1. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Вот код, реакция на клик мышкой или пробелом на клаве по CHECKBOX-у
    SendDlgItemMessage всегда возвращает BST_CHECKED (=1) почему и что я неправильно делаю
    Код (Text):
    1.         .if lParam!=0
    2.             .if ax==IDC_cbCoord
    3.                 invoke SendDlgItemMessage, hWndOp, IDC_cbDraw, BM_GETCHECK, 0, 0
    4.                 .if eax == BST_CHECKED
    5.                     mov     (Points ptr [esi]).DrawCoord, TRUE
    6.                 .else
    7.                     mov     (Points ptr [esi]).DrawCoord, FALSE
    8.                 .endif
    9.             .endif
    10.         .endif
     
  2. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Дык там же возвращает SendDlgItemMessage True или False - проверь точно.
     
  3. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Код (Text):
    1. BOOL fOpenNewUrl;
    2. fOpenNewUrl = SendDlgItemMessage(hWnd,1011,BM_GETCHECK,0,0);
    вот смотри, я точно глянул, у меня именно так проверка и стоит
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    10_Brasil
    imho ответом на BM_GETCHECK является BST_CHECKED, BST_INDETERMINATE или BST_UNCHECKED, а не как не TRUE или FALSE.

    murtix
    Показанный код правилен.
    Как ты определяешь, что SendDlgItemMessage всегда возвращает BST_CHECKED, визуально, в отладчике, MessageBox, OutputDebugString, ...?
    Как создается IDC_cbDraw, с какими стилями?
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    q_q
    BST_CHECKED == 1 == TRUE
    BST_INDETERMINATE == 2 == TRUE
    BST_UNCHECKED == 0 == FALSE
    Получается, что конфликт в логике может быть только при использовании BST_INDETERMINATE.

    murtix
    Если Вы ловите событие клик, учтите, что состояние чекбокса может измениться после того как Вы обработали событие.
     
  6. Asterix

    Asterix New Member

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

    Код (Text):
    1.         case WM_COMMAND:
    2.             switch(LOWORD(wParam))
    3.             {
    4. ..................................
    5.                 case IDC_OPTION_1:
    6.                 case IDC_OPTION_2:
    7.                 case IDC_OPTION_3:
    8.                 case IDC_OPTION_4:
    9.                 case IDC_OPTION_5:
    10.                 case IDC_OPTION_6:
    11.                 case IDC_OPTION_7:
    12.                     if ( BST_CHECKED == IsDlgButtonChecked(hDlg, (int)LOWORD(wParam)) )
    13.                         options_count++;
    14.                     else
    15.                         options_count--;
    16.                     CheckDlgButton(hDlg, IDC_SELECTALL, options_count == OPTIONS_TOTAL ?
    17.                                                                            BST_CHECKED :
    18.                                                                            BST_UNCHECKED);
    19.                     break;
    20. ....................................
     
  7. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    q_q
    Я смотрел реакцию программы потом и в олле. BST_INDETERMINATE не использую, поэтому можно только TRUE или FALSE проверять.

    Quantum
    Там выше стоит проверка WM_COMMAND, т.е.
    Код (Text):
    1. .elseif uMsg==WM_COMMAND
    2. ............................
    3.         mov   eax, wParam
    4.         .if lParam!=0
    5.             .if ax==IDC_cbCoord
    6.                 invoke SendDlgItemMessage, hWndOp, IDC_cbDraw, BM_GETCHECK, 0, 0
    7.                 .if eax == BST_CHECKED
    8.                     mov     (Points ptr [esi]).DrawCoord, TRUE
    9.                 .else
    10.                     mov     (Points ptr [esi]).DrawCoord, FALSE
    11.                 .endif
    12.             .endif
    13.         .endif
    Я так понял это любое сообщение т.е. клик и пробел тоже.
    Asterix
    Ща проверю
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Quantum
    Я привел цитату из документации, чтобы поправить 10_Brasil.

    BST_INDETERMINATE == 2 == TRUE
    imho имя TRUE заменяется единицей.

    murtix
    Я смотрел реакцию программы
    Плохой способ локализовать проблемное место в коде.

    потом и в олле
    Это лучше. Показанная тобой часть кода не дает полной картины о взаимодействии программы и ceckbos’а, а также о структуре и использовании (Points ptr [esi]) .

    Я так понял это любое сообщение т.е. клик и пробел тоже.
    Это справедливо.
    Чтобы быть увереным точно необходимо выполнение следующих условий uMsg == WM_COMMAND, (HWND) lParam == hwndCtrl, HIWORD(wParam) == BN_CLICKED и LOWORD(wParam) == idCtrl.
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    q_q
    Вместо == TRUE надо было написать != FALSE

    Не всегда. Видел в каком-то хидере *никса как TRUE определялось -1 (0xffffffff) для совместимости с чем-то.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну, не будет трогать никсы здесь. В большинстве случаев TRUE равно 1, но не всегда.
    Зато всегда справедливо "FALSE = 0; TRUE = !FALSE;". В винде в СОМ есть ещё VARIANT_TRUE, равный (WORD)(-1). Но FALSE, false всегда равны 0 и опираться надо только на это.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    сравнение в коде с TRUE это моветон, всегда юзают или
    if (value)
    или
    if (!value)
    а компилятор будет юзать сравнение с 0 и никак не с 1
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Quantum
    в каком-то хидере *никса
    :dntknw: При чем тут nix'ы? Тема явно win32. Не понимаю, как может возникнуть проблема в общении с checkbox'ом?

    IceStudent
    но не всегда
    Где в win32 символьное имя TRUE не заменяется на единицу?

    В винде в СОМ есть ещё VARIANT_TRUE
    :) Там много чего есть. Я тоже умею натравливать AVSearch на %MSSdk%\Include.

    Asterix
    сравнение в коде с TRUE это моветон
    А советовать код, который содержит логические ошибки и не соответствует документации?

    всегда юзают
    Говори за себя.
    Например, я так не пишу, а предпочитаю придерживаться документации, пока она не противоречит практике, при чем противоречие должно быть подтверждено несколькими источниками.
     
  13. Asterix

    Asterix New Member

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

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    q_q
    При том, что стандартом нигде не определено, что TRUE == 1. Можешь написать #define TRUE 0 хоть в win32.

    Почему ты у меня спрашиваешь? :)
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix
    в каком месте?
    Первый ответ в этой теме.

    Quantum
    стандартом нигде не определено ... Можешь написать #define TRUE 0 хоть в win32
    :dntknw: Не понял. Автор задал конкретный вопрос, который имеет отношение к win32. Инструментом для написания win32app является psdk, определение #define TRUE 1 содержится в WinDef.h. Зачем что-то менять?

    Почему ты меня спрашиваешь?
    Ты затеял обсуждение использования TRUE, которое к коду автора темы отношение не имеет. Повторяю: моя реплика относилась к сообщению 10_Brasil, автору я написал совсем о другом.
     
  16. Asterix

    Asterix New Member

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

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix
    :) А если у тебя, что это меняет? Тебе можно?
     
  18. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    q_q
    А. Голуб
    параграф 85.5.
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    нет, если бы у меня я бы спорил и отстаивал свой код ;)
     
  20. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix
    Ты имеешь в виду 85.5. Не делайте вид, что Си поддерживает булевый тип (#define TRUE)?
    Я полагаю, что опытные программисты прекрасно это знают. Применительно к win32 для функций описанных как BOOL, обычно написано " ... return value is nonzero ... return value is zero ... ". Писать как ты или if (0 != value) или if (0 == value) - это скоре дело вкуса и/или корпоративного стандарта.

    спорил и отстаивал свой код
    Ты, как и автор темы, написал if ( BST_CHECKED == . Какие тут вопросы.