Другие языки программирования и технологии

Как в фасме указать обновляемую область?

Я не могу поставить просто
InvalidateRect, [wc],0,0,20,20,1
A.
Aybek .
23 039
Этот вопрос очень яркий пример того как не стоит задавать вопросы. Потому что этот вопрос описывает не саму возникшую проблему ставящую в тупик вопрошающего а глупый и скорее всего заведомо нерабочий способ ее решения.

Предполагаю что автор вопроса почему то выдумал что вызов "InvalidateRect" должен вызывать перерисовку указанного региона.
А на самом деле эта функция ведет себя так как описано в документации и просто вызывает у зарегистрированной оконной процедуры (hwnd) сообщение WM_NCPAINT через wParam передает регион но в 99.9% оконные процедуры игнорируют это сообщение и оно попадает в стандартный системный обработчик DefWindowProc который просто вызывает WM_PAINT но уже без указания региона для отрисовки.
Т. е. объясняя на пальцах вызывать InvalidateRect это правильно и хороший тон, но в подавляющем большинстве случает он ничем не отличается от полной перерисовки окна и поведение зависит от того как принимающее окно обрабатывает сообщение WM_NCPAINT.
Евгений Болуков
Евгений Болуков
12 592
Лучший ответ
Aybek . А как правильно обработать это сообщение? Через WM_NCPAINT?
Aybek . А я тут по всякому экспериментирую и безрезультатно.
Евгений Болуков Вопрос вырван из контекста.
Но если отрисовку окна выполняет твой код (оконная процедура) то необходимо обработать сообщение WM_NCPAINT из параметра wParam получить регион, перерисовать его и прервать процедуру что бы не допустить обработку сообщения WM_NCPAINT стандартной системной процедурой DefWindowProc.
Что значит не можете? В вопросе хорошо бы указывать что происходит и что конкретно не получилось и/или написал компилятор.

А так - есс-но у InvalidateRect немного другие параметры
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-invalidaterect

HWND, _УКАЗАТЕЛЬ_ на структуру с координатами, признак.
Вы-же похоже пытаетесь передать координаты в стеке вместо адреса структуры. + где invoke?

На MASM это бы могло выглядеть так:

WndProc refresh
LOCAL rct:RECT

mov [rct.left], 0
mov [rct.top], 0
mov [rct.right], 20
mov [rct.bottom], 20
mov hwnd, ..; или без mov - я не знаю как Вы передаёте дескриптор
; может норм и [wc] как параметр - тут смотрите сами.

invoke InvalidateRect, hwnd, addr rct, 1
Aybek . Хорошо. Я понял что это указатель и всё стало понятно.
Но область конкретную указанную не обновляет. Обновляет ВСЁ. Экран мигает. Я это всё пишу чтобы экран не мигал.
Aybek . И да.
Invoke CreateCompatiblDC, [wnd_dc]
Mov [bmp_dc], eax
Этот есть. Забыл дописать