Как я могу использовать такие манипуляторы, как setfill
а также setw
неоднократно, не нарушая вывод, который происходит ниже другого, что я спрашиваю, я хочу создать текстовое окно, не используя функции win32, но сделанную версию в командной строке, я пытаюсь использовать IO манипуляторы, чтобы создать форму окна используя персонаж, которого я выбрал в своей программе, но что происходит,
cout <<setfill(width) << setfill(style)
хотите заполнить верхнюю часть с помощью x, оставьте только нижнюю часть и установите нижнюю часть переменной строки заголовка
cout <<endl<< titleBar << setw(width) << "[_][]][x]" << endl;
#include <iostream>
#include <iomanip>
using namespace std;class window
{
public:
window(const char * title)
{
windowTitle = title;
}
void createWindow(int width,int height,char windowStyle,const char * titleBar,const char * windowClass)
{
char style = windowStyle;
cout <<setw(width) <<setfill(style) <<setw(0) <<endl;
cout << titleBar << setw(width) << "[_][]][x]" <<endl;
cout <<setw(width) <<setfill(style) <<setw(0) <<endl;
}
const char * getTitle() const { return windowTitle; }
private:
const char * windowTitle;
const char * windowClass;
};
int main ()
{
window myWindow("Windows Programming");
myWindow.createWindow(50,100,'x',myWindow.getTitle(),"windowclass");
system("pause");
return 0;
}
Я не могу сказать, что полностью понимаю вопрос, но сброс заполнения и ширины может быть сделан, как показано:
void createWindow(int width,int height,char windowStyle,const char * titleBar,const char * windowClass)
{
char style = windowStyle;
char prev_char = cout.fill(style);
cout << setw(width) << "" << endl;
cout.fill(prev_char);
cout << titleBar << setw(width - strlen(titleBar)) << "[_][]][x]" <<endl;
cout << setw(width) << setfill(style) << "" << endl;
}
Основная идея состоит в том, чтобы использовать соответствующие функции-члены из cout, которые возвращают предыдущее значение, которое вы можете позже использовать для сброса заполнения / ширины. Запуск этого кода даст следующий результат:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Windows Programming [_][]][x]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Обновить:
Я обновил код, чтобы дать вам лучшее объяснение.
функции setw и setfill в основном модифицируют некоторые внутренние флаги / переменные std :: ostream. setfill постоянно изменяет символ заливки, но setw изменяет только ширину следующего элемента. Итак, давайте проанализируем код.
Вместо использования setfill, я вызываю метод напрямую из std :: ostream, чтобы установить значение заполнения. Основная причина, по которой я это делаю, заключается в том, что она возвращает предыдущее значение, которое она содержала, чтобы я мог восстановить позже:
char prev_char = cout.fill(style);
Следующим шагом будет распечатать «строку заголовка» или как бы вы ее не называли. Для этого я установил ширину с setw к предоставленному параметру. Как я уже говорил, ширина применяется только к следующему печатному элементу, поэтому ширина символы значения стиль печатаются перед пустой строкой:
cout << setw(width) << "" << endl;
В следующей строке мы просто восстанавливаем исходное значение заполнения, которое, скорее всего, просто пробел:
cout.fill(prev_char);
Затем мы печатаем строку заголовка и кнопки, но применяем новую ширину, чтобы заполнить пространство между текстом заголовка и кнопками пробелами:
cout << titleBar << setw(width - strlen(titleBar)) << "[_][]][x]" <<endl;
Наконец, мы печатаем еще одну строку иксы размера ширина, но поскольку у нас уже есть оригинальный символ заполнения, сохраненный в переменной, мы можем напрямую использовать функцию setfill:
cout << setw(width) << setfill(style) << "" << endl;