TextOut, TextBox и шрифт

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

TextOut, TextBox и шрифт

Сообщение Debugger » 01.10.2008 (Ср) 20:10

При помощи отлавливания сообщений я хочу отрисовывать в текстбоксе текст разного шрифта. Для текста разного размера я использую CreateFontIndirect и SelectObject. Для получения hDC из hWnd (у текстбокса нет первого св-ва) я использую GetDC. Но по каким-то причинам шрифт не устанавливается, а текст рисуется.
Вложения
@WndProc.rar
Пример
(2.4 Кб) Скачиваний: 42
Последний раз редактировалось Debugger 02.10.2008 (Чт) 13:48, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: TextOut, TextBox и шрифт

Сообщение tyomitch » 01.10.2008 (Ср) 21:05

Debugger писал(а):Для текста разного размера я использую CreateFontIndirect и SelectObject.

А лучше бы WM_SETFONT
Изображение

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: TextOut, TextBox и шрифт

Сообщение Debugger » 02.10.2008 (Чт) 9:30

Все таки, мне интересно, почему этот код не работает.
А WM_SETFONT - это SendMessage, да?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: TextOut, TextBox и шрифт

Сообщение Viper » 02.10.2008 (Чт) 10:40

Debugger писал(а):Все таки, мне интересно, почему этот код не работает.
А WM_SETFONT - это SendMessage, да?
Да.
Весь мир матрица, а мы в нем потоки байтов!

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: TextOut, TextBox и шрифт

Сообщение dr.MIG » 02.10.2008 (Чт) 11:55

В прикреплённом примере не хватает модулей mdlFontIndirect и mdlFont, поэтому проверить работоспособность не представляется возможным.
Salus populi suprema lex

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: TextOut, TextBox и шрифт

Сообщение tyomitch » 02.10.2008 (Чт) 14:00

Debugger писал(а):Все таки, мне интересно, почему этот код не работает.

Потому что и не должен: GetDC/SelectObject положено вызывать непосредственно при отрисовке, а не для задания долгосрочных свойств.
Изображение

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: TextOut, TextBox и шрифт

Сообщение Debugger » 02.10.2008 (Чт) 14:13

dr.MIG писал(а):В прикреплённом примере не хватает модулей mdlFontIndirect и mdlFont, поэтому проверить работоспособность не представляется возможным.

Ой. :oops: Исправил
Viper писал(а):
Debugger писал(а):А WM_SETFONT - это SendMessage, да?
Да.

Так как используется сабклассинг (указано в первом посте), ты прав. Но не совсем. Наверно, достаточно вызвать CallWindowProc, указав WM_SETFONT. Так?
З.Ы. Отлавливая все события, которые отправляются к текстбоксу (вызывал txt.FontSize=20 и смотрел, что получится), я натолкнулся на события с кодом &H281 (WM_IME_SETCONTEXT) и с кодом &H100E (название его константы я не нашел). Можете объяснить, что делает первое и второе?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: TextOut, TextBox и шрифт

Сообщение Viper » 02.10.2008 (Чт) 14:20

Debugger писал(а):З.Ы. Отлавливая все события, которые отправляются к текстбоксу (вызывал txt.FontSize=20 и смотрел, что получится), я натолкнулся на события с кодом &H281 (WM_IME_SETCONTEXT) и с кодом &H100E (название его константы я не нашел). Можете объяснить, что делает первое и второе?

MSDN писал(а):WM_IME_SETCONTEXT Sent to an application when a window is activated. A window receives this message through its WindowProc function.
То есть сообщение посылается приложению при активации окна.
Весь мир матрица, а мы в нем потоки байтов!

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: TextOut, TextBox и шрифт

Сообщение Debugger » 02.10.2008 (Чт) 14:35

Потому что и не должен: GetDC/SelectObject положено вызывать непосредственно при отрисовке, а не для задания долгосрочных свойств.
Ну да. Я так и делаю:
Код: Выделить всё
SetIndirectFont FNT, GetDC(Form1.txt.hwnd)
TextOut GetDC(Form1.txt.hwnd), 0, 0, "123", 3

В итоге, мне кажется, или данные о шрифте поступают в текстбокс не через WindowProc, или с текстбоксом творится что-то страшное.
Сдаюсь :cry:
Added: даже через Font не хочет
Added-2: Через DrawTextEx тоже не идет. Злобный текстбокс.
Added-3: А кончилось тем, что VB завис :o

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: TextOut, TextBox и шрифт

Сообщение tyomitch » 02.10.2008 (Чт) 23:36

Debugger писал(а):
Потому что и не должен: GetDC/SelectObject положено вызывать непосредственно при отрисовке, а не для задания долгосрочных свойств.
Ну да. Я так и делаю:
Код: Выделить всё
SetIndirectFont FNT, GetDC(Form1.txt.hwnd)
TextOut GetDC(Form1.txt.hwnd), 0, 0, "123", 3



Вот так работает.
Код: Выделить всё
        Case WM_CHAR
            Dim hDC As Long
            hDC = GetWindowDC(Form1.pct.hwnd)
            SetIndirectFont FNT, hDC
            DrawText hDC, "123", 3, r, 0
            With Form1.txt
                .SelText = Chr(wParam)
            End With
            TextOut hDC, 0, 0, Form1.txt.Text, Len(Form1.txt.Text)


Но всё равно всё криво и неправильно. Как минимум, нехватает вызовов DeleteObject, ReleaseDC и проверки ошибок.
Очень надеюсь, что в реальном проекте всё это есть.
Изображение

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: TextOut, TextBox и шрифт

Сообщение Debugger » 03.10.2008 (Пт) 11:14

Работает! Спасибо.
Реального проекта нет - я просто решил посмотреть, как работает сабклассинг.
.SelText = Chr(wParam)

Backspace тоже считается за WM_CHAR (да?), и его нужно обрабатывать отдельно.?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 20

    TopList