· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Что делает в TextOut GdiProcessSetup (в стиле Дзен)

Посл.отвђт Сообщен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