Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2012, 13:45   #1
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию цвет в консоле

Есть задание:
вывод текста на экран
по нажатию поочередно выделять каждое предложение
определить количество предложений в тексте.

Меня интересует ПООЧЕРЕДНОЕ ВЫДЕЛЕНИЕ.
Как я понял задачу надо решить с использованием цвета в консоле.
Помогите найти материал для решения этой задачи.
Пока нашел вот это:
WriteConsoleOutputCharacter - выводит ряд символов в последовательные ячейки экранного буфера консоли, начинающиеся в заданном месте.
WriteConsoleOutputAttribute - выводит ряд атрибутов символа последовательных ячеек экранного буфера консоли, начинающегося в заданном месте.
ReadConsoleOutput - читает символьные данные и данные об атрибутах цвета из прямоугольного блока символьных знакомест в экранном буфере консоли, и записывает данные прямоугольного блока в заданном местоположении в буфере назначения.
WriteConsoleOutput - записывает символ и данные атрибута цвета в заданном прямоугольном блоке символьных знакомест в экранном буфере консоли. Данные, которые будут записаны, берутся из прямоугольного блока соответствующего размера в заданном месте в исходном буфере.
еще нашел один сайт, но функции почему-то не могу применить. Выдает ошибку.
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 25.07.2012, 20:55   #2
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Выходит - это никого не интересует.
Трудно, когда не знаешь английского (изучаю немецкий).
Пользовался googl переводчиком, но мало помогло http://msdn.microsoft.com/en-us/libr...%3Dvs.85).aspx

Лазил по форуму и ничего не нашел на эту тему (может пропустил)
Выкладываю работающий код решеной задачи с использованием цвета

Код:
/*
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки не более 70)
 Написать программу, которая:
 1 выводит текст на экран дисплея
 2 по нажатию произвольной клавиши поочередно выделяет каждое предложение текста
 3 определить количество предложений в тексте
*/

#include<iostream>
#include<string>
#include"stdafx.h"
#include<WinCon.h>
#include<fstream>
#include<Windows.h>
#include <stdio.h>
#include <conio.h> 
using namespace std;

void menu(){
	cout 
		<< "               МЕНЮ: \n"
		<< "1 Вывод текста на экран дисплея\n"
		<< "2 Поочередное выделение предложений текста\n"
		<< "3 Определение количества предложений в тексте\n"
		<< "ESC Выход";
}

string TextWrite(){
	system("cls");								// отчистка экрана
	char buf[71];								// строка в файле не более 70 символов
	string adress;		
	cout << "Введите адрес существующего файла\n"
		<< "Например c:\\\\cpp\\\\text.txt \n";
	cin >> adress;
	fstream f(adress);
	if (!f.is_open()){
		cout << "Ошибка открытия файла\n";
		system("PAUSE");
		f.close();
		TextWrite();							// новая попытка ввести правильный путь
	}
	system("cls");
	while(!f.eof()){							// пока не дошли до конца файла
		f.getline(buf, 71);						// считываем предложения
		cout << buf << endl;					// и выводим на экран
	}
	f.close();
	system("PAUSE");
	return adress; 
}

int selectColor(string adress){
	void * hStdout = GetStdHandle(STD_OUTPUT_HANDLE);		// получение прав
	DWORD mn;
	WORD wColors=14;										// установка цвета
	COORD cCoord;											// координата "ячейки" экрана

	char buf[71], key;
	int i=-1, y=-1;
	do{
	system("cls");
	i=-1;
	fstream f(adress);										
	if(!f.is_open()){										// если файл не открывается требуется выполнить первый пункт меню
		cout << "Файл не открыт\n"
			<< "Выполните первый пункт меню\n";
		system("PAUSE");
		break;
	};
	
	while(!f.eof()){												// вывод текста					
		f.getline(buf, 71);
		cout << buf << endl;
		i++;														// подсчет предложений
	}
	y++;															// смена строки
	if (y>=i) y=0;													// переход на первую строку если уже было выделенно последнее предложение
	for(int i=0; i<70; i++){										// цикл закраски всей строки
		cCoord.X=i;													// указатель символа в строки
		cCoord.Y=y;													// указатель строки
    WriteConsoleOutputAttribute(hStdout, &wColors, 1, cCoord, &mn); // установка атрибута цвета на соответствующий символ
	}
	f.close();
	} while (key=getch()!=27);										// выход по ESC
		

	return 0;
};

int countString(string adress){
	
	char buf[71];								// строка в файле не более 70 символов
	int i=-1;									// количество строк

	fstream f(adress);							// открытие файла
	system("cls");								// отчистка экрана
	if (!f.is_open()){							// если файл не открывали то количество строк 0
		cout << "Количество строк: 0\n";
		system("PAUSE");
		return 0;
	}
	
	while(!f.eof()){							// пока не дошли до конца файла
		f.getline(buf, 71);						// считываем предложения
		cout << buf << endl;					// и выводим на экран
		i++;									// подсчет предложений
	}
	cout 
		<< "Количество строк: \n" << i			
		<< " \n";
	f.close();
	system("PAUSE");
	return 0;
};

void main(){
	setlocale(LC_ALL, "RUS");
	
	char key;							// символ нажатой клавиши
	string adress;						// путь открываемого файла в функции TextWrite()

	do {								// начало цикла выбора пункта меню
		system("cls");					// отчистка экрана
		menu();							// вызов функции отображения пунктов меню
		key=getch();						
		switch (key){
			case '1':
				adress=TextWrite();		// вызов функции вывода текста
				break;
			case '2':
				selectColor(adress);	// вызов функции смена цвета предложений
				break;
			case '3':
				countString(adress);	// подсчет количества предложений
				break;
		}
	} while (key!=27);					// выход по ESC
	
}
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 25.07.2012, 21:05   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вызывать SetConsoleTextAttribute перед выводом и все.

первый параметр это GetStdHandle(STD_OUTPUT_HANDLE)
второй константы аттрибутов, они описаны по ссылке.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.07.2012, 10:07   #4
LancX
Пользователь
 
Аватар для LancX
 
Регистрация: 30.04.2012
Сообщений: 52
По умолчанию

Пример к посту выше
Код:
#include <iostream>
#include <Windows.h>

using namespace std;

void main(){
	HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

	for(int i=0;i<270;i++)
        {
		SetConsoleTextAttribute(hConsole,i);
		cout<<"i: "<<i<<" Color\t"<<endl;
	}
}
При любом расчете, число, правильность которого для всех очевидна, становится источником ошибок.
LancX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
3D в консоле =) #include <Markus> Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 28.01.2012 18:46
Можно ли в консоле поменять цвет букв и цифр Endrels Общие вопросы C/C++ 2 14.08.2010 20:14
Каким образом можно изменять цвет фона и цвет шрифта в Label? jungle Win Api 17 21.09.2009 00:38
Как с помощью JavaScript изменить цвет фона ячеек в таблице,так что бы можно было выбрать цвет из списка Gotessa JavaScript, Ajax 1 09.05.2009 16:05
Псевдографика в консоле Spice Общие вопросы .NET 2 23.12.2008 13:41