Форум программистов, компьютерный форум CyberForum.ru

Как сделать такой вывод? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 08:11     Как сделать такой вывод? #1
Предположим, у меня есть
C++
1
2
3
4
5
6
7
8
9
10
11
class TLadle
{
public:
    double Radius;
    double Height;
};
class TModel
{
public:
    TLadle Ladle;
};
и я хочу вывести так:
Model={
Model={Ladle={
Model={Ladle={Radius=3.4,
Model={Ladle={Height=4.2,
Model={Ladle=}
Model=}
. К белому тексту не приглядывайтесь, считайте, что его нет, я просто и на форуме не смог придумать лучшего способа сравнять текст. Как это сделать? Только через GDI.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 17:06     Как сделать такой вывод? #21
Цитата Сообщение от taras atavin Посмотреть сообщение
Какой нафиг << endl;? Ты гуй от консоли вообще отличаешь?
Я же написал:
Цитата Сообщение от Xind Посмотреть сообщение
только Вам нужно воспользоваться функцией SetWindowText() здесь есть примеры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 17:06  [ТС]     Как сделать такой вывод? #22
Цитата Сообщение от Xind Посмотреть сообщение
SetWindowText()
И как она мне текст сравняет? Она ващето для заголовков окон предназначена.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 17:08     Как сделать такой вывод? #23
Цитата Сообщение от taras atavin Посмотреть сообщение
И как она мне текст сравняет? Она ващето для заголовков окон предназначена.
Господи.
Посмотрите пример talis который он дал
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 17:08  [ТС]     Как сделать такой вывод? #24
Цитата Сообщение от Xind Посмотреть сообщение
Я же написал:
Сообщение от Xind
только Вам нужно воспользоваться функцией SetWindowText()
Поток к гую она тем более не прикрутит.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 17:10     Как сделать такой вывод? #25
taras atavin, прикрутит. Посмотрите мой пример.
sandye51
14.11.2011, 17:12
  #26

Не по теме:

Jupiter, а теперь мой пример посмотри
и засунь его в свой компилятор, работает?) в моем нет, а на онлайне - да

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 18:00  [ТС]     Как сделать такой вывод? #27
Цитата Сообщение от Xind Посмотреть сообщение
TextOut()
Ну она то мне известна, только как для неё правильно обработать x? Мне же надо, чтоб вторая строчка начиналась правее, а последняя - перед скобкой первой строки. Есть какая нибудь функция измерения экранной ширины текста?

Добавлено через 6 минут
Цитата Сообщение от Xind Посмотреть сообщение
Посмотрите пример talis который он дал
Неравномерный шрифт + выравнивание пробелами. Я даже в офисе заставил бы студента такой текст переделывать и ставить табуляции/границы абзацев.
talis
14.11.2011, 18:08
  #28

Не по теме:

taras atavin, ну так поставьте всё, что вам нужно - шрифт, выравнивание какое там хотите.

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 18:57  [ТС]     Как сделать такой вывод? #29
Почти сделал, не хватает числовых значений размеров:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
class TLength
{
public:
    double Value;
    void Output(HDC Context, int &x, int &y, char *Name);
};
class TLadle
{
public:
    TLength Radius;
    TLength Height;
    void Output(HDC Context, int &x, int &y, char *Name);
};
class TModel
{
public:
    TLadle Ladle;
    void Output(HDC Context, int &x, int &y, char *Name);
};
void TModel::Output(HDC Context, int &x, int &y, char *Name)
{
 char *p;
 SIZE  Size; 
 int   h;
 int   XBuffer;
 GetTextExtentPoint32( Context,
                       "Q"    ,
                       1      ,
                      &Size   );
 h=Size.cy;
 for (p=Name; *p!=0; ++p)
 {
  TextOut(Context,
          x      ,
          y      ,
          p      ,
          1      );
  GetTextExtentPoint32( Context,
                       p      ,
                       1      ,
                      &Size   );
  x+=Size.cx;  
 }
 TextOut(Context, x, y, "={", 2);
 GetTextExtentPoint32( Context,
                       "={"    ,
                       2      ,
                      &Size   ); 
 x+=Size.cx; 
 y+=h;
 XBuffer=x;
 Ladle.Output(Context,
              x      ,
              y      ,
              "Ladle");
 GetTextExtentPoint32( Context,
                       "{"    ,
                       1      ,
                      &Size   );
 x=XBuffer;
 x-=Size.cx;
 TextOut(Context, x, y, "}", 1);
 y+=Size.cy;
}
void TLadle::Output(HDC Context, int &x, int &y, char *Name)
{
 char *p;
 SIZE  Size; 
 int   h;
 int   XBuffer;
 GetTextExtentPoint32( Context,
                       "Q"    ,
                       1      ,
                      &Size   );
 h=Size.cy;
 for (p=Name; *p!=0; ++p)
 {
  TextOut(Context,
          x      ,
          y      ,
          p      ,
          1      );
  GetTextExtentPoint32( Context,
                       p      ,
                       1      ,
                      &Size   );
  x+=Size.cx;  
 }
 TextOut(Context, x, y, "={", 2);
 GetTextExtentPoint32( Context,
                       "={"    ,
                       2      ,
                      &Size   ); 
 x+=Size.cx; 
 y+=h;
 XBuffer=x;
 Radius.Output(Context ,
               x       ,
               y       ,
               "Radius");
 y-=h;
 TextOut(Context,
         x      ,
         y      ,
         ","    ,
         1      ); 
 GetTextExtentPoint32( Context,
                       ","    ,
                       1      ,
                      &Size   );
 y+=h;
 x=XBuffer;
 Height.Output(Context ,
               x       ,
               y       ,
               "Height");
 GetTextExtentPoint32( Context,
                       "{"    ,
                       1      ,
                      &Size   );
 x=XBuffer;
 x-=Size.cx;
 TextOut(Context, x, y, "}", 1);
 y+=Size.cy;
}
void TLength::Output(HDC Context, int &x, int &y, char *Name)
{
 char *p;
 SIZE  Size; 
 int   h;
 GetTextExtentPoint32( Context,
                       "Q"    ,
                       1      ,
                      &Size   );
 h=Size.cy;
 for (p=Name; *p!=0; ++p)
 {
  TextOut(Context,
          x      ,
          y      ,
          p      ,
          1      );
  GetTextExtentPoint32( Context,
                       p      ,
                       1      ,
                      &Size   );
  x+=Size.cx;  
 }
 TextOut(Context,
         x      ,
         y      ,
         "="    ,
         1      );
 GetTextExtentPoint32( Context,
                      "="     ,
                      1      ,
                     &Size   );
 x+=Size.cx; 
 y+=h;
}
,
Миниатюры
Как сделать такой вывод?  
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 18:58  [ТС]     Как сделать такой вывод? #30
Как вывести double?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 18:59     Как сделать такой вывод? #31
sprintf, std::ostringstream...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 19:02  [ТС]     Как сделать такой вывод? #32
Цитата Сообщение от talis Посмотреть сообщение
std::ostringstream
В какой голове валяется сам std::ostringstream, в какой класс строк и как зовут этот класс?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 19:04     Как сделать такой вывод? #33
Референс с примерами.

Добавлено через 46 секунд
Класс строк зовут std::string, лежит в <string>
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 19:19  [ТС]     Как сделать такой вывод? #34
Сделал:
Изображения
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 19:20  [ТС]     Как сделать такой вывод? #35
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
void TLength::Output(HDC Context, int &x, int &y, char *Name)
{
 char               *p;
 SIZE                Size;
 int                 h;
 int                 L;
 int                 i;
 char                c;
 std::ostringstream  text(std::ostringstream::out);
 GetTextExtentPoint32( Context,
                       "Q"    ,
                       1      ,
                      &Size   );
 h=Size.cy;
 for (p=Name; *p!=0; ++p)
 {
  TextOut(Context,
          x      ,
          y      ,
          p      ,
          1      );
  GetTextExtentPoint32( Context,
                       p      ,
                       1      ,
                      &Size   );
  x+=Size.cx;
 }
 TextOut(Context,
         x      ,
         y      ,
         "="    ,
         1      );
 GetTextExtentPoint32( Context,
                      "="     ,
                      1      ,
                     &Size   );
 x+=Size.cx;
 text<<Value;
 L=text.str().size();
 p=&c;
 for (i=0; i<L; ++i)
 {
  c=text.str()[i];
  TextOut(Context,
          x      ,
          y      ,
          p      ,
          1      );
  GetTextExtentPoint32( Context,
                       p      ,
                       1      ,
                      &Size   );
  x+=Size.cx;
 } 
 y+=h;
}
talis
14.11.2011, 19:22
  #36

Не по теме:

taras atavin, а как же

Цитата Сообщение от taras atavin Посмотреть сообщение
Неравномерный шрифт
Цитата Сообщение от taras atavin Посмотреть сообщение
табуляции/границы абзацев
?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 19:29     Как сделать такой вывод?
Еще ссылки по теме:

Как сделать ровный вывод состояния регистров C++
Как сделать вывод чисел в виде квадрата? C++
Как сделать вывод суммы каждого столбца? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.11.2011, 19:29  [ТС]     Как сделать такой вывод? #37
Я измеряю ширину каждого символа, а не равняю пробелами. Это гарантирует правильное выравнивание при любом шрифте, а не только моноширинном. Равнение же пробелом работает только с моноширинным. Пока шрифт дефолтный, но о неравномерности я уже позаботился, чего ты мне не предлагал. Кстати, шрифт неравномерный и есть: попадается ширина и 8 пикселей, и 4.
Yandex
Объявления
14.11.2011, 19:29     Как сделать такой вывод?
Ответ Создать тему
Опции темы

Текущее время: 14:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru