Название темы - перефразировка понятия "dll hell". Это из области .Net, когда обращают внимание на большое количество dll, находящихся в системе, имеющих разные версии, конфликтующих друг с другом и вообще мешающих жить. Разработчики .Net считают, что разобрались с этой проблемой, ну да не о том речь. А речь, собственно, о тех проблемах, которые создает необходимость обработки сообщения wm_paint (прочих тоже, но в гораздо меньшей степени).
Итак, сначала описание проблемы. Допустим, у нас есть окно, и мы хотим там что-то нарисовать. В Форте, разумеется. Надо вводить команды PIXEL CIRCLE LINE RECTANGLE и прочие? Нет, все совсем не так просто. Конечно, нарисовать-то можно, вот только жить этот рисунок будет до первого смещения окна по экрану, перетаскиванию поверх него другого окна и вообще до первой обработки сообщения wm_paint. Это сообщение посылается окну, когда оно должно перерисоваться, и вот тут-то и зарыта собака. Ведь мы никак не модифицировали обработчик wm_paint, и рисунок просто пропал. Кстати, пример с "пропадающим" текстом есть даже в Win32Forth. В справке честно предупреждают, что текст вывести можно, но после перерисовки его в окне уже не будет. Решение проблемы очевидно - надо написать в обработчике порядок действий по рисованию содержимого окна.
Вот тут и начинается собственно hell. Обработчик один, а вариантов содержимого экрана много. Программа вообще развивается, усложняется и живет своей жизнью в процессе разработки. И сидеть программисту в редакторе с открытым обработчиком wm_paint, то есть в самой ответственной части windows-приложения - обработчике сообщений. Там тоже не все просто - надо получить контекст рисования, нарисовать (внутри BeginPaint/EndPaint), освободить контекст. Контекст - это ресурс (а значит, если забудем освободить - имеем утечку ресурсов). Об интерактивной работе тоже не может быть и речи - обработчик нельзя перекомпилировать "на живую". Общий стиль работы соответствует чистому API графической системы Windows - вызов системных функций "вручную". Такой стиль предлагался еще в Borland Pascal 7.0 for Windows и Borland C 3.1 for то же самое. Старый стиль, вобщем. Кстати, в литературе по тем продуктам он рассматривался уже наряду с объектно-ориентированным подходом (OWL). Наконец, на смену пришли визуальные системы, например Delphi. В Delphi программист может ничего не знать о системных сообщениях, потому что в общем и целом надо сделать одно - скопировать некую область с рисунком в окно программы. Существует и специальный компонент - Canvas, представляющий собой массив точек. Программист может поставить на Canvas точку и забыть о ее существовании - обработчик wm_paint возьмет Canvas и скопирует его в окно. Конечно, мелкие рисунки отрисовать вручную было бы гораздо быстрее по сравнению с копированием большой прямоугольной области, зато удобно тем, что можно просто поставить Canvas.Pixels[100,100] = clRed в любой процедуре.
Кстати, вот еще один вариант обработчика wm_paint.
Код:
wmpaint:
invoke glClear,GL_COLOR_BUFFER_BIT
mov eax, 1024
sub eax, [ysize]
shl eax, 12
add eax, screen
invoke glDrawPixels, 1024, [ysize], GL_RGBA, GL_UNSIGNED_BYTE, eax
invoke SwapBuffers,[hdc]
То есть имеется массив screen, куда можно просто записать что-то в формате RGBA. Отрисовкой занимается само окно, копируя screen на поверхность OpenGL. Собственно, можно было бы и DirectX, и функции GUI, но так уж получилось