Конференция "WinAPI" » SetWindowPos в Win98 сбивает регионы???
 
  • ProgRAMmer Dimonych © (08.02.10 00:42) [0]
    Продолжаю возиться в свободное время с "саморисованным" окном, которое бы работало под всеми 32-битными Windows. Столкнулся с проблемой при изменении размеров окна (изменение инициируется самой программой).

    Пробовал изменять размеры окна через SetWindowPos() и MoveWindow(). После вызова одной из этих функций пересоздаю регион с использованием новых размеров окна и применяю функцией SetWindowRgn(). Копию региона получаю функцией GetWindowRgn(), чтобы затем использовать при прорисовке границы окна. Для отладки использую RoundRect-регион.

    Для проверки работоспособности создаю таймер, в TimerProc() вызываю вышеописанную процедуру изменения размеров окна. Размеры окна просто увеличиваю на константу. При этом в Win98 наблюдаю, как все углы, кроме правого нижнего, становятся прямоугольными, а не скругленными. Экспериментировал с RedrawWindow() и флагами SWP() и MW() - цели достигнуть не удалось.

    Как всё-таки правильнее реализовать процедуры изменения размеров окна нестандартной формы?
  • ProgRAMmer Dimonych © (08.02.10 01:46) [1]
    Проблема решена. Причина в собственной невнимательности.

    Программа пишется на ассемблере. Как известно, все API-функции гарантируют сохранение значений регистров EBX, ESI и EDI. Но при передаче управления callback-функциям значения этих регистров могут быть произвольными. В моей программе регистр EBX содержит нулевое значение для уменьшения размера результирующего EXEшника. В обработчике таймера значение EBX не было установлено явным образом, из-за чего при вызове API-функций вместо нылевых значений передавались некоторые "произвольные". В Win2K/XP/позже, как правило, эта особенность остаётся незаметной, в Win9x подобная ошибка сразу же приводит к аномальному поведению программы, что и произошло в этот раз.
  • Игорь Шевченко © (08.02.10 02:22) [2]
    Правило номер раз: При вызове Callback-функций все регистры имеют неопределенное значение и любой, кроме EAX,EDX должен быть сохранен.

    http://transl-gunsmoker.blogspot.com/2008/12/3.html
  • ProgRAMmer Dimonych © (08.02.10 02:46) [3]
    Так ведь самое обидное, что на одном из форумов буквально за неделю до этого несколько раз отписал эту особенность. И сегодня полдня, собираясь прописать таймер, прикидывал, что надо это не упустить. В итоге - "опять двойка" :) Видна такая уж судьба мне: набивать на колбэках руку через другие больные места :)
 
Конференция "WinAPI" » SetWindowPos в Win98 сбивает регионы???
Есть новые Нет новых   [134432   +18][b:0][p:0]