Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2013.06.09;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2013.06.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.002 c
9-1194720876
Extracter
2007-11-10 21:54
2013.06.09
Не работают glDrawArrays и glDrawElements- не найдены


2-1352062678
HEND
2012-11-05 00:57
2013.06.09
DBImage Вопрос


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


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


2-1352129772
Jimmy
2012-11-05 19:36
2013.06.09
Как быстро сравнить две строки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский