С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
1 / 1 / 0
Регистрация: 24.01.2009
Сообщений: 5
1

GDI в другом окне

24.01.2009, 11:11. Показов 3228. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток, господа. Недавно начал изучать C#, так что не очень сильно ругайте, если что. Инет по этой теме уже облазил достаточно, но ничего не нашел.
Задача в общем простая, но что-то не очень выходит:нужно вывести текст на рабочем столе из приложения .Net (C#). Для этого есть целый класс Api с импортированными в него структурами, и функциями API.
Значит необходимые функции и структуры:
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
internal class Api
{
...................................................................
    public enum FontClipPrecisions : byte
    {
        CLIP_DEFAULT_PRECIS = 0,
        CLIP_CHARACTER_PRECIS = 1,
        CLIP_STROKE_PRECIS = 2,
        CLIP_MASK = 15,
        CLIP_LH_ANGLES = (1 << 4),
        CLIP_TT_ALWAYS = (2 << 4),
        CLIP_EMBEDDED  = (8 << 4)
    }
 
    public enum FontOutPrecisions : byte
    { 
        OUT_DEFAULT_PRECIS = 0,
        OUT_STRING_PRECIS = 1,
        OUT_CHARACTER_PRECIS = 2,
        OUT_STROKE_PRECIS = 3,
        OUT_TT_PRECIS = 4,
        OUT_DEVICE_PRECIS = 5,
        OUT_RASTER_PRECIS = 6,
        OUT_TT_ONLY_PRECIS = 7,
        OUT_OUTLINE_PRECIS = 8,
        OUT_SCREEN_OUTLINE_PRECIS = 9
    }
 
    public enum FontPitchAnnFamilies : byte
    {
        DEFAULT_PITCH  = 0,
        TMPF_FIXED_PITCH = 0x1,
        FIXED_PITCH  = 1,
        VARIABLE_PITCH = 2,
        WAVECAPS_PITCH = 0x1
    }
 
    public enum FontCharsets : byte
    {
        ANSI_CHARSET = 0,
        DEFAULT_CHARSET = 1,
        SYMBOL_CHARSET = 2,
        MAC_CHARSET = 77,
        SHIFTJIS_CHARSET = 128,
        HANGEUL_CHARSET = 129,
        JOHAB_CHARSET = 130,
        CHINESEBIG5_CHARSET = 136,
        GREEK_CHARSET = 161,
        TURKISH_CHARSET = 162,
        HEBREW_CHARSET = 177,
        ARABIC_CHARSET = 178,
        BALTIC_CHARSET = 186,
        RUSSIAN_CHARSET = 204,
        THAI_CHARSET = 222,
        EASTEUROPE_CHARSET = 238,
        OEM_CHARSET = 255
    }
 
    public enum FontWeigth : uint
    {
        FW_DONTCARE = 0,
        FW_THIN = 100,
        FW_EXTRALIGHT = 200,
        FWJJLTRAUGHT = 200,
        FWJJGHT = 300,
        FW_NORMAL = 400,
        FW_REGULAR = 400,
        FW_MEDiUM = 500,
        FW_SEMIBOLD = 600,
        FW_DEMiBOLD = 600,
        FW_BOLD = 700,
        FW_EXTRABOLD = 800,
        FW_ULTRABOLD = 800,
        FWJHEAVY = 900,
        FW_BLACK = 900
    }
 
    public enum FontQuality : byte 
    {
        NONANTIALIASED_QUALITY = 3,
        ANTIALIASED_QUALITY = 4,
        CLEARTYPE_QUALITY =5,
        CLEARTYPE_NATURAL_QUALITY = 6
    }
public struct LOGFONT
    {
        public int lfHeight;
        public int lfWidth;
        public int lfEscapement;
        public int lfOrientation;
        public FontWeigth lfWeight;
        public byte lfItalic;
        public byte lfUnderline;
        public byte lfStrikeout;
        public FontCharsets lfCharSet;
        public FontOutPrecisions lfOutPrecision;
        public FontClipPrecisions lfClipPrecision;
        public FontQuality lfQuality;
        public FontPitchAnnFamilies lfPitchAndFamily;
 
        // Hack - Portable.NET doesn't support structure marshaling yet.
        private byte lfFaceName_0;
        private byte lfFaceName_1;
        private byte lfFaceName_2;
        private byte lfFaceName_3;
        private byte lfFaceName_4;
        private byte lfFaceName_5;
        private byte lfFaceName_6;
        private byte lfFaceName_7;
        private byte lfFaceName_8;
        private byte lfFaceName_9;
        private byte lfFaceName_10;
        private byte lfFaceName_11;
        private byte lfFaceName_12;
        private byte lfFaceName_13;
        private byte lfFaceName_14;
        private byte lfFaceName_15;
        private byte lfFaceName_16;
        private byte lfFaceName_17;
        private byte lfFaceName_18;
        private byte lfFaceName_19;
        private byte lfFaceName_20;
        private byte lfFaceName_21;
        private byte lfFaceName_22;
        private byte lfFaceName_23;
        private byte lfFaceName_24;
        private byte lfFaceName_25;
        private byte lfFaceName_26;
        private byte lfFaceName_27;
        private byte lfFaceName_28;
        private byte lfFaceName_29;
        private byte lfFaceName_30;
        private byte lfFaceName_31;
 
        private static void SetFaceName(out byte dest, string value, int index)
        {
            if(value == null || index >= value.Length)
            {
                dest = 0;
            }
            else
            {
                dest = (byte)(value[index]);
            }
        }
 
        public string lfFaceName
        {
            set
            {
                SetFaceName(out lfFaceName_0, value, 0);
                SetFaceName(out lfFaceName_1, value, 1);
                SetFaceName(out lfFaceName_2, value, 2);
                SetFaceName(out lfFaceName_3, value, 3);
                SetFaceName(out lfFaceName_4, value, 4);
                SetFaceName(out lfFaceName_5, value, 5);
                SetFaceName(out lfFaceName_6, value, 6);
                SetFaceName(out lfFaceName_7, value, 7);
                SetFaceName(out lfFaceName_8, value, 8);
                SetFaceName(out lfFaceName_9, value, 9);
                SetFaceName(out lfFaceName_10, value, 10);
                SetFaceName(out lfFaceName_11, value, 11);
                SetFaceName(out lfFaceName_12, value, 12);
                SetFaceName(out lfFaceName_13, value, 13);
                SetFaceName(out lfFaceName_14, value, 14);
                SetFaceName(out lfFaceName_15, value, 15);
                SetFaceName(out lfFaceName_16, value, 16);
                SetFaceName(out lfFaceName_17, value, 17);
                SetFaceName(out lfFaceName_18, value, 18);
                SetFaceName(out lfFaceName_19, value, 19);
                SetFaceName(out lfFaceName_20, value, 20);
                SetFaceName(out lfFaceName_21, value, 21);
                SetFaceName(out lfFaceName_22, value, 22);
                SetFaceName(out lfFaceName_23, value, 23);
                SetFaceName(out lfFaceName_24, value, 24);
                SetFaceName(out lfFaceName_25, value, 25);
                SetFaceName(out lfFaceName_26, value, 26);
                SetFaceName(out lfFaceName_27, value, 27);
                SetFaceName(out lfFaceName_28, value, 28);
                SetFaceName(out lfFaceName_29, value, 29);
                SetFaceName(out lfFaceName_30, value, 30);
                SetFaceName(out lfFaceName_31, value, 31);
            }
        }
    }
 
    [DllImport("gdi32")] //ANSI
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool TextOutA(IntPtr hdc, int x, int y, string textstring, int charCount);
    [DllImport("user32")] 
    public extern static System.IntPtr GetDC(System.IntPtr hwnd); 
 
    [DllImport("user32")]
    public static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);
 
    [DllImport("gdi32")]
    public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
 
    [DllImport("gdi32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool DeleteObject(IntPtr hObject);
 
    [DllImport("gdi32")]
    public static extern IntPtr CreatePen(int fnPenStyle, int nWidth, int crColor);
 
    [DllImport("gdi32")]
    public static extern IntPtr CreateBrushIndirect(ref LOGBRUSH lplb);
.....................................................................................................
}
и есть процедура некоторого класса, использующего класс Api:
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
        public unsafe void DrawData()
        {
            
            hDTDC = Api.GetDC(IntPtr.Zero);
            Api.LOGFONT f = new Api.LOGFONT();
            f.lfHeight = 30;
            f.lfWidth = 0;
            f.lfEscapement = 0; //направление строки
            f.lfHeight = 400; //один пункт=20 твипов
            f.lfWidth = 4;
            f.lfWeight = Api.FontWeigth.FW_BOLD;
            f.lfItalic = 1;
            f.lfUnderline = 0;
            f.lfCharSet = Api.FontCharsets.RUSSIAN_CHARSET;
            f.lfOrientation = 0;
            f.lfQuality = 0;
            f.lfClipPrecision = Api.FontClipPrecisions.CLIP_DEFAULT_PRECIS;
            f.lfOutPrecision = Api.FontOutPrecisions.OUT_TT_ONLY_PRECIS;
            f.lfFaceName = "Bodoni MT Black";
            IntPtr prevFont = Api.CreateFontIndirectA(ref f);
            IntPtr pf = new IntPtr(&f);
            Api.SelectObject(hDTDC, pf);
            Api.TextOutA(hDTDC, 200, 500, "Здравствуй мир!", 15);
            Api.SelectObject(hDTDC, prevFont);
            Api.DeleteObject(pf);
            Api.ReleaseDC(IntPtr.Zero, hDTDC);
        }
Так вот, в коде создается шрифт, и выводится текст, с вышесозданным шрифтом. Текст-то выводится, но видимо, что-то не совсем так со шрифтом. Что бы я ни делал с этим шрифтом, какие бы параметры не устанавливал - текст выводится стандартным шрифтом. Где я ошибаюсь? Может что-то с преобразованием указателя IntPtr и структуры шрифта?
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2009, 11:11
Ответы с готовыми решениями:

Как наследовать класс,находящийся в другом окне?
Добрый вечер. Мне нужно сделать наследование классов, 1 класс находится первой форме, 2 класс во...

C# и внешний клик в другом окне
Добрый день всем, есть проблема, нужно написать кликер, который кликает по введенным координатам в...

Как получить информацию о другом окне, зная его Handle
Как получить информацию о другом окне если есть Хендл(расположение, заголовок, размеры и т.д.)? И...

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

4
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
24.01.2009, 12:21 2
Вот так вот у меня выводит любым шрифтом.
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
public unsafe void DrawData()
        {            
            System.IntPtr hDTDC = Api.GetDC(IntPtr.Zero);
            Api.LOGFONT f = new Api.LOGFONT();
            f.lfHeight = 30;
            f.lfWidth = 0;
            f.lfEscapement = 450; //направление строки   
            f.lfHeight = 30; //один пункт=20 твипов   
            f.lfWidth = 50;
            f.lfWeight = Api.FontWeigth.FW_BOLD;
            f.lfItalic = 1;
            f.lfUnderline = 0;
            f.lfCharSet = Api.FontCharsets.RUSSIAN_CHARSET;
            f.lfOrientation = 0;
            f.lfQuality = 0;
            f.lfClipPrecision = Api.FontClipPrecisions.CLIP_DEFAULT_PRECIS;
            f.lfOutPrecision = Api.FontOutPrecisions.OUT_TT_ONLY_PRECIS;
            f.lfFaceName = "Verdana";
            IntPtr prevFont = Api.CreateFontIndirectA(ref f);
            IntPtr pf = new IntPtr(&f);
            Api.SelectObject(hDTDC, prevFont);
            Api.TextOutA(hDTDC, 200, 500, "Здравствуй мир!", 15);
            Api.SelectObject(hDTDC, prevFont);
            Api.DeleteObject(pf);
            Api.ReleaseDC(IntPtr.Zero, hDTDC);
            }
0
1 / 1 / 0
Регистрация: 24.01.2009
Сообщений: 5
24.01.2009, 13:22  [ТС] 3
Спасибо попробую.

Добавлено через 14 минут 16 секунд
Попробовал, действительно работает. Теперь вопрос: почему?
В MSDN явно написано
The SelectObject function selects an object into the specified device context (DC). The new object replaces the previous object of the same type.

а в описании этой функции:
The CreateFontIndirect function creates a logical font that has the specified characteristics. The font can subsequently be selected as the current font for any device context.
Созданный шрифт может быть впоследствии выбран как текущий для любого DC
А тут никакой замены и работает!!! Странно, но это неправильно вроде.
0
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
24.01.2009, 13:31 4
А чего же тут неправильного?
C#
1
2
3
4
5
Api.LOGFONT f = new Api.LOGFONT();  //Создали логфонт
...
IntPtr prevFont = Api.CreateFontIndirectA(ref f);//На основе логфонта создали реальный объект HFONT
...
Api.SelectObject(hDTDC, prevFont);//А теперь мы его выделяем в наш HDC("can be selected as the current font for any device context")
Вроде все как и в МСДН.
0
1 / 1 / 0
Регистрация: 24.01.2009
Сообщений: 5
24.01.2009, 15:10  [ТС] 5
Да все правильно, спасибо. Неправильно только то, что я невнимательно читал MSDN...Вопрос исчерпан.
0
24.01.2009, 15:10
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2009, 15:10
Помогаю со студенческими работами здесь

Передача данных из listBox в одном окне, в textBox в другом окне
Доброго времени суток! Есть два окна, на одном находиться сам textBox, а на другом listBox с...

Выести в окне значения, взятые в в другом окне
Ребята у меня вопрос у меня в 1 окне берётся значения как вывести их в др окно в Qt ???ОЧ ВАЖНО!!!

Как через GDI нарисовать пиксел на окне?
Как через GDI нарисовать пиксел на окне?

Вывести строку из букв. Гласные буквы вывести в одном окне по диагонали окна, согласные в - другом окне по другой диагонали
Ввести строку из букв. Гласные буквы вывести в одном окне по диагонали окна, согласные - в другом...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­­­­­­­­­­­­­х­р­о­н­­н­­­ы­­й счётчик с управляющим сигналом зад
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru