• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Графика C++

schartem

Ученик
Регистрация
17 Май 2011
Сообщения
7
Реакции
0
Баллы
0
Графика C++

Написал простую программу по графике, в которой кружок перемещается по диагонали при нажатии клавиши "вправо", а при нажатии клавиши "esc" выходит из программы. Пришел в универ и оказалось, что не полностью понял задание.
Вот код моей программы
#include <stdio.h>
#include <graph.h>
#include <malloc.h>
#include <conio.h>

short c[4] = {10, 405, 75, 470};

int main()
{
short pm, sx=0, sy=0;
int cc, ab, count=0;
long l;
char *o, *z;
struct videoconfig gs;
_setvideomode (_VRES16COLOR);
_getvideoconfig (&gs);
l=_imagesize (10, 405, 75, 470);
o=calloc ((size_t)l, sizeof (char));
_getimage (10, 405, 75, 470, o);
_setcolor (4);
_ellipse (_GFILLINTERIOR, 10, 405, 75, 470);
_setcolor (1);
_ellipse (_GFILLINTERIOR, 15, 415, 50, 460);
_setcolor (3);
_ellipse (_GFILLINTERIOR, 17, 420, 37, 440);
z=calloc ((size_t)l, sizeof(char));
_getimage (10, 405, 75, 470, z);
while (1) {
if (kbhit()) {
ab = getch();
if (ab == 77)
break;
else if (ab == 27)
goto exit;

}
}

while (1)
{
if (kbhit())
{
cc = getch();
if (cc==27) break;
else continue;
}
else
{
if (count==0)
{
if ((c[2]<gs.numxpixels-5)||(c[1]>5))
{
_putimage (c[0], c[1], o, _GPSET);
c[0]+=6; c[1]-=4; c[2]+=6; c[3]-=4;
_getimage (c[0], c[1], c[2], c[3], o);
_putimage (c[0], c[1], z, _GPSET);
}
else count=1;
}
if (count==1)
{
if ((c[0]>5)||(c[3]<gs.numypixels-5))
{
_putimage (c[0], c[1], o, _GPSET);
c[0]-=6; c[1]+=4; c[2]-=6; c[3]+=4;
_getimage (c[0], c[1], c[2], c[3], o);
_putimage (c[0], c[1], z, _GPSET);
}
else count=0;
}

}

}

exit:
free (o);
free (z);

_setvideomode (_DEFAULTMODE);

return 0;}
Так вот , надо переделать программу, чтобы в ней было некое меню с клавишами "вправо" "вверх" "влево" "вправо" , которые бы выбирались с помощью клавиш-стрелок на клавиатуре, и при нажатии которых бы выполнялось действие, соответствующее названию клавиши.
Я вообще не понимаю как это сделать. помогите кто может:tehnari_ru_281:
 
По-идее, упомянутое вами меню можно выполнить в виде залитого прямоугольника, на который поместить еще 4 малых прямоугольника. Вам нужно перехватывать события нажатия управляющей кнопки, сдвигать объект по экрану и перекрашивать временно соответствующую кнопку.
 
о, Зея, много времени в детстве там провел)

как графически сделать это меню, я понимаю. но не понимаю как функционально оно должно работать. т.е каким образом программа понимает нажатие именно той области(той кнопки)
 
А вы перехватывайте событие нажатия кнопки, а на консоль выводите просто измененную картинку. Фактически вы это уже реализовали, вам осталось только добавить коды других клавиш и вывести панель с кнопками. Насколько я понял техзадание, управление происходит при помощи клавиатуры, следовательно, абсолютно наплевать, какая именно область нажата, программа управляется только кодами клавиш :))
 
Нет, нет, в том то и проблема, что мы должны с помощью клавиатуры выбрать нужную кнопку на экране, зажать клавишу Enter и двигать в нужное направление...
 
Тогда вам нужно будет реализовать фокус выделения (обычный незакрашенный прямоугольник), который можно перемещать в определенном направлении. Для перемещения введите дополнительную конструкцию, в которой отслеживайте нажатия управляющих клавиш. Получить информацию о том, какая именно кнопка в фокусе проще простого - анализируйте координату прямоугольника :)). Выход из конструкции реализуйте по нажатии клавиши Esc, а смещение объекта со сменой координат - по нажатии Enter (код 13), отслеживая текущее положение фокуса выделения :))
 
а ведь пустой треугольник внутри закрашен черным? и при перемещении он будет закрашивать клавиши?
 
С чего бы это прямоугольник стал треугольником? :)) Вообще-то можно устанавливать стили заливки области :)

Какой средой пользуетесь?
 
я имел ввиду прямоугольник)

quick c
 
и есть ли какой-нибудь хороший справочник по графике в сети?
 
ведь если мы будем использовать функцию _getimage то он помимо этой рамки будет копировать и всю кнопку внутри? я не очень понимаю как это осуществить, если можешь, напечатай эту часть программы
 
Назад
Сверху