Программирование графики Windows в Visual C++
Вложений: 3
Свершилось! 20 лет я ждал этого момента. Теперь я умею рисовать в Windows.
Примеры использования графики показаны ниже.
Код:
/* p160
Язык Visual C++ 6.0
Графика. Рисунки. */
int d = 0; // номер задачи
void CP160View::OnDraw (CDC *pDC)
{
CP160Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
int a, b;
if (d == 0)
{
// 160.56.1
pDC -> Rectangle (10, 10, 650, 490);
pDC -> MoveTo (11, 11);
pDC -> LineTo (649, 489);
pDC -> MoveTo (649, 11);
pDC -> LineTo (11, 489);
pDC -> Rectangle (50, 50, 300, 300);
for (a = 83; a > 0; a -= 5)
pDC -> Ellipse (110 - a, 110 - a, 110 + a, 110 + a);
}
if (d == 1)
{
// 92.1.2
for (a = 0; a < 25; a++)
for (b = 0; b < 25; b++)
pDC -> SetPixel (5 * a + 30, 5 * b + 30, 0x1111);
// 93.2.3
pDC -> Rectangle (100, 100, 300, 300); // голова
pDC -> Ellipse (120, 140, 180, 200);
pDC -> Ellipse (220, 140, 280, 200);
pDC -> Ellipse (150, 170, 45, 135); // бровь
pDC -> Ellipse (250, 170, 200, 135);
pDC -> Ellipse (200, 250, 0, 360);
pDC -> Rectangle (130, 280, 270, 290);
pDC -> MoveTo (100, 300); // шея
pDC -> LineTo (50, 350);
pDC -> LineTo (350, 350);
pDC -> LineTo (299, 299);
// 98.5.4
for (a = 0; a < 9; a++)
{
pDC -> MoveTo (400 + a * 30, 30);
pDC -> LineTo (400 + a * 30, 270);
pDC -> MoveTo (400, 30 + a * 30);
pDC -> LineTo (640, 30 + a * 30);
}
}
}
void CP160View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
d++; // переход к следующей задаче
Invalidate ();
CView::OnChar (nChar, nRepCnt, nFlags);
}
Код:
/* p31
Язык Visual C++ 6.0
Графики функций */
#include <math.h>
int d = 0; // номер графика
void CP31View::OnDraw (CDC *pDC)
{
CP31Doc *pdoc = GetDocument ();
ASSERT_VALID (pdoc);
int a, b, c, j;
double g, h, i, m;
if (d == 0)
{
// 31.2.1
pDC -> MoveTo (10, 360);
pDC -> LineTo (1010, 360);
pDC -> MoveTo (510, 10);
pDC -> LineTo (510, 710);
pDC -> MoveTo (510, 360);
pDC -> LineTo (160, 10);
pDC -> MoveTo (510, 360);
pDC -> LineTo (560, 310);
pDC -> LineTo (1010, 310);
// 32.5.2
pDC -> MoveTo (510, 310);
pDC -> LineTo (10, 310);
pDC -> MoveTo (510, 310);
pDC -> LineTo (560, 360);
// 33.10.3
pDC -> MoveTo (560, 210);
pDC -> LineTo (460, 10);
pDC -> MoveTo (560, 210);
pDC -> LineTo (710, 210);
pDC -> LineTo (810, 10);
}
if (d == 1)
{
// 45.1.4
pDC -> MoveTo (10, 360);
pDC -> LineTo (1010, 360);
pDC -> MoveTo (510, 10);
pDC -> LineTo (510, 710);
for (a = 0; a < 1000; a++)
{
g = (a - 500) / 50.;
h = fabs (2 * g + 1) - fabs (3 * g + 7);
b = (int) (360 - h * 50);
if (a == 0) {c = b; continue;}
if (b >= 10 && b <= 710 && c >= 10 && c <= 710)
{
pDC -> MoveTo (a + 9, c);
pDC -> LineTo (a + 10, b);
}
c = b;
}
// 47.3.5
pDC -> MoveTo (510, 310);
pDC -> LineTo (1010, 310);
pDC -> MoveTo (510, 410);
pDC -> LineTo (10, 410);
// 46.2.6
for (a = 0; a < 1000; a++)
{
g = (a - 500) / 50.;
g += 1;
j = 1;
if (g < 0) {g = -g; j = -1;} // знак аргумента
h = exp (1 / 3. * log (g)) * j;
b = (int) (360 - h * 50);
if (a == 0) {c = b; continue;}
if (b >= 10 && b <= 710 && c >= 10 && c <= 710)
{
pDC -> MoveTo (a + 9, c);
pDC -> LineTo (a + 10, b);
}
c = b;
}
}
if (d == 2)
{
// 51.1.7
pDC -> MoveTo (10, 360);
pDC -> LineTo (1010, 360);
pDC -> MoveTo (510, 10);
pDC -> LineTo (510, 710);
pDC -> MoveTo (460, 260);
pDC -> LineTo (335, 10);
pDC -> MoveTo (460, 260);
pDC -> LineTo (560, 260);
pDC -> LineTo (685, 10);
// 52.6.8
for (a = 0; a < 1000; a++)
{
g = (a - 500) / 50.;
i = g; // член ряда
m = g; // результат суммирования
for (j = 2; j < 10; j += 2)
{
i *= -g * g / j / (j + 1);
m += i;
}
h = m; // результат суммирования ряда разложения синуса
b = (int) (360 - h * 50);
if (a == 0) {c = b; continue;}
if (b >= 10 && b <= 710 && c >= 10 && c <= 710)
{
pDC -> MoveTo (a + 9, c);
pDC -> LineTo (a + 10, b);
}
c = b;
}
for (a = 0; a < 1000; a++)
{
g = (a - 500) / 50.;
h = sin (g);
b = (int) (360 - h * 50);
if (a == 0) {c = b; continue;}
if (b >= 10 && b <= 710 && c >= 10 && c <= 710)
{
pDC -> MoveTo (a + 9, c);
pDC -> LineTo (a + 10, b);
}
c = b;
}
}
}
void CP31View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
d++;
Invalidate ();
CView::OnChar (nChar, nRepCnt, nFlags);
}
|