Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
1

Движущийся человечек в консоли

18.04.2014, 22:58. Показов 10190. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане. Начал работать с графикой (Visual C++), постепенно изучаю и наткнулся на интересную программу. Движущийся человечек в консоли. Не могли бы вы прокомментировать код? Поскольку он содержит сведения о линиях, окружностях, пере и прочих атрибутах графики. Заранее благодарю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <Windows.h>
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
void Picture(HWND hW, int dx, int dy, int mode)
{
    COLORREF border = RGB(255, 255, 0), fill = RGB(127, 127, 0), line = RGB(0, 255, 0), black = RGB(0, 0, 0);
    if (!mode)
        border = fill = line = black;
    int x0 = 50, y0 = 50, r = 10;
 
    Circle(hW, x0 + dx, y0 + dy, r, border, fill);
    Line(hW, x0 + dx, y0 + dy + r, x0 + dx, y0 + dy + r + 30, line);
    Line(hW, x0 + dx, y0 + dy + r + 30, x0 + dx - 10, y0 + dy + r + 70, line);
    Line(hW, x0 + dx, y0 + dy + r + 30, x0 + dx + 10, y0 + dy + r + 70, line);
    Line(hW, x0 + dx - 5, y0 + dy + r + 7, x0 + dx + 5, y0 + dy + r + 2, line);
    Line(hW, x0 + dx - 5, y0 + dy + r + 7, x0 + dx - 10, y0 + dy + r + 25, line);
    Line(hW, x0 + dx + 5, y0 + dy + r + 2, x0 + dx + 10, y0 + dy + r + 20, line);
}
 
 
int main()
{
    HWND hW = GetConsoleWindow();
    int step = -1;
    Sleep(1000);
 
    for (;; ++step)
    {
        Picture(hW, 5 * step, 0, 1);
        Sleep(200);
        Picture(hW, 5 * step, 0, 0);
        if (step > 100)
            step = -10;
    }
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2014, 22:58
Ответы с готовыми решениями:

Вывести в окне фигуры: домик, человечек, солнце
Используя различные фигуры (точка, линия, эллипс, круг, прямоугольник и др.) вывести в окне фигуры:...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать где находится курсор...

Реализация кроссфплатформенности консоли, разрешение консоли
Можно ли как-то реализовать просчёт количества пикселей экрана? Просто есть вот такая программа,...

считывание с консоли ( не с клавы, а именно с консоли)
нужно написать функцию которая возвращает string в котором написано 500 символов которые были...

17
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
18.04.2014, 22:59 2
Что комментировать-то? Открой справочник по функциям WinAPI, там они все описаны.
0
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
19.04.2014, 00:11  [ТС] 3
Ладно, приблизительно начал разбираться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "stdafx.h"
#include <windows.h>
#include <iostream>
 
 
int main(int argc, char **argv, HWND hW)
{
    using namespace std;
 
 
 
    //hwnd - дескриптор окна, в которое будем рисовать
    HDC hdc = 0;
    HDC hDC = GetDC(hW);
 
    //hdc - дескриптор контекста устройства
    HPEN hWhitePen, hOldPen;
    HBRUSH hWhiteBrush, hOldBrush;
 
    hWhitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    hWhiteBrush = CreateSolidBrush(RGB(255, 255, 255));
 
    POINT p = { 0, 0 };
    // нарисовать белый квадрат
    hOldPen = (HPEN)SelectObject(hdc, hWhitePen);
    MoveToEx(hdc, 10, 10, &p);
    LineTo(hdc, 100, 10);
    LineTo(hdc, 100, 100);
    LineTo(hdc, 10, 100);
    LineTo(hdc, 10, 10);
 
 
    // нарисовать белую окружность
    SelectObject(hdc, hWhitePen);
    hOldBrush = (HBRUSH)SelectObject(hdc, hWhiteBrush);
    Ellipse(hdc, 10, 10, 100, 100);
 
    system("pause>0");
}
Почему только в консоли ничего не рисуется?
0
Заблокирован
19.04.2014, 06:40 4
Цитата Сообщение от Rvach_01 Посмотреть сообщение
Почему только в консоли ничего не рисуется?
Верхняя строка в main должна быть:

C++
1
HWND hW = GetConsoleWindow();
0
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
19.04.2014, 15:50  [ТС] 5
Спасибо, конечно.. Но у меня всё равно ничего не рисует.. Я уже три дня пытаюсь написать программу, которая просто рисует линию. В Visual C++. Просто линию. Из точки в точку. Однако я никак не могу найти работающей программы, что не программа - то ошибка.. Какие-то классы, структуры.. Мне нужна просто функция, рисующая отрезок из координаты в координату, я никак не могу разобраться .. Что нужно прописывать в начале программы, как нужно использовать LineToEx() (или LineTo() ) и MoveTo(), а также как нужно заканчивать программу.. Я уже перечитал кучу самоучителей и форумов, везде либо большие программы без комментариев, либо программы с кучей ошибок, которые отказывается компилировать Visual..
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
19.04.2014, 16:24 6
Приведите текст, который получился.
0
Заблокирован
19.04.2014, 16:26 7
Rvach_01,
По-вашему получается, что картинка в блоге - это фейк?
И человечек не то что не двигается, а даже не возникает?
Даже если копипастите код?
0
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
19.04.2014, 16:33  [ТС] 8
В программе с белыми квадратом и окружностью - компилирование завершается, открывается консоль с курсором и ожидание нажатия клавиши, после которого консоль закрывается. Всё. То есть пустая консоль

Добавлено через 1 минуту
А вот человечек возникает и двигается! Это красивое зрелище! Но я никак не могу разбить эту прогу на части - линии, окружность, движение...

Добавлено через 4 минуты
Вот пример программы, компилирующейся, с советами, прочитанными на разных форумах по устранению ошибок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <windows.h>
#include <iostream>
 
using namespace std;
 
int main(int argc, char **argv)
{
    HWND hW = GetConsoleWindow();
 
    //hwnd - дескриптор окна, в которое будем рисовать
    HDC hdc = 0;
    HDC hDC = GetDC(hW);
 
    //hdc - дескриптор контекста устройства
    HPEN hWhitePen, hOldPen;
    HBRUSH hWhiteBrush, hOldBrush;
 
    hWhitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    hWhiteBrush = CreateSolidBrush(RGB(255, 255, 255));
 
    POINT p = { 0, 0 };
    // нарисовать белый квадрат
    hOldPen = (HPEN)SelectObject(hdc, hWhitePen);
    MoveToEx(hdc, 10, 10, &p);
    LineTo(hdc, 100, 10);
    LineTo(hdc, 100, 100);
    LineTo(hdc, 10, 100);
    LineTo(hdc, 10, 10);
 
    // нарисовать белую окружность
    SelectObject(hdc, hWhitePen);
    hOldBrush = (HBRUSH)SelectObject(hdc, hWhiteBrush);
    Ellipse(hdc, 10, 10, 100, 100);
 
    system("pause>0");
}
Добавлено через 1 минуту
Ни в коем случае, не копипаст кода, просто в той теме, которую именно Вы мне посоветовали, не было комментов, поэтому я спросил тут, не судите строго и прошу прощения, если я сделал ужасную вещь
0
Заблокирован
19.04.2014, 17:00 9
Лучший ответ Сообщение было отмечено Rvach_01 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <Windows.h>
#include <iostream>
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
int main()
{   HWND hW = GetConsoleWindow();
 
//линия 
    Line(hW, 100, 100, 200, 200, RGB(255,255,255));
//окружность
    Circle (hW, 350, 50, 100, RGB(255,0,0), RGB (127,0,0));
    
 
    std::cin.get();
    return 0;
}
Добавлено через 1 минуту
Не трогайте функции, просто оставьте их наверху.

В main "заказывайте" свои линии и круги.
1
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
19.04.2014, 17:37 10
Цитата Сообщение от Rvach_01 Посмотреть сообщение
HDC hdc = 0;
HDC hDC = GetDC(hW);
Зачем два разных HDC?
Это основная ошибка.
И в конце рисования ресурсы надо освобождать,
см. пример IrineK
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
19.04.2014, 18:46 11
есть древняя книга, в первом томе которой вся эта кухня с контекстами, окнами, перьями и прочими GDI объектами не плохо описана:
Программирование для Windows 95 (том 1,2)
Год выпуска: 1997
Автор: Чарльз Петзольд
Издательство: BHV - Санкт-Петербург
ISBN: 5-469-00005-2
0
IrineK
19.04.2014, 18:59
  #12

Не по теме:

Цитата Сообщение от DU Посмотреть сообщение
есть древняя книга
У меня оба тома, с дискеткой.

0
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
20.04.2014, 01:23  [ТС] 13
IrineK, спасибо Вам большое! Попытаюсь разобраться, спасибо Вам!

Добавлено через 3 часа 4 минуты
Можно ещё вопрос?
Мне бы после рисунка очистить консоль, чтобы нарисовать ещё. system("cls"); почему-то не помогает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
 
using namespace std;
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
int main()
{
    HWND hW = GetConsoleWindow();
 
    Line(hW, 200, 10, 300, 10, RGB(5, 123, 217));                   //линия верхняя горизонтальная
    Line(hW, 250, 10, 250, 40, RGB(5, 123, 217));                   //линия средняя вертикальная
    Line(hW, 150, 40, 350, 40, RGB(5, 123, 217));                   //линия средняя горизонтальная
    Line(hW, 150, 40, 150, 130, RGB(5, 123, 217));                  //линия 
    Circle(hW, 150, 165, 35, RGB(5, 123, 217), RGB(100, 0, 0));     //окружность слева
    Line(hW, 350, 40, 350, 130, RGB(5, 123, 217));                  //линия 
    Circle(hW, 350, 165, 35, RGB(5, 123, 217), RGB(127, 0, 0));     //окружность справа
 
    system("pause>0");
    system("cls");
    Circle(hW, 250, 360, 10, RGB(255, 255, 0), RGB(255, 255, 0));
 
    system("pause>0");
    return 0;
}
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
20.04.2014, 01:45 14
попробуйте так:
C++
1
2
3
4
...
//system("cls");
InvalidateRect(hW, NULL, true);
...
Хотя что-то после этого не рисуется ничего. можно попробовать черный закрашенный прямоугольник нарисовать.
0
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
20.04.2014, 01:55  [ТС] 15
А мне необходимо после очистки консоли сделать рисунок Вот и ищу теперь
0
Заблокирован
20.04.2014, 03:27 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <Windows.h>
#include <iostream>
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
void Picture (HWND hW)
{   Line(hW, 200, 10, 300, 10, RGB(5, 123, 217));                   //линия верхняя горизонтальная
    Line(hW, 250, 10, 250, 40, RGB(5, 123, 217));                   //линия средняя вертикальная
    Line(hW, 150, 40, 350, 40, RGB(5, 123, 217));                   //линия средняя горизонтальная
    Line(hW, 150, 40, 150, 130, RGB(5, 123, 217));                  //линия 
    Circle(hW, 150, 165, 35, RGB(5, 123, 217), RGB(100, 0, 0));     //окружность слева
    Line(hW, 350, 40, 350, 130, RGB(5, 123, 217));                  //линия 
    Circle(hW, 350, 165, 35, RGB(5, 123, 217), RGB(127, 0, 0));     //окружность справа
 
}
 
void Erase (HWND hW)
{   COLORREF black = RGB (0,0,0);
    Line(hW, 200, 10, 300, 10, black);                   //линия верхняя горизонтальная
    Line(hW, 250, 10, 250, 40, black);                   //линия средняя вертикальная
    Line(hW, 150, 40, 350, 40, black);                   //линия средняя горизонтальная
    Line(hW, 150, 40, 150, 130, black);                  //линия 
    Circle(hW, 150, 165, 35, black, black);             //окружность слева
    Line(hW, 350, 40, 350, 130, black);                  //линия 
    Circle(hW, 350, 165, 35, black, black);             //окружность справа
}
 
 
int main()
{   HWND hW = GetConsoleWindow();
    ShowWindow(hW, SW_MAXIMIZE);
    Sleep (500);    //пауза, чтобы дать консоли развернуться
 
    Picture (hW);   //рисуем
    std::cin.get();
    Erase(hW);      //стираем
    Circle(hW, 250, 360, 10, RGB(255, 255, 0), RGB(255, 255, 0));
 
    std::cin.get();
    return 0;
}
Добавлено через 2 минуты
Нужно растянуть консоль. У вас последний круг внизу, за пределами стандартного размера.
1
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 38
20.04.2014, 14:00  [ТС] 17
Большое спасибо! Задача почти решена! Сейчас внесу последние корректировки и готово!
0
13 / 13 / 1
Регистрация: 31.12.2010
Сообщений: 131
Записей в блоге: 14
08.08.2015, 16:37 18
у меня строка
C++
1
HWND hW = GetConsoleWindow();
не работает, заменил на
C++
1
2
3
    char Title[1024];
    GetConsoleTitle(Title, 1024); // Узнаем имя окна
    HWND hW = FindWindow(NULL, Title); // Узнаем hwnd окна
и заработало.
Компилировал в Dev C++
1
08.08.2015, 16:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2015, 16:37
Помогаю со студенческими работами здесь

Нарисовать движущийся по большой окружности маленький кружочек
Нарисовать движущийся по большой окружности маленький кружочек.

Движущийся человечек.Анимация
Движущийся человечек.Анимация

Бедный человечек
Всем привет! Возможно всем, известное приложение &quot;Человечек-мазохист&quot; в котором пользователь мышкой...

Анимация, человечек
Программа человек , нужно сделать программу чтоб мы могли управлять человеком с помощью стрелок.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru