-
Продолжаю возиться в свободное время с "саморисованным" окном, которое бы работало под всеми 32-битными Windows. Столкнулся с проблемой при изменении размеров окна (изменение инициируется самой программой).
Пробовал изменять размеры окна через SetWindowPos() и MoveWindow(). После вызова одной из этих функций пересоздаю регион с использованием новых размеров окна и применяю функцией SetWindowRgn(). Копию региона получаю функцией GetWindowRgn(), чтобы затем использовать при прорисовке границы окна. Для отладки использую RoundRect-регион.
Для проверки работоспособности создаю таймер, в TimerProc() вызываю вышеописанную процедуру изменения размеров окна. Размеры окна просто увеличиваю на константу. При этом в Win98 наблюдаю, как все углы, кроме правого нижнего, становятся прямоугольными, а не скругленными. Экспериментировал с RedrawWindow() и флагами SWP() и MW() - цели достигнуть не удалось.
Как всё-таки правильнее реализовать процедуры изменения размеров окна нестандартной формы?
-
Проблема решена. Причина в собственной невнимательности.
Программа пишется на ассемблере. Как известно, все API-функции гарантируют сохранение значений регистров EBX, ESI и EDI. Но при передаче управления callback-функциям значения этих регистров могут быть произвольными. В моей программе регистр EBX содержит нулевое значение для уменьшения размера результирующего EXEшника. В обработчике таймера значение EBX не было установлено явным образом, из-за чего при вызове API-функций вместо нылевых значений передавались некоторые "произвольные". В Win2K/XP/позже, как правило, эта особенность остаётся незаметной, в Win9x подобная ошибка сразу же приводит к аномальному поведению программы, что и произошло в этот раз.
-
-
Так ведь самое обидное, что на одном из форумов буквально за неделю до этого несколько раз отписал эту особенность. И сегодня полдня, собираясь прописать таймер, прикидывал, что надо это не упустить. В итоге - "опять двойка" :) Видна такая уж судьба мне: набивать на колбэках руку через другие больные места :)
|