Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 1
Регистрация: 19.02.2017
Сообщений: 12
.NET 4.x

RichTextBox RTF добавление скрытого текста и изображений

28.10.2020, 18:33. Показов 1518. Ответов 0

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть задача: необходимо вставить изображение в текстовое поле. К изображению есть некоторый текст, который его описывает. При обращении к текстовому полю, необходимо получить значение изображения в виде его описания (т.е. текста).

Получается что-то наподобие alt – текста в html или формул в Word 2007. (Eсли скопировать формулу и вставит в блокнот получите набор символов).

Для решения в качестве текстового поля использовал - RichTextBox. В нем есть возможность вставлять изображения, скрытый текст, ну и вводить обычный текст.

Код для вставки изображения использовал из статьи: Вставить изображение в rtb

Кликните здесь для просмотра всего текста
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
161
162
        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bitmap = new Bitmap(20, 20);
            using (Graphics graphics = Graphics.FromImage(bitmap))
            {
                graphics.Clear(Color.Red);
            }
 
            richTextBox1.SelectedRtf = embedImage(bitmap);
        }
 
 
        private string embedImage(Image img)
        {
            var rtf = new StringBuilder();
 
            rtf.Append(@"{\rtf1\ansi\ansicpg1252\deff0\deflang1033");
 
            rtf.Append(GetFontTable(this.Font));
 
            rtf.Append(GetImagePrefix(img));
 
            rtf.Append(getRtfImage(img));
 
            rtf.Append(@"}{\v Hide Text \v0}}");
 
            return rtf.ToString();
        }
 
        private enum EmfToWmfBitsFlags
        {
            EmfToWmfBitsFlagsDefault = 0x00000000,
            EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
            EmfToWmfBitsFlagsIncludePlaceable = 0x00000002,
            EmfToWmfBitsFlagsNoXORClip = 0x00000004
        };
 
        private struct RtfFontFamilyDef
        {
            public const string Unknown = @"\fnil";
            public const string Roman = @"\froman";
            public const string Swiss = @"\fswiss";
            public const string Modern = @"\fmodern";
            public const string Script = @"\fscript";
            public const string Decor = @"\fdecor";
            public const string Technical = @"\ftech";
            public const string BiDirect = @"\fbidi";
        }
 
        [DllImport("gdiplus.dll")]
        private static extern uint GdipEmfToWmfBits(IntPtr _hEmf,
          uint _bufferSize, byte[] _buffer,
          int _mappingMode, EmfToWmfBitsFlags _flags);
 
        private string GetFontTable(Font font)
        {
            var fontTable = new StringBuilder();
 
            fontTable.Append(@"{\fonttbl{\f0");
            fontTable.Append(@"\");
            var rtfFontFamily = new HybridDictionary();
            rtfFontFamily.Add(FontFamily.GenericMonospace.Name, RtfFontFamilyDef.Modern);
            rtfFontFamily.Add(FontFamily.GenericSansSerif, RtfFontFamilyDef.Swiss);
            rtfFontFamily.Add(FontFamily.GenericSerif, RtfFontFamilyDef.Roman);
            rtfFontFamily.Add("UNKNOWN", RtfFontFamilyDef.Unknown);
 
            fontTable.Append(rtfFontFamily.Contains(font.FontFamily.Name) ? rtfFontFamily[font.FontFamily.Name] : rtfFontFamily["UNKNOWN"]);
 
            fontTable.Append(@"\fcharset0 ");
 
            fontTable.Append(font.Name);
 
            fontTable.Append(@";}}");
            return fontTable.ToString();
        }
 
        private string GetImagePrefix(Image _image)
        {
            float xDpi, yDpi;
            var rtf = new StringBuilder();
            using (Graphics graphics = CreateGraphics())
            {
                xDpi = graphics.DpiX;
                yDpi = graphics.DpiY;
            }
 
            var picw = (int)Math.Round((_image.Width / xDpi) * 2540);
 
            var pich = (int)Math.Round((_image.Height / yDpi) * 2540);
 
            var picwgoal = (int)Math.Round((_image.Width / xDpi) * 1440);
 
            var pichgoal = (int)Math.Round((_image.Height / yDpi) * 1440);
 
            rtf.Append(@"{\pict\wmetafile8");
            rtf.Append(@"\picw");
            rtf.Append(picw);
            rtf.Append(@"\pich");
            rtf.Append(pich);
            rtf.Append(@"\picwgoal");
            rtf.Append(picwgoal);
            rtf.Append(@"\pichgoal");
            rtf.Append(pichgoal);
            rtf.Append(" ");
 
            return rtf.ToString();
        }
 
        private string getRtfImage(Image image)
        {
 
            MemoryStream stream = null;
 
            Graphics graphics = null;
 
            Metafile metaFile = null;
            try
            {
                var rtf = new StringBuilder();
                stream = new MemoryStream();
 
                using (graphics = CreateGraphics())
                {
 
                    IntPtr hdc = graphics.GetHdc();
 
                    metaFile = new Metafile(stream, hdc);
 
                    graphics.ReleaseHdc(hdc);
                }
 
 
                using (graphics = Graphics.FromImage(metaFile))
                {
                    graphics.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
                }
 
                IntPtr hEmf = metaFile.GetHenhmetafile();
 
                uint bufferSize = GdipEmfToWmfBits(hEmf, 0, null, 8, EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault);
 
                var buffer = new byte[bufferSize];
 
                uint _convertedSize = GdipEmfToWmfBits(hEmf, bufferSize, buffer, 8, EmfToWmfBitsFlags.EmfToWmfBitsFlagsDefault);
 
                foreach (byte t in buffer)
                {
                    rtf.Append(String.Format("{0:X2}", t));
                }
                
                return rtf.ToString();
            }
            finally
            {
                if (graphics != null)
                    graphics.Dispose();
                if (metaFile != null)
                    metaFile.Dispose();
                if (stream != null)
                    stream.Close();
            }
        }


К RTF изображению добавил скрытый текст {\v Hide Text \v0}.
Этот скрытый текст отображается в свойстве Text (richTextBox.Text), т.е. этим свойством можно вытянут весь текст, включая скрытый, в той позиции, в которой находится изображение.

Использую .net 4.6.2, так как скрытый текст в версиях .net 4.7.* нельзя отобразить этим свойством. Это вроде как баг, если исходить из этого: https://developercommunity.vis... idden.html

Проблема в том, что скрытый текст не привязан к изображению. Можно удалить изображение, но скрытый текст (описание изображения) остается. Уверен, что проблема в неверном добавлении скрытого текста к изображению в RTF коде. Пробовал добавлять через поля(\field), ничего не получилось, так как RichTextBox меняет RTF код, убирая поля.
Как добавить изображение со скрытым текстом в RichTextBox, дабы при удалении первого, удалялось и второе?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2020, 18:33
Ответы с готовыми решениями:

Как сделать чтобы считывал RTF в RichTextBox , место нормального текста символы
Вроде txt нормально открывает, а вот rtf. private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) ...

Добавление текста в RichTextBox
здравствуйте,я начинающий программист,в данный момент работаю с формами,задача состоит в том,что бы при открытии формы(на которой...

Добавление текста в RichTextBox
Есть RichTextBox1 и три текстбокса... Код записи с текстбоксов такой RichTextBox1.Text = RichTextBox1.Text & TextBox1.Text &...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2020, 18:33
Помогаю со студенческими работами здесь

Добавление текста в RichtextBox сверху
Как сделать так чтобы при занесения нового текста в richtextbox старый перемещался на строку ниже а новый в верх,действие происходит по...

RichTextBox добавление текста из файла
Дан код кнопки: { string proxies = File.ReadAllLines("Ip_port.txt"); List<string> ips = new...

Добавление текста в RichTextBox не в конец, а в начало
Как сделать обновление строки не сверху вниз, а наоборот? Ну, т.е. я нажа на кнопку ,добавилась новая строка, которая будет сверху, а не...

Добавление текста (параграфа) в начало richtextbox
Доброго времени суток. Есть желание добавлять в RichTextBox текст, но не в конец документа, а в начало. Как это можно сделать? Сейчас...

Добавление текста в RichTextBox с различными атрибутами
Всем здравствуйте. Как из кода занести в одно и тоже RichTextBox одну строчку со шрифтом синего цвета, а следующую со шрифтом красного...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru