Вот код, реакция на клик мышкой или пробелом на клаве по CHECKBOX-у SendDlgItemMessage всегда возвращает BST_CHECKED (=1) почему и что я неправильно делаю Код (Text): .if lParam!=0 .if ax==IDC_cbCoord invoke SendDlgItemMessage, hWndOp, IDC_cbDraw, BM_GETCHECK, 0, 0 .if eax == BST_CHECKED mov (Points ptr [esi]).DrawCoord, TRUE .else mov (Points ptr [esi]).DrawCoord, FALSE .endif .endif .endif
Код (Text): BOOL fOpenNewUrl; fOpenNewUrl = SendDlgItemMessage(hWnd,1011,BM_GETCHECK,0,0); вот смотри, я точно глянул, у меня именно так проверка и стоит
10_Brasil imho ответом на BM_GETCHECK является BST_CHECKED, BST_INDETERMINATE или BST_UNCHECKED, а не как не TRUE или FALSE. murtix Показанный код правилен. Как ты определяешь, что SendDlgItemMessage всегда возвращает BST_CHECKED, визуально, в отладчике, MessageBox, OutputDebugString, ...? Как создается IDC_cbDraw, с какими стилями?
q_q BST_CHECKED == 1 == TRUE BST_INDETERMINATE == 2 == TRUE BST_UNCHECKED == 0 == FALSE Получается, что конфликт в логике может быть только при использовании BST_INDETERMINATE. murtix Если Вы ловите событие клик, учтите, что состояние чекбокса может измениться после того как Вы обработали событие.
я не использовал SendMessage и все работает Код (Text): case WM_COMMAND: switch(LOWORD(wParam)) { .................................. case IDC_OPTION_1: case IDC_OPTION_2: case IDC_OPTION_3: case IDC_OPTION_4: case IDC_OPTION_5: case IDC_OPTION_6: case IDC_OPTION_7: if ( BST_CHECKED == IsDlgButtonChecked(hDlg, (int)LOWORD(wParam)) ) options_count++; else options_count--; CheckDlgButton(hDlg, IDC_SELECTALL, options_count == OPTIONS_TOTAL ? BST_CHECKED : BST_UNCHECKED); break; ....................................
q_q Я смотрел реакцию программы потом и в олле. BST_INDETERMINATE не использую, поэтому можно только TRUE или FALSE проверять. Quantum Там выше стоит проверка WM_COMMAND, т.е. Код (Text): .elseif uMsg==WM_COMMAND ............................ mov eax, wParam .if lParam!=0 .if ax==IDC_cbCoord invoke SendDlgItemMessage, hWndOp, IDC_cbDraw, BM_GETCHECK, 0, 0 .if eax == BST_CHECKED mov (Points ptr [esi]).DrawCoord, TRUE .else mov (Points ptr [esi]).DrawCoord, FALSE .endif .endif .endif Я так понял это любое сообщение т.е. клик и пробел тоже. Asterix Ща проверю
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.
q_q Вместо == TRUE надо было написать != FALSE Не всегда. Видел в каком-то хидере *никса как TRUE определялось -1 (0xffffffff) для совместимости с чем-то.
Ну, не будет трогать никсы здесь. В большинстве случаев TRUE равно 1, но не всегда. Зато всегда справедливо "FALSE = 0; TRUE = !FALSE;". В винде в СОМ есть ещё VARIANT_TRUE, равный (WORD)(-1). Но FALSE, false всегда равны 0 и опираться надо только на это.
сравнение в коде с TRUE это моветон, всегда юзают или if (value) или if (!value) а компилятор будет юзать сравнение с 0 и никак не с 1
Quantum в каком-то хидере *никса При чем тут nix'ы? Тема явно win32. Не понимаю, как может возникнуть проблема в общении с checkbox'ом? IceStudent но не всегда Где в win32 символьное имя TRUE не заменяется на единицу? В винде в СОМ есть ещё VARIANT_TRUE Там много чего есть. Я тоже умею натравливать AVSearch на %MSSdk%\Include. Asterix сравнение в коде с TRUE это моветон А советовать код, который содержит логические ошибки и не соответствует документации? всегда юзают Говори за себя. Например, я так не пишу, а предпочитаю придерживаться документации, пока она не противоречит практике, при чем противоречие должно быть подтверждено несколькими источниками.
q_q При том, что стандартом нигде не определено, что TRUE == 1. Можешь написать #define TRUE 0 хоть в win32. Почему ты у меня спрашиваешь?
Asterix в каком месте? Первый ответ в этой теме. Quantum стандартом нигде не определено ... Можешь написать #define TRUE 0 хоть в win32 Не понял. Автор задал конкретный вопрос, который имеет отношение к win32. Инструментом для написания win32app является psdk, определение #define TRUE 1 содержится в WinDef.h. Зачем что-то менять? Почему ты меня спрашиваешь? Ты затеял обсуждение использования TRUE, которое к коду автора темы отношение не имеет. Повторяю: моя реплика относилась к сообщению 10_Brasil, автору я написал совсем о другом.
Asterix Ты имеешь в виду 85.5. Не делайте вид, что Си поддерживает булевый тип (#define TRUE)? Я полагаю, что опытные программисты прекрасно это знают. Применительно к win32 для функций описанных как BOOL, обычно написано " ... return value is nonzero ... return value is zero ... ". Писать как ты или if (0 != value) или if (0 == value) - это скоре дело вкуса и/или корпоративного стандарта. спорил и отстаивал свой код Ты, как и автор темы, написал if ( BST_CHECKED == . Какие тут вопросы.