Лабораторная работа 11

advertisement
Лабораторная работа 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, поэтому величина
четвертого параметра значения не имеет.
Download