Witam.
Kompilator to dev c++ , system Windows 10.
Mam problem z wyświetleniem jedengo konkretnego znaku o numerze 219.
Program jest banalnie prosty, tworzy tablicę imion, wyświetla ramkę, wypełnia jej wnętrze zawartością tablicy, i w zależności od przyciśniętego klawisza strzałki w górę lub w dół przesuwa kursor i podświetla dany element.
Na początku programu kiedy wyświetlam w pętli znaki ascii o numerach od 0 do 255 wyświetla się tak jak powinien, problem pojawia się zapewne po użyciu funkcji SetConsoleTextAttribute(). Zamiast znaku o numerze kodu 219 pojawiają się jakieś niebieskie cienkie pionowe linie po prawej stronie końca łancucha znaków(tych o numerze 219) czasem czerwone po lewej stronie stronie tam gdzie łańcuch powinien się zaczynać.
Problematyczną wydaje się funkcja "rysuj_kursor()".
Jeśli ktoś by coś mógł doradzić byłbym wdzięczny.
Kod to:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
using namespace std;
char tab[10][30]; // tablica imion
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); // Uchwyt do konsoli
// funkcja przenosząca kursor do nowego miejsca
void gotoxy(short x, short y) {COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}
// funkcja ukrywająca kursor
void hidecursor(){
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO info;
info.dwSize = 100;
info.bVisible = FALSE;
SetConsoleCursorInfo(consoleHandle, &info);}
void rysuj_kursor(int pozycja){
SetConsoleOutputCP(850);
SetConsoleTextAttribute(console, 0x07);
int poz=2;
for(int i=0;i<9;i++){
gotoxy(2,poz+i);
printf("%s",tab[i]);}
gotoxy(2,pozycja+2);
SetConsoleTextAttribute(console, 0x70);
// PROBLEMATYCZNY FRAGMENT !!!!!
// NIE WYPISUJE ZNAKU BLOKU (219) TYLKO RYSUJE JAKĄŚ NIEBIESKĄ LINIĘ PIONOWO
for(int u=2;u<18;u++){
gotoxy(u,pozycja+2);
printf("%c",219);
//cout<<(unsigned char)219; też nie działa
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
gotoxy(2,pozycja+2);
printf("%s",tab[pozycja]);}
void rysuj_ramke(){
short start_x,start_y;
start_x=1;start_y=8;
// gorna pozioma
gotoxy(start_x,1);printf("%c",201);gotoxy(25,1);printf("%c",187);
for(int i=0;i<24;i++){gotoxy(i+start_x,1);printf("%c",205);}
gotoxy(start_x,1);
printf("%c",201);
// dolna pozioma
gotoxy(start_x,1+10);
printf("%c",200);
gotoxy(25,1+10);
printf("%c",188);
for(int i=0;i<24;i++){gotoxy(i+start_x,1+10);printf("%c",205);}
gotoxy(start_x,1+10);
printf("%c",200);
for(int i=1;i<10;i++){gotoxy(start_x,i+1);printf("%c",186);gotoxy(start_x+24,i+1);printf("%c",186);}}
void przygotuj_tablice(){strcpy(tab[0],"Zygmunt");
strcpy(tab[1],"Stefan");
strcpy(tab[2],"Robert");
strcpy(tab[3],"Maciej");
strcpy(tab[4],"Andrzej");
strcpy(tab[5],"Jozef");
strcpy(tab[6],"Stanislaw");
strcpy(tab[7],"Grzegorz");
strcpy(tab[8],"Tomasz");}
int main()
{
hidecursor();
char z;
int pozyc=0;
przygotuj_tablice();
rysuj_ramke();
rysuj_kursor(0);
do{
z=getch();
if(z!=27){
if(z==80 && pozyc<8){pozyc++;rysuj_kursor(pozyc);}
if(z==72 && pozyc>0){pozyc--;rysuj_kursor(pozyc);}}
}while(z!=27);
return 0;
}
Na załączonym zdjęciu widać te czerwone pionowe kreski tam gdzie powinien być wyświetlany początek łańcucha znaków i niebieskie na jego końcu.