Помогите устрaнить мерцание при скролинге текста. Что делаю: в оконной процедуре на WM_CREATE создаю поток, в который как параметр идёт хэндл окна Код (Text): DrawTextThread proc lParam:DWORD invoke GetDC, lParam xchg eax, ebx invoke CreateFont, 50, 20, 0, 0, 0, TRUE, TRUE, 0, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH, 0 invoke SelectObject, ebx, eax mov edi, eax .repeat invoke TextOut, ebx, esi, 0, offset szOutText, OutTextLen invoke UpdateWindow, lParam dec esi .if esi == -(OutTextLen) * 20 xor esi, esi .endif invoke Sleep,10 .until FALSE ret DrawTextThread endp при этом происходит характерное мерцание (довольно заметное чтобы на это закрывать глаза), хотелось бы конечно от этого избавиться в атаче всё. Если проблема с атачем, то залил вот ещё здесь
xp sp2 текст видно, мерцание видно. Выход - двойной буффер и блиттинг. [+] либо фон текста = фону окна, что слегка может сгладить картину.
Замени свою. Уже не Код (Text): OutTextThread proc lParam: DWORD LOCAL hDC1:DWORD LOCAL hDC2:DWORD invoke GetDC, [lParam] mov [hDC1],eax invoke CreateCompatibleDC,eax mov [hDC2],eax invoke CreateCompatibleBitmap,[hDC1],5000,150; 5000 - ширина для всего текста ,150 - высота текста (окна) invoke SelectObject,[hDC2],eax invoke CreateFont, 50, 20, 0, 0, FW_BOLD, 0, 0, 0, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH, 0 invoke SelectObject, [hDC2], eax invoke TextOut, [hDC2], 0, 0, offset szOutText, OutTextLen xor esi, esi .repeat invoke BitBlt,[hDC1],0,0,500,150,[hDC2],esi,0,SRCCOPY ;500 - реальная ширина окна,150 - высота текста (окна) inc esi .if esi == -(OutTextLen) * 20 xor esi, esi .endif invoke Sleep,5 .until FALSE ret OutTextThread endp
да, все создается нормально. Где инициализация esi? У меня при входе в функцию потока esi равно 0x400000, так что ждать, пока появится текст, придется долго
А с ресурсами как? Вроде-бы возвращать надо ресурсы: 1. CreateCompatibleBitmap(), CreateFont() -> DeleteObject() 2. CreateCompatibleDC() -> DeleteDC() 3. GetDC() -> ReleaseDC() 4. Перед ReleaseDC() надо использовать SelectObject(), чтобы вернуть на место старые объекты из HDC. Естественно, старые объекты надо где-то сохранить. Кроме того, для скорости неплохо сделать CreateCompatibleBitmap() один раз и держать хэндл глобально.
тьфу, обнулить канеш нада перед входом в цикл :] в попыхах пропустил... проверьте плиз работает ли у вас (атач или здесь) цикл крутится вечно от создания окна до ExitProcessос не в цикле же всё заново открывать и закрывать =\ всё что повторяется у меня в цикле это: Код (Text): .repeat invoke TextOut, hCompatDC, esi, 0, offset szOutText, OutTextLen invoke BitBlt, ebx, 0, 0, 290, 50, hCompatDC, 0, 0, SRCCOPY dec esi .if esi == -(OutTextLen) * 20 xor esi, esi .endif invoke Sleep,10 .until FALSE
Есть где-то тема на WASMe там говорится что нужно сохранять. От себя могу добавить, сам палился и не раз на таких "ПРИКОЛАХ" от M$, В Win2000 работает в XP SP1 через раз, а в SP2 ВАЩЕ не рулит. Короче (слушай) читай сюда. EBX ESI EDI необходимо сохранить такими как при входе в оконную процедуру иначе MD Shell32 or User32 иногда и NTDLL. Они любят писать в память через эти регистры а вот если там МУСОРЕЦ то MD.
статья называется "записки дзенстувющего" кажется, тока причём это к моему коду я так и не понял на практике я этого никогда не делал, да и не видел что-бы кто-то это делал в оконной процедуре и проблем никогда с этим не возникало, наверно вот почему. Вот код на который возвращается управление из оконной процедуры в user32: Код (Text): .text:7D9472F5 call [ebp+arg_0] <<<---вызов .text:7D9472F8 mov ecx, large fs:18h .text:7D9472FF and byte ptr [ecx+0FB8h], 0 .text:7D947306 cmp [esp+24h+var_20], 0DCBAABCDh .text:7D94730E jnz loc_7D9708FE .text:7D947314 .text:7D947314 loc_7D947314: ; CODE XREF: IsCharAlphaNumericW+2A7j .text:7D947314 ; IsCharAlphaNumericW+2AFj .text:7D947314 add esp, 8 .text:7D947317 pop ebx .text:7D947318 pop edi .text:7D947319 pop esi .text:7D94731A pop ebp .text:7D94731B retn 14h как видно всё что тут делается это обнуляется SafeThunkCall в тэбе(хз где она используется, в в2к этого не делается) и проверяется стек затем регистры восстанавливаются т.е. нигде не используются, тоже можно сказать и про main функции в кторых ещё проще - по возврату сразу вызывается ExitThread и дело с концом
rain Нельзя! Для кого конвенции придуманы? Сегодня на этой системе (см. твой код) это работает (callback'и / stdcall'ы без сохранения регистров) а завтра в Vista II нет (cм. пост #2). И анализ ядра на локальной системе не поможет другим пользователям программы, т.к. правила игры нарушены.
asmfan в посте номер 2, сорец никак ваще не инициализирует esi (я случайно его стёр когда копировал и свой программы в другую для демонстрации проблемы сабжа), так что тут конвенции ваще нипричём. да я же тоже говорю что по идее нада, в любом случае это офтоп, на всех системах которые у меня под рукой это можно и не делать (w2k, xp x64 sp1, w2k server sp1). Это я к тому что все мы (или многие по крайней маре) начинали учиться кодить на асме у Iczelion'а, он этого никогда не делал (случайность?), возьмём шаблоны в RadAsm'у там тоже оконные процедура вызывается без сохранения регистров (случайность?), 2 случайности закономерность, у кого есть виста проверьте код, я уверен что и там он работает без ошибок, и ваще я не понимаю о чём мы сейчас спорим? хотите идеала - сохраняйте, хотите не сохраняйте я наверн уже раза 2 говрил что этот тред запускается заходит в вечный цикл, и висит в нём до прибития приложения, так что там хоть ваще рет не пиши, от этого ничего не изменится Мне кажется тема исчерпана на посте №5