Что делает в TextOut GdiProcessSetup (в стиле Дзен)

Тема в разделе "WASM.WIN32", создана пользователем Bitfry, 30 сен 2004.

  1. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Речь пойдет о WinXP.

    DrawText "сама" рисует строку текста. В смысле при выполнении DrawText он отображается на экране.

    А TextOut не показывает текс (в случае с 5-м и 6-м уроками Iczelion'a), текст появляется в ходе EndPaint.



    Мне стало интересно, что делает TextOut, рисует ли она строку или копирует ее в контекст устройства или еще что.

    Я увидел, что TextOut устанавливает GDI процесс (вызывает GdiProcessSetup)

    Про GdiProcessSetup нигде не нашел.

    В айсе увидел, что ProcessSetup копирует строку с текстом в "какое-то место".

    Место это появляется так:



    в UTEB (как я понял) по смещению 18h берется адрес,

    к этому адресу + 1DCh,

    потом к нему +50h чтобы получить необходимый указатель.



    В айсе это выглядит вот так:
    Код (Text):
    1.  
    2. MOV    EAX,FS:[00000018]
    3. MOV    EDX,[EAX+000001D8]     ; EDX становится нулем (в моем примере)
    4.  
    5. ...
    6.  
    7. LEA    EDX,[EAX+EDX+000001DC]
    8.  
    9. ...
    10.  
    11. LEA    EDI,[EDX+50]           ; EDX+50 указывает на "какое-то место"
    12. REPZ   MOVSD
    13. MOV    ECX,EBX                ; цикл остатка (если количество символов нечетное)
    14. AND    ECX,3
    15. REPZ   MOVSB                  ; строка скопирована




    Вопросы.

    Что такое UTEB – current user thread environment block?

    Что такое "какое-то место"?

    Где про это можно прочитать?

    И прав ли я в своих рассуждениях?
     
  2. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Забыл сказать, я чайник. Хотя думаю это и так понятно :).



    Несколько экспериментов показали, что строка с текстом уходит в контекст...



    Только я не понимаю что такое контекст устройства дисплея и контекст отображения.

    Это разные структуры или нет?



    Вот отрывок урока 5.
    Код (Text):
    1. invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
    2.                   OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
    3.                   DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
    4.                   ADDR FontName
    5. invoke SelectObject, hdc, eax
    6. ...
    7. invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString  ; "сообщает" строку и параметры
    8. invoke SelectObject,hdc, hfont                            ; восстанавливает шрифт
    9. invoke EndPaint,hWnd, ADDR ps                             ; отображает строку


    Если рассуждать логически, то после SelectObject в контексте будет выбран стандартный шрифт.

    А как тогда при выполнении EndPaint появляется "красивый" шрифт?
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    ; 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
     
  4. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург


    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):
    1. [b]invoke SelectObject,hdc, hfont[/b]
    2. invoke EndPaint,hWnd, ADDR ps




    Я имел введу второй SelectObject, что он делает?

    Текст уходит в DC, а потом там же восстанавливается шрифт, и после этого EndPaint показывает текст "красивым"?



    По экспериментировал и увидел, что шрифт не восстанавливается.


    Код (Text):
    1.  
    2.                  1         2           3           4
    3.  
    4. A   7FFDE1DC   00020098    0032C8C8    00FF0000    00000002
    5.  
    6.               Цвет Шрифта  Цвет фона   X,Y координаты строки
    7. B   7FFDE1EC   0032C8C8    00FF0000    00000000    00000000
    8.  
    9. C   7FFDE1FC   80000000    AAAAAAAA    AAAAAAAA    AAAAAAAA
    10.  
    11.                                       Длина строки
    12. D   7FFDE20C   AAAAAAAA    00000000    00000022    00000000
    13.  
    14.              Шрифт остается "красивым"
    15. E   7FFDE21C   [b]DF0A0C48[/b]    00000000    00000000    00000000
    16.  
    17.            А дальше пошла строка: "W.i.n.3.2..."
    18. F   7FFDE22C   00690057    0033006E    00200032    00730061
    19. G   7FFDE23C   00650073    0062006D    0079006C    00690020
    20. H   7FFDE24C   00200073    00720067    00610065    00200074
    21. I   7FFDE25C   006E0061    00200064    00610065    00790073
    22.  
    23. Последние симв.стр."!00h"             вот это [b]SelObj[/b] вписывает во второй раз.
    24. J   7FFDE26C   00000021    AAAAAAAA    00060008    018A0021
    25.  


    Все dword забитые "A" в данном примере не менялись.



    Зачем нужен второй раз SelectObject?



    Вообще мне все это, прежде всего, нужно, для того чтобы понять, что такое контекст устройства и что такое контекст отображения. Всякие абстрактные описания мне не понятны, а хорошего толкования я не нашел.



    Если можно хоть что-то поясните, буду очень признателен.