#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++;
}
}
Программирование видеопамяти в ВorlandC++. Помогите доделать последнюю функцию.
Проблема: окно выводит, заполняет текстом, сдвиг влево осуществляется. Все прекрасно, но не могу запрограмировать сдвиг вправо. Короче говоря, я уже просто зациклилась и не вижу ошибок. Помогите, пожалуйста исправить функцию MoveRight. Подозреваю, что это аналогично со смещением влево, но уже не в состоянии писать.
Код:
Все исполняется на борланд си++.