Речь пойдет о WinXP. DrawText "сама" рисует строку текста. В смысле при выполнении DrawText он отображается на экране. А TextOut не показывает текс (в случае с 5-м и 6-м уроками Iczelion'a), текст появляется в ходе EndPaint. Мне стало интересно, что делает TextOut, рисует ли она строку или копирует ее в контекст устройства или еще что. Я увидел, что TextOut устанавливает GDI процесс (вызывает GdiProcessSetup) Про GdiProcessSetup нигде не нашел. В айсе увидел, что ProcessSetup копирует строку с текстом в "какое-то место". Место это появляется так: в UTEB (как я понял) по смещению 18h берется адрес, к этому адресу + 1DCh, потом к нему +50h чтобы получить необходимый указатель. В айсе это выглядит вот так: Код (Text): 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? Что такое "какое-то место"? Где про это можно прочитать? И прав ли я в своих рассуждениях?
Забыл сказать, я чайник. Хотя думаю это и так понятно . Несколько экспериментов показали, что строка с текстом уходит в контекст... Только я не понимаю что такое контекст устройства дисплея и контекст отображения. Это разные структуры или нет? Вот отрывок урока 5. Код (Text): 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 появляется "красивый" шрифт?
; Thread Environment Block (TEB) ; First Teb located at 7FFDE000h (pointed by fs:[18] in user mode) Это всё есть в KmdKit by Four-F , по большей части для w2k , не знаю сможешь ли ты где найти полное описание этой структуры для XP , вряд ли . Ты создаёшь красивый шрифт (CreateFont) , потом его (eax) выбираешь (SelectObject) , почему там должен быть стандартный ? з.ы. В w2k ф-ция TextOut не вызывает никакого GdiProcessSetup
Bogrus спасибо! Очень полезная вещь! GUI в W2k другой, может и не вызывает, не проверял. Но в XP (я смотрел в айсе) это выглядит так. У TextOut всего три call'a первые два очевидны (GdiGetCodePage, MultiByteToWideChar), а третий по адресу (у меня call 77C6271A) входишь, и GdiProcessSetup+01B1. Как я понял, при сообщении WM_PAINT, в уроке 5 будет вот такая заварка: BeginPaint просит DC CreateFont создает логический шрифт SelectObject меняет в DC шрифт TextOut "сообщает" в DC строку для вывода SelectObject зачем-то восстанавливает старый шрифт EndPaint отображает текст и отдает DC Вот так. Код (Text): [b]invoke SelectObject,hdc, hfont[/b] invoke EndPaint,hWnd, ADDR ps Я имел введу второй SelectObject, что он делает? Текст уходит в DC, а потом там же восстанавливается шрифт, и после этого EndPaint показывает текст "красивым"? По экспериментировал и увидел, что шрифт не восстанавливается. Код (Text): 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 [b]DF0A0C48[/b] 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" вот это [b]SelObj[/b] вписывает во второй раз. J 7FFDE26C 00000021 AAAAAAAA 00060008 018A0021 Все dword забитые "A" в данном примере не менялись. Зачем нужен второй раз SelectObject? Вообще мне все это, прежде всего, нужно, для того чтобы понять, что такое контекст устройства и что такое контекст отображения. Всякие абстрактные описания мне не понятны, а хорошего толкования я не нашел. Если можно хоть что-то поясните, буду очень признателен.