|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 30, 2004 01:41:54 Речь пойдет о WinXP. DrawText "сама" рисует строку текста. В смысле при выполнении DrawText он отображается на экране. А TextOut не показывает текс (в случае с 5-м и 6-м уроками Iczelion'a), текст появляется в ходе EndPaint. Мне стало интересно, что делает TextOut, рисует ли она строку или копирует ее в контекст устройства или еще что. Я увидел, что TextOut устанавливает GDI процесс (вызывает GdiProcessSetup) Про GdiProcessSetup нигде не нашел. В айсе увидел, что ProcessSetup копирует строку с текстом в "какое-то место". Место это появляется так: в UTEB (как я понял) по смещению 18h берется адрес, к этому адресу + 1DCh, потом к нему +50h чтобы получить необходимый указатель. В айсе это выглядит вот так: MOV EAX,FS:[00000018] MOV EDX,[EAX+000001D8] ; EDX становится нулем (в моем примере) ... LEA EDX,[EAX+EDX+000001DC] ... LEA EDI,[EDX+50] ; EDX+50 указывает на "какое-то место" REPZ MOVSD MOV ECX,EBX ; цикл остатка (если количество символов нечетное) AND ECX,3 REPZ MOVSB ; строка скопирована Вопросы. Что такое UTEB – current user thread environment block? Что такое "какое-то место"? Где про это можно прочитать? И прав ли я в своих рассуждениях? |
|
|
Дата: Окт 1, 2004 05:09:11 Забыл сказать, я чайник. Хотя думаю это и так понятно :). Несколько экспериментов показали, что строка с текстом уходит в контекст... Только я не понимаю что такое контекст устройства дисплея и контекст отображения. Это разные структуры или нет? Вот отрывок урока 5. invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName
invoke SelectObject, hdc, eax
...
invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString ; "сообщает" строку и параметры
invoke SelectObject,hdc, hfont ; восстанавливает шрифт
invoke EndPaint,hWnd, ADDR ps ; отображает строку
Если рассуждать логически, то после SelectObject в контексте будет выбран стандартный шрифт. А как тогда при выполнении EndPaint появляется "красивый" шрифт? |
|
|
Дата: Окт 1, 2004 15:23:35 в UTEB (как я понял) по смещению 18h берется адрес, ; Thread Environment Block (TEB) ; First Teb located at 7FFDE000h (pointed by fs:[18] in user mode) Это всё есть в KmdKit by Four-F , по большей части для w2k , не знаю сможешь ли ты где найти полное описание этой структуры для XP , вряд ли . после SelectObject в контексте будет выбран стандартный шрифт. Ты создаёшь красивый шрифт (CreateFont) , потом его (eax) выбираешь (SelectObject) , почему там должен быть стандартный ? з.ы. В w2k ф-ция TextOut не вызывает никакого GdiProcessSetup |
|
|
Дата: Окт 2, 2004 05:02:37 Это всё есть в KmdKit by Four-F Bogrus спасибо! Очень полезная вещь! з.ы. В w2k ф-ция TextOut не вызывает никакого GdiProcessSetup GUI в W2k другой, может и не вызывает, не проверял. Но в XP (я смотрел в айсе) это выглядит так. У TextOut всего три call'a первые два очевидны (GdiGetCodePage, MultiByteToWideChar), а третий по адресу (у меня call 77C6271A) входишь, и GdiProcessSetup+01B1. выбираешь (SelectObject) , почему там должен быть стандартный Как я понял, при сообщении WM_PAINT, в уроке 5 будет вот такая заварка: BeginPaint просит DC CreateFont создает логический шрифт SelectObject меняет в DC шрифт TextOut "сообщает" в DC строку для вывода SelectObject зачем-то восстанавливает старый шрифт EndPaint отображает текст и отдает DC Вот так. invoke SelectObject,hdc, hfont invoke EndPaint,hWnd, ADDR ps Я имел введу второй SelectObject, что он делает? Текст уходит в DC, а потом там же восстанавливается шрифт, и после этого EndPaint показывает текст "красивым"? По экспериментировал и увидел, что шрифт не восстанавливается.
1 2 3 4
A 7FFDE1DC 00020098 0032C8C8 00FF0000 00000002
Цвет Шрифта Цвет фона X,Y координаты строки
B 7FFDE1EC 0032C8C8 00FF0000 00000000 00000000
C 7FFDE1FC 80000000 AAAAAAAA AAAAAAAA AAAAAAAA
Длина строки
D 7FFDE20C AAAAAAAA 00000000 00000022 00000000
Шрифт остается "красивым"
E 7FFDE21C DF0A0C48 00000000 00000000 00000000
А дальше пошла строка: "W.i.n.3.2..."
F 7FFDE22C 00690057 0033006E 00200032 00730061
G 7FFDE23C 00650073 0062006D 0079006C 00690020
H 7FFDE24C 00200073 00720067 00610065 00200074
I 7FFDE25C 006E0061 00200064 00610065 00790073
Последние симв.стр."!00h" вот это SelObj вписывает во второй раз.
J 7FFDE26C 00000021 AAAAAAAA 00060008 018A0021
Все dword забитые "A" в данном примере не менялись. Зачем нужен второй раз SelectObject? Вообще мне все это, прежде всего, нужно, для того чтобы понять, что такое контекст устройства и что такое контекст отображения. Всякие абстрактные описания мне не понятны, а хорошего толкования я не нашел. Если можно хоть что-то поясните, буду очень признателен. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.104 |