Лабораторная работа 11. Новая программа COLORS В программе COLORS1, описанной в главе 8, для вывода на экран трех полос прокрутки и шести текстовых элементов было создано девять дочерних окон. Измените программу COLORS1 так, чтобы в ней использовались немодальные окна диалога. Хотя в программе COLORS1 выводимые на экран полосы прокрутки зависели от размеров окна, в новой версии их размер в немодальном окне диалога остается постоянным. В шаблоне окна диалога в файле COLORS2.RC для всех девяти дочерних окон окна диалога используются инструкции CONTROL. Немодальное окно диалога программы COLORS2 создается в функции WinMain сразу после вызова функции UpdateWindow, предназначенной для главного окна программы. Обратите внимание, что стиль главного окна включает в себя идентификатор WS_CLIPCHILDREN, что дает программе возможность перерисовать главное окно, не затирая окна диалога. Описатель окна диалога, который является возвращаемым значением функции CreateDialog, хранится в глобальной переменной hDlgModeless и проверяется в цикле обработки сообщений так, как описано выше. Однако, в данной программе нет необходимости хранить описатель в глобальной переменной и проверять его значение перед вызовом функции IsDialogMessage. При этом цикл обработки сообщений мог бы быть написан так: while(GetMessage(&msg, NULL, 0, 0)) { if(!IsDialogMessage(hDlgModeless, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Поскольку окно диалога создается до того, как в программе вводится цикл обработки сообщений, и окно диалога не закрывается до тех пор пока не завершится программа, значение hDlgModeless всегда будет корректным. Ниже приведен код, который может быть вставлен в оконную процедуру диалога, если вам захочется добавить возможность закрытия окна диалога: case WM_CLOSE: DestroyWindow(hDlg); hDlgModeless = 0; break; В программе COLORS1 функция SetWindowText отображала в текстовом виде значения трех целых, преобразованных в текст с помощью функции itoa. Это выглядело так: SetWindowText(hwndValue[i], _itoa(color[i]), szBuffer, 10)); Величина i соответствовала идентификатору обрабатываемой в данный момент полосы прокрутки, а массив hwndValue содержал описатели трех (по числу цветов) статических дочерних окон управления. В новой версии, чтобы задать выводимое на экран число для каждого текстового поля каждого окна управления используется функция SetDlgItemInt : SetDlgItemInt(hDlg, iCtrlID + 3, iColor[iIndex], FALSE); (Хотя функция SetDlgItemInt и соответствующая ей функция GetDlgItemInt чаще всего используются в окнах редактирования, они также могут применяться для задания текстового поля и в других окнах элементов управления, например статических.) Переменная iCtrlID определяет идентификатор полосы прокрутки, а добавление 3 к этому числу превращает его в идентификатор соответствующей числовой метки. Третий параметр задает цвет. Обычно четвертый параметр устанавливается в TRUE, чтобы показать, что числа большие 32767 должны отображаться как отрицательные. Однако, диапазон значений вашей программы от 0 до 255, поэтому величина четвертого параметра значения не имеет.