Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CScrollBar и WM_MOUSEWHEEL, что я делаю не так 
:(
    Опции темы
dauster
Дата 16.1.2005, 23:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Суть проблемы в следующем - есть прога (С++/MFC), одной из функций которой является демонстрация изображений (последних может быть много). Когда какая-либо картинка не помещается в область рисования, появляются скроллбары (вертикальный и/или горизонтальный в зависимости от потребностей) для осуществления функции прокрутки. Делается это примерно так:

Код

//файл "MyDlg.h"

class ... {
...

public:

CScrollBar *Hor, *Vert;
bool          Hbar, VBar;
...
...
}


Код

//файл "MyDlg.cpp"
...

BEGIN_MESSAGE_MAP(BlaBlaBla, CDialog)
...
ON_WM_MOUSEWHEEL()
...
END_MESSAGE_MAP()
...
...
void BlaBlaBla::LoadMyImage(int num)
{
/*
Грузит картинку, если это необходимо, то устанавливает скроллбары
*/
...
//Если скроллбары уже были, то убиваем их
  if(HBar)delete Hor;
  if(VBar)delete Ver;
...
  Hbar = false;
  VBar = false;
...
   if(MyImage.Width > ImageArea.Width){
                                                                    ...
                                                                    Hbar = true;
                                                                    Hor = new ScrollBar();
                                                                    Hor->Create(WS_CHILD|WS_VISIBLE|SBS_HORZ, CRect(...), this, 3010);
                                                               }
 
   if(MyImage.Height > ImageArea.Height){
                                                                    ...
                                                                   VHbar = true;
                                                                   Ver = new ScrollBar();
                                                                   Ver->Create(WS_CHILD|WS_VISIBLE|SBS_VERT, CRect(...), this, 3011);

                                                               }
}

BOOL BlaBlaBla::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
/*
в зависимости от того в каком направлении крутиться колесо, вызывается функция загрузки следующей или предыдущей картинки
*/
          ...
          LoadMyImage(num);
          ...
           return CDialog::OnMouseWheel(nFlags,zDelta,pt);
}


Вот. Вся эта фигня, в принципе, работает. Т.е. картинки листаются, скроллбары создаются и исчеают в зависимости от потребности. Но до поры до времени, а именно до того момента, пока программа не потеряет фокус. После этого (когда фокус, ессно, уже снова восстановлен) она перестает ловить WM_MOUSEWHEEL вообще. Т.е. картинки больше меняться не хотят. Правда остальные события мыши ловит - проверено.

И еще, если убрать скроллбары, то потеря фокуса и его повторное приобретение никак не сказываются на процессе листания картинок (событие WM_MOUSEWHEEL не пропадает неизвестно где), так что, я думаю, что где-то напортачил со CScrollBar.

P.S. кроме сказанного могу добавить, что иногда скроллбары создаются с мигающим слайдербоксом (надеюсь, правильно вспомнил smile ) - мне это тоже не нравиться и наводит на мысли об ошибке в коде. Может я не правильно работаю с динамически создаваемыми CScrollBar?
  Вверх
alien_by
Дата 17.1.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

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



1. По поводу пропадания реакции на скроллинг!!! Всё зависит от того, как ты отображаешь каритинку на своём диалоге, если просто рисуешь с помощью контекста диалога, то честно тебе скажу очень странно (возможен глюк в библиотеке, да...да... и Microsoft не без грехов smile ), если же ты используешь что-то типа Picture Control или что-либо подобное, то может возникать ситуация, что после возврата фокуса, сообщение WM_MOUSEWHEEL по каким-либо причинам не транслируется родительскому окну (т.е. твоему диалогу). В общем и первый и второй случай хоть маловероятны, но вполне возможны. Других соображений по этому вопросу у меня пока нет, покопаюсь в доке, может позже чего поконкретней скажу.

2. По поводу мигающих слайдербоксов, при каждой загрузке изображения, ты снова и снова пересоздаёшь скролбары, это не лучший способ, т.к. при этом происходит их перерисовка, из-за этого может возникать ощещение мигания. Вместо пересоздания, могу посоветовать, создать скролбары один раз и перенастраивать их параметры в соответствии с вновь загруженной картинкой или делать невидимыми, если они не нужны.
PM MAIL ICQ   Вверх
dauster
Дата 17.1.2005, 15:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











alien_by

спасибо, помогло smile

По-пунктам могу сказать, что:

1) я не использую Picture Control - рамку и само изображение рисую просто в самом диалоге.
2) действительно, я что-то сглупил - при одноразовом создании скроллбаров и их последующей модификации посредством MoveWindow(...) - все глюки исчезли.

Интересно, а почему глюки все-таки были?...
  Вверх
alien_by
Дата 17.1.2005, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

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



И Microsoft не без греха... smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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