|
Программирование >> Процедурные приложения
const double pi = 3.14159265358979; POINT ptCenter; double dblRadiusx = (rc.right - rc.left) / 2; double dblRadiusy = (rc.bottom - rc.top) / 2; double dblAngle = 3 * pi / 2; double dblDiff = 2 * pi / m nSides; ptCenter.x = (rc.left + rc.right) / 2; ptCenter.у = (rc.top + rc.bottom) / 2; Вычисление координат вершин for (int i = 0; i < m nSides; i++) { m arrPoint[i].x = (long) \ (dblRadiusx*cos(dblAngle)+ptCenter.x+0.5); m arrPoint[i].y = (long) \ (dblRadiusy*sin (dblAngle) -1-ptCenter. y+0.5) ; dblAngle += dblDiff; } Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom); Создание и выбор кисти для заливки многоугольника hBrush = CreateSolidBrush(colFore); SelectObject(hdc, hBrush); Polygon(hdc, Sm arrPoint[0], m nSides); Вывод даты и времени time(Stimer); date time = localtime(<<timer); const char* strtime; strtime = asctime(date time); SetBkMode(hdc, TRANSPARENT); SetTextAlign(hdc, TA CENTER TA TOP); ExtTextOut(hdc, (rc.left + rc.right)/2, (rc.top + rc.bottom - tan.tmHeight)/2, ETO CLIPPED, Src, strtime, strlen (strtime) -1,NULL); Восстановление старых пера и кисти SelectObject(hdc, hOldPen) ; SelectObject(hdc, hOldBrush) ; DeleteOb ject (hBrush) ; return S OK; LRESULt CPolyCtl: : OnLButtonDown (UINT uMsg, WPJUWM wParam, LPARAM 1 Par am, BOOLS bHandled) HRGNhRgn; WORDxPos= LOWORD(lParam) ; положение указателя по горизонтали WORDyPos= HIWORD(lParam) ; положение указателя по вертикали Создание многоугольника по списку координат вершин hRgn = CreatePolygonRgn(sm arrPoint[0] , m nSides, WINDING); Если точка шелчка попадает внутрь многоугольника, то генерируется событие Clickln, в противном случае - событие ClickOut if (PtInRegion(hRgn, xPos, yPos) ) Fire ClickIn (xPos , yPos) ; else Fire ClickOut (xPos , yPos) ; Освобождение дескриптора DeleteOb ject (hRgn) ; return 0 ; STDMETHODIMP CPolyCtl::get Sides(short *pVal) ( *pVal = m nSides; return S OK; } STDMETHODIMP CPolyCtl::put Sides(short newVal) { if (newVal > 2 ££ newVal < 11) { m nSides = newVal; FiifeViewChangeO ; return S OK; ) else return Error( T( Must have between 3 and 10 sides )); Отображаемые дата и время будут обновляться каждый раз после выполнения щелчка на элементе управления. Метод put Sides() изменен таким образом, чтобы вызывать функцию FireViewChange(), которая, в свою очередь, вызывает функцию invalidateRect(), обозначающую область перерисовки элемента управления как недействительную. Если этого не сделать, изображение элемента управления не будет обновляться после щелчка на нем мышью. Добавление страницы свойств С помощью того же мастера ATL-объектов можно добавить в элемент управления страницу свойств. Для этого выберите в меню Insert командуNew ATL Object... (рис. 23.13). Рис. 23.13. С помощью мастера ATL Object Wizard можно добавить в проект страницу свойств Выделите категорию Controls, в ней - элемент PropertyPageи щелкните на кнопке Next. В следующем окне мастера можно установить параметры, определяющие работу страницы свойств. На вкладке Namesв поле ShortNameвведите имя объекта - PolyProp. Все остальные поля будут заполнены мастером автоматически (рис. 23.14). Рис. 23.14. Задание параметров создаваемой страницы свойств Теперь перейдите на вкладку Strings и заполните поля Title(текст ярлычка вкладки) и DocString(строка описания), а поле Helpfile (ассоциированный файл справки) очистите (рис. 23.15). Рис. 23.15. На вкладке Strings следует заполнить поля Title и Doc String После щелчка на кнопке ОК будут созданы новые файлы POLYPROP.H, POLYPROP.CPPи POLYPROP.RGS. Далее необходимо изменить внешний вид страницы свойств. Откройте с помощью вкладки ResourceViewдиалоговое окно с идентификатором lDD PObYPROp, поменяйте существующую надпись на Sides: и добавьте текстовое поле с идентификатором IDC SIDEs(рис. 23.16).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |