Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
18.04.2014, 22:58     Движущийся человечек в консоли #1
Доброго времени суток, уважаемые форумчане. Начал работать с графикой (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;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,704
18.04.2014, 22:59     Движущийся человечек в консоли #2
Что комментировать-то? Открой справочник по функциям WinAPI, там они все описаны.
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
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");
}
Почему только в консоли ничего не рисуется?
IrineK
Заблокирован
19.04.2014, 06:40     Движущийся человечек в консоли #4
Цитата Сообщение от Rvach_01 Посмотреть сообщение
Почему только в консоли ничего не рисуется?
Верхняя строка в main должна быть:

C++
1
HWND hW = GetConsoleWindow();
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
19.04.2014, 15:50  [ТС]     Движущийся человечек в консоли #5
Спасибо, конечно.. Но у меня всё равно ничего не рисует.. Я уже три дня пытаюсь написать программу, которая просто рисует линию. В Visual C++. Просто линию. Из точки в точку. Однако я никак не могу найти работающей программы, что не программа - то ошибка.. Какие-то классы, структуры.. Мне нужна просто функция, рисующая отрезок из координаты в координату, я никак не могу разобраться .. Что нужно прописывать в начале программы, как нужно использовать LineToEx() (или LineTo() ) и MoveTo(), а также как нужно заканчивать программу.. Я уже перечитал кучу самоучителей и форумов, везде либо большие программы без комментариев, либо программы с кучей ошибок, которые отказывается компилировать Visual..
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
19.04.2014, 16:24     Движущийся человечек в консоли #6
Приведите текст, который получился.
IrineK
Заблокирован
19.04.2014, 16:26     Движущийся человечек в консоли #7
Rvach_01,
По-вашему получается, что картинка в блоге - это фейк?
И человечек не то что не двигается, а даже не возникает?
Даже если копипастите код?
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
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 минуту
Ни в коем случае, не копипаст кода, просто в той теме, которую именно Вы мне посоветовали, не было комментов, поэтому я спросил тут, не судите строго и прошу прощения, если я сделал ужасную вещь
IrineK
Заблокирован
19.04.2014, 17:00     Движущийся человечек в консоли #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 "заказывайте" свои линии и круги.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
19.04.2014, 17:37     Движущийся человечек в консоли #10
Цитата Сообщение от Rvach_01 Посмотреть сообщение
HDC hdc = 0;
HDC hDC = GetDC(hW);
Зачем два разных HDC?
Это основная ошибка.
И в конце рисования ресурсы надо освобождать,
см. пример IrineK
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.04.2014, 18:46     Движущийся человечек в консоли #11
есть древняя книга, в первом томе которой вся эта кухня с контекстами, окнами, перьями и прочими GDI объектами не плохо описана:
Программирование для Windows 95 (том 1,2)
Год выпуска: 1997
Автор: Чарльз Петзольд
Издательство: BHV - Санкт-Петербург
ISBN: 5-469-00005-2
IrineK
19.04.2014, 18:59
  #12

Не по теме:

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

Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
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;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.04.2014, 01:45     Движущийся человечек в консоли #14
попробуйте так:
C++
1
2
3
4
...
//system("cls");
InvalidateRect(hW, NULL, true);
...
Хотя что-то после этого не рисуется ничего. можно попробовать черный закрашенный прямоугольник нарисовать.
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
20.04.2014, 01:55  [ТС]     Движущийся человечек в консоли #15
А мне необходимо после очистки консоли сделать рисунок Вот и ищу теперь
IrineK
Заблокирован
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 минуты
Нужно растянуть консоль. У вас последний круг внизу, за пределами стандартного размера.
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
20.04.2014, 14:00  [ТС]     Движущийся человечек в консоли #17
Большое спасибо! Задача почти решена! Сейчас внесу последние корректировки и готово!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2015, 16:37     Движущийся человечек в консоли
Еще ссылки по теме:

C++ Игра в консоли
Звук в консоли C++
C++ Изображение на консоли

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

Или воспользуйтесь поиском по форуму:
fair7
8 / 8 / 0
Регистрация: 31.12.2010
Сообщений: 81
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++
Yandex
Объявления
08.08.2015, 16:37     Движущийся человечек в консоли
Ответ Создать тему
Опции темы

Текущее время: 11:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru