Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.06.09;
Скачать: CL | DM;

Вниз

SetWindowPos в Win98 сбивает регионы???   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2010-02-08 00:42) [0]

Продолжаю возиться в свободное время с "саморисованным" окном, которое бы работало под всеми 32-битными Windows. Столкнулся с проблемой при изменении размеров окна (изменение инициируется самой программой).

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

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

Как всё-таки правильнее реализовать процедуры изменения размеров окна нестандартной формы?


 
ProgRAMmer Dimonych ©   (2010-02-08 01:46) [1]

Проблема решена. Причина в собственной невнимательности.

Программа пишется на ассемблере. Как известно, все API-функции гарантируют сохранение значений регистров EBX, ESI и EDI. Но при передаче управления callback-функциям значения этих регистров могут быть произвольными. В моей программе регистр EBX содержит нулевое значение для уменьшения размера результирующего EXEшника. В обработчике таймера значение EBX не было установлено явным образом, из-за чего при вызове API-функций вместо нылевых значений передавались некоторые "произвольные". В Win2K/XP/позже, как правило, эта особенность остаётся незаметной, в Win9x подобная ошибка сразу же приводит к аномальному поведению программы, что и произошло в этот раз.


 
Игорь Шевченко ©   (2010-02-08 02:22) [2]

Правило номер раз: При вызове Callback-функций все регистры имеют неопределенное значение и любой, кроме EAX,EDX должен быть сохранен.

http://transl-gunsmoker.blogspot.com/2008/12/3.html


 
ProgRAMmer Dimonych ©   (2010-02-08 02:46) [3]

Так ведь самое обидное, что на одном из форумов буквально за неделю до этого несколько раз отписал эту особенность. И сегодня полдня, собираясь прописать таймер, прикидывал, что надо это не упустить. В итоге - "опять двойка" :) Видна такая уж судьба мне: набивать на колбэках руку через другие больные места :)



Страницы: 1 вся ветка

Текущий архив: 2013.06.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
15-1359801615
Киноман
2013-02-02 14:40
2013.06.09
Вспомнить фильм


3-1289558383
dest81
2010-11-12 13:39
2013.06.09
Поиск по несуществующему полю


15-1359043243
Kerk
2013-01-24 20:00
2013.06.09
Джо Армстронг об обучении программированию


15-1359614914
aka
2013-01-31 10:48
2013.06.09
простенький хостинг для проектов


3-1289841568
Demien
2010-11-15 20:19
2013.06.09
Работа с транзакцией