Главная страница
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.006 c
15-1359642013
Лиля
2013-01-31 18:20
2013.06.09
как связать delphi,sql и модем ST10


2-1348466696
Вячеслав
2012-09-24 10:04
2013.06.09
Дескриптор ClientSocket


3-1290119666
TheEd
2010-11-19 01:34
2013.06.09
Есть ли возможность автоматически грузить описания полей?


4-1265370495
brahman
2010-02-05 14:48
2013.06.09
проблема с OpenStream


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