Программирование >>  Процедурные приложения 

1 ... 145 146 147 [ 148 ] 149 150


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).



1 ... 145 146 147 [ 148 ] 149 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика