Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> screenmate - проблемы с SetWindowRgn, Не всегда меняет форму окна:( 
:(
    Опции темы
IvanG
Дата 3.11.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Решил разобраться с устройством Скринмейтов (программок бегающих по экрануsmile). Долго мучился с разрезанием картинки и т.д. (С++ знаю не очень...), но тем не менее добился кое-каких результатов.
Скринмейтом полученное творение назвать нельзя, т.к. форма окна и картинка меняется по нажатию клавишь ВВЕРХ, ВНИЗ, выход на Escape. Ну естественно анимации нет. Картинку выдрал из другого скринмейтаsmile

Так вот, теперь собственно о проблеме:
При нажатии клавиш вызывается функция RePaint, которая выводит на окошко другую картинку и устанавливает новую форум окна посредством SetWindowRgn, но тут не все просто, у меня почему то она не всегда меняет форму окна. И тут нет проблем с неправильно заданым регионом и т.д.
Получается что когда мотаешь картинки и форму окна на кнопки ВВЕРХ/ВНИЗ, картинки меняются всегда, а вот форма иногда подтупливает и остается прежняя 
Картинки и формы(регионы) заданы в двух разных массивах.

Прикрепляю архив с компиленным бинарником и исходниками


Код функции RePaint (может в ней проблема?)
Код

void RePaint()
{
    PAINTSTRUCT ps;
    HDC hdcBits;
    HDC hdc;
    SetWindowRgn(hWnd, mask[ind_image], true);
    hdc = BeginPaint(hWnd, &ps);
    hdcBits=::CreateCompatibleDC(hdc);
    SelectObject(hdcBits, bAr[ind_image]);
    BitBlt(hdc, 0, 0, 50, 50, hdcBits, 0, 0, SRCCOPY);
    DeleteDC(hdcBits);
    EndPaint(hWnd, &ps);
    //InvalidateRgn(hWnd, mask[ind_image],false);
    InvalidateRect(hWnd, 0, false);
    return;
}


Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  screenmate_source_and_binary_.zip 127,22 Kb
PM MAIL   Вверх
mekhanikus
Дата 3.11.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: 1
Всего: 1



Для начала я бы попробовал в WM_KEYDOWN посылать  InvalidateRgn.

В RePaint заменил бы InvalidateRect  на ValidateRgn.

Хотя, если есть EndPaint, последнее может быть лишнее.
PM MAIL   Вверх
IvanG
Дата 3.11.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Я не очень силен в винапи, но насколько я успел понять, когда листал справку, ValidateRgn - наоборот устанавливает область которую не надо обновлять.
И сейчас я уже поточнее могу сказать: SetWindowRgn не устанавливает второй раз форму окна по одному и тому же региону, т.е. у меня в программе из массива (170 эл-тов) по очереди (по нажатию клавишь) ставятся разные формы окна и заливаются разными картинками, и по проходу всего этого массива ставится последняя уникальная форма и после не меняется. Тоже самое наблюдается и если прокрутить 5 форм вперед и попробовать вернутся назад, то есть те формы, которые уже ставились, повторно ставится не будут.
Кажется мне надо поусиленне покурить хелпы по этой функции...
PM MAIL   Вверх
GremlinProg
Дата 3.11.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



при нажатии кнопки рисовать ничего не надо, mekhanikus верно подсказывает,
там нужно только сменить регион и вызвать Invalidate,
а рисовать нужно в WM_PAINT

повторно использовать регион для этих нужд и не получится:
Цитата(SetWindowRgn @ MSDN)

After a successful call to SetWindowRgn, the system owns the region specified by the region handle hRgn. The system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not delete this region handle. The system deletes the region handle when it no longer needed.

как вариант - делай копию региона через CombineRgn и RGN_COPY и уже эту копию передавай в SetWindowRgn


Это сообщение отредактировал(а) GremlinProg - 3.11.2009, 18:10


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0929 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.