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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование 
V
    Опции темы
MenSem
Дата 8.12.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Заменил. Теперь белый квадрат есть.
А вот рисование мышью неаботает.
--------------------
PM MAIL   Вверх
maxim1000
Дата 8.12.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



Цитата(MenSem @  8.12.2008,  20:56 Найти цитируемый пост)
А вот рисование мышью неаботает. 

т.к. все изменения происходят в памяти, нужно их периодически сбрасывать на экран
т.е. делать отрисовку содержимого окна (InvalidateRect)

ну или все действия в памяти дублировать на экране, но это кривее и без хороших причин (типа производительности), ИМХО, делать не стоит


--------------------
qqq
PM WWW   Вверх
J0ker
Дата 9.12.2008, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



делайте InvalidateRect на окно - тогда вызовется WM_PAINT, в котором должен быть BitBlt


--------------------
user posted image
PM MAIL   Вверх
MenSem
Дата 9.12.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проблема решилась добавлением в код
Код

RECT rt;
GetClientRect(hWnd, &rt);
InvalidateRect(hWnd,&rt , false);


Большое спасибо.
Только я так понимаю что тут не обязательно весь клиент перерисовывать?
--------------------
PM MAIL   Вверх
J0ker
Дата 10.12.2008, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MenSem @ 9.12.2008,  21:02)
Проблема решилась добавлением в код
Код

RECT rt;
GetClientRect(hWnd, &rt);
InvalidateRect(hWnd,&rt , false);


Большое спасибо.
Только я так понимаю что тут не обязательно весь клиент перерисовывать?

необязательно
но в данном случае BitBlt очень быстрая и простая операция, поэтому можно перерисовывать все окно
если хотите перерисовывать только то, что нужно, то на WM_PAINT надо сначала вызвать GetUpdateRect - если он вернет TRUE, можно воспользоваться квадратом, который он даст, а можно тем, который даст последующий вызов BeginPaint. Если GetUpdateRect вернет FALSE, то ничего делать не надо.
так-же рекомендую перехватить WM_ERASEBKGND и просто возвращать TRUE - избежите мерцания при перерисовке, но тогда при обработке WM_PAINT бэкгроунд перерисовывать надо самому.


--------------------
user posted image
PM MAIL   Вверх
MenSem
Дата 10.12.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(J0ker @  10.12.2008,  06:42 Найти цитируемый пост)
так-же рекомендую перехватить WM_ERASEBKGND и просто возвращать TRUE - избежите мерцания при перерисовке, но тогда при обработке WM_PAINT бэкгроунд перерисовывать надо самому.

Перехватил, добавил в WM_PAINT:
Код

RECT rt;
GetClientRect(hWnd, &rt);
FillRect(WinDC, &rt , (HBRUSH) 13);

При изменении размером мерцание стало меньше.
Но появилось мерцание при рисовании. Тогда добавил проверку флага в WM_PAINT и мерцание пропало. 
Еще одно спасибо за это. 
--------------------
PM MAIL   Вверх
MenSem
Дата 10.12.2008, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Замечен глюк "прозрачного фона" при активации . Я так понимаю просто при активации добавить перерисовку фона?

Кстати битмап рисую поцентру, и по этому надо кординаты корректировать. Я кординаты изменяю вручную. Или есть способы получше?
--------------------
PM MAIL   Вверх
J0ker
Дата 10.12.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если в memDC у вас полная клиентская зона - то в WM_PAINT не надо заполнять бэкграунд - просто копируете BitBlt и все - в memDC уже все есть

Добавлено через 3 минуты и 47 секунд
Цитата(MenSem @  10.12.2008,  20:03 Найти цитируемый пост)
Замечен глюк "прозрачного фона" при активации . Я так понимаю просто при активации добавить перерисовку фона?

на любой WM_PAINT надо отрисовать все, что в инвалидном прямоугольнике

Цитата(MenSem @  10.12.2008,  20:03 Найти цитируемый пост)
Кстати битмап рисую поцентру, и по этому надо кординаты корректировать. Я кординаты изменяю вручную. Или есть способы получше? 

что значит вручную? перерасчитываете при WM_PAINT? другого способа насколько я знаю нет, но не вижу тут никаких проблем


--------------------
user posted image
PM MAIL   Вверх
MenSem
Дата 10.12.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(J0ker @  10.12.2008,  22:20 Найти цитируемый пост)
что значит вручную? перерасчитываете при WM_PAINT? другого способа насколько я знаю нет, но не вижу тут никаких проблем

Я имею в виду кординаты курсора при щелчке  и движении. 

Цитата(J0ker @  10.12.2008,  22:20 Найти цитируемый пост)
если в memDC у вас полная клиентская зона - то в WM_PAINT не надо заполнять бэкграунд - просто копируете BitBlt и все - в memDC уже все есть

Нет, битмап только на часть клиента.


Цитата(J0ker @  10.12.2008,  22:20 Найти цитируемый пост)
на любой WM_PAINT надо отрисовать все, что в инвалидном прямоугольнике

Это по ходу потому что влаг после щелчка переходит в значение true. А у меня в WM_PAINT при рисовании мышкой фон заново не заливается...
--------------------
PM MAIL   Вверх
J0ker
Дата 11.12.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MenSem @  10.12.2008,  22:52 Найти цитируемый пост)
Я имею в виду кординаты курсора при щелчке  и движении. 

координаты приходят в координатах клиентской области
правильная обработка следующая:

case WM_LBUTTONDOWN:
        запомнить координаты в prev_position
        выставить флаг mouse_lock
        SetCapture(hWnd);
        break;

case WM_LBUTTONUP:
        if(!mouse_lock)
            break;
        сбросить флаг mouse_lock
        ReleaseCapture();
        break;

case WM_MOUSEMOVE:
        if(!mouse_lock)
            break;
        if(координаты == prev_position)
            break;
        обработать новые координаты
        запомнить координаты в prev_position
        break;



--------------------
user posted image
PM MAIL   Вверх
MenSem
Дата 11.12.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



J0ker, это и так понятно...
--------------------
PM MAIL   Вверх
J0ker
Дата 11.12.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



обратите внимание на SetCapture/ReleaseCapture - многие этой фичи не знают
так-же многие не знают, что WM_MOUSEMOVE может генерироваться без реального перемещения мыши и координаты будут одни и те-же - поэтому нужна проверка


--------------------
user posted image
PM MAIL   Вверх
MenSem
Дата 11.12.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



И то и другое я знаю.
--------------------
PM MAIL   Вверх
MenSem
Дата 11.12.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Только вот в моем случае сначало кординаты надо корректировать
--------------------
PM MAIL   Вверх
J0ker
Дата 12.12.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MenSem @ 11.12.2008,  22:46)
Только вот в моем случае сначало кординаты надо корректировать

Цитата

WM_MOUSEMOVE Notification
.......
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area

The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area



--------------------
user posted image
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1088 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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