Вопрос № 181423: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Помогите с программой, которая дана ниже. В ней блокируется кнопка Отмена на всех страницах диалога и переход от одной страницы на другую происходит только при правильно уст...
Вопрос № 181423:
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Помогите с программой, которая дана ниже. В ней блокируется кнопка Отмена на всех страницах диалога и переход от одной страницы на другую происходит только при правильно установленных флагах check box’ов. Но есть два недочёта: 1. При неправильном вводе данных на первой странице появляется столько предупреждений MessageBox, сколько раз была нажата кнопка Далее. Но на второй странице этого нет, появляется только один MessageBox,
сколько бы раз ни нажималось Готово. Не могу понять, куда этот MessageBox первого диалога включить, чтобы он появлялся только один раз, как во втором окне. 2. При нажатии на кнопку Отмена на второй странице меня перебрасывает на первую страницу, несмотря на то, что я правильно активизирую указанную страницу по ее идентификатору в ресурсах, например: .ELSEIF eax==PSN_RESET ;нажата клавиша Отмена invoke SendMessage, hPropSheet, PSM_SETCURSEL
ID, 0, IDD_DLG2 ;оставаться на странице второго диалога, но никак не первого. Из-за чего подобное может происходить? Может, я не те сообщения посылаю?
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Adsorores! Ваши неточности и ошибки: 1) invoke SendMessage, hPropSheet, PSM_CHANGED, hwnd, 0 - лишнее. Это не ошибка, просто некорректность. Сообщение PSM_CHANGED посылается, когда надо явно сказать sheet-у, что появились изменения и будет активирована кнопка Применить/Apple. Простите, где Вы видете у себя эту кнопку? На самом деле, оно дальше и автоматом идет прекрасно.
2) Победил MessageBox, задав хозяином окно диалога, чем добился, что окно MessageBox-а стало модальным, т.е. не дает идти дальше, пока не нажмешь Ок 3) Ну а кнопку Cancel победил, отрабатывая не PSN_RESET, который почему-то не доходит, а PSN_QUERYCANCEL
Код:
;<< << << << << << << << << ПЕРВЫЙ ДИАЛОГ << << << << << << << << << << << PSDialog1 proc uses ebx, hwnd, uMsg, wParam, lParam mov eax, uMsg .IF eax==WM_NOTIFY mov ebx, lParam mov eax, NMHDR.code[ebx]
;код уведомления .IF eax==PSN_SETACTIVE ;делаем страницу активной m2m hPropSheet, NMHDR.hwndFrom[ebx] ;описатель окна набора страниц свойств invoke SendMessage, hPropSheet, PSM_SETWIZBUTTONS, 0, PSWIZB_NEXT ;делаем активной кнопку NEXT invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения ret
urn TRUE .ELSEIF eax==PSN_WIZNEXT invoke SendDlgItemMessage, hwnd, IDD_CB1, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 1 mov cb1, eax ;сохраним результат в cb1 invoke SendDlgItemMessage, hwnd, IDD_CB2, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 2 mov cb2, eax ;сохраним результат в cb2 invoke SendDlgItemMessage, hwnd, IDD_CB3,
BM_GETCHECK,0,0 ;узнать текущее состояние флажка 3 mov cb3, eax ;сохраним результат в cb3 invoke SendDlgItemMessage, hwnd, IDD_CB4, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 4 mov cb4, eax ;сохраним результат в cb4 invoke SendDlgItemMessage, hwnd, IDD_CB5, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 5
mov cb5, eax ;сохраним результат в cb5 invoke SendDlgItemMessage, hwnd, IDD_CB6, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 6 mov cb6, eax ;сохраним результат в cb6 .IF cb1==1 && cb2==1 && cb3==0 && cb4==0 && cb5==0 && cb6==1 ;если правильно, то invoke SetWindowLong, hwnd, DWL_MSGRESULT, 0 ;сохраним изменения return TRUE
.ELSE ;иначе invoke SendMessage, hPropSheet, PSM_SETCURSELID, 0, IDD_DLG1 ;остаёмся на этой же странице
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.