Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программирование видеопамяти в ВorlandC++. Помогите доделать последнюю функцию.

44K
21 января 2009 года
NamelessEndless
3 / / 08.01.2009
Задание: в текстовом режиме вывести текстовое окно размером 25х6, заполнить его любым текстом. При нажатии комбинации клавиш Alt+L строка, на которой стоит курсор сдвигается влево, символы, что попадают за границу окна - "вылетают", при нажатии Alt+R - аналогично, только сдвиг строки в правую сторону. При нажатии Alt+Q - возобновление начального изображения на странице.
Проблема: окно выводит, заполняет текстом, сдвиг влево осуществляется. Все прекрасно, но не могу запрограмировать сдвиг вправо. Короче говоря, я уже просто зациклилась и не вижу ошибок. Помогите, пожалуйста исправить функцию MoveRight. Подозреваю, что это аналогично со смещением влево, но уже не в состоянии писать.
Код:
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <alloc.h>
#include <dos.h>
#define AltR 19
#define AltL 38
#define AltQ 16

void CreateWindow(int,int,int,int,int,int,char*); //создает окно
void PutText (char *); //выводит текст
int MoveCursor (void); //отвечает за движение курсора
void MoveLeft (int,int,int);//сдвиг строки влево
void MoveRight (int,int,int);//сдвиг строки вправо

int ww=25, wh=6;
int  x1=(80-ww)/2+1; // координаты окна
int  y1=(25-wh)/2+1;
int  x2=x1+ww-1;
int  y2=y1+wh-1;

void main ()
{

  char txt[]="Sweet little word made for silence,not tolk.Young heart for love(c)";
  int k;
  struct text_info win;
  unsigned *buf, size=79*24*2;
  clrscr();
  gettextinfo(&win);
  window(1,1,80,25);
  puts("Start image");
  buf=(unsigned*)malloc(size);
  gettext(1,1,80,25,buf);
  getch();

  clrscr();
  CreateWindow (x1,y1,x2,y2,0,7,"Nameless");
  PutText (txt);
  do
  k=MoveCursor();
  while(k);
  getch();

 window(1,1,80,25);
 puttext(1,1,80,25,buf);
 getch();


}

int MoveCursor (void)
{    int key,x,y;
     int winw,winh;

     struct text_info win;
     gettextinfo(&win);
     x=win.curx;
     y=win.cury;

     key=getch();
     if (key==AltQ) return 0;
     switch (key) {
    case 77:if(x<x2-x1) x++; break;
    case 80:if(y<y2-y1) y++; break;
    case 75:if(x>1) x--; break;
    case 72:if(y>1) y--; break;
    case 38: if (x==x2-x1-1) printf(" ");      //AltL
        else
        MoveLeft(y1+y,x1+1,x2-2);
        gotoxy(x2-x1-1,y);
        printf(" "); break;
    case 19: if (x==x2-x1-1) printf(" ");      //AltR
        else MoveRight(y+y1,x1+x,x2-2);
        gotoxy(x2-x1-1,y);
        printf(" "); break;
    default: return -1;
     }
     gotoxy(x,y);
     return 1;
}

void PutText (char * text)
{  char *ps=text;
   while (*ps!='\0') {
      putch(*ps++);
   }
   putch('\r');
   putch('\n');

}

void CreateWindow (int x1, int y1, int x2, int y2,int scol, int bgcol, char * title)
{   int x,y;

     window(1,1,80,25);
     textcolor(scol);
     textbackground(bgcol);
     gotoxy(x1,y1);
     putch(218);
     for (x=x1+1; x<x2; x++)
     putch(196);
       putch(191);
     for (y=y1+1; y<y2; y++) {
      gotoxy(x1,y);
      putch(179);
      gotoxy(x2,y);
      putch(179);
     }
     gotoxy(x1,y2);
     putch(192);
     for (x=x1+1; x<x2; x++)
    putch(196);
      putch(217);
      if (*title!=0){
     x=(x2-x1+1-(strlen(title)+2))/2;
     if (x>1) {
        gotoxy(x1+x+1,y1);
        putch(180);
        cputs(title);
        putch(195);
      }
    }
    window(x1+1,y1+1,x2-1,y2-1);
    clrscr();
  }

void MoveLeft(int k,int x1,int x2)
{
    unsigned far *adr=(unsigned far*)MK_FP(0xb800,0);

    adr+=(k-1)*80+(x1-1);

    while (x1<=x2)
    {
        *adr=*(adr+1);
        adr++;
        x1++;
    }

}
void MoveRight(int k,int x1,int x2)  //здесь нужна помощь...
{
    unsigned far *adr=(unsigned far*)MK_FP(0xb800,0);

    adr+=(k-1)*80+(x1-1);

    while (x1<=x2)
    {
        *adr=*(adr-1);
        adr--;
        x1++;
    }
   
}


Все исполняется на борланд си++.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог