Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокрутка CWnd (MFC), Как это корректно организовать? 
:(
    Опции темы
semion_p
  Дата 14.6.2003, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хотел спросить вашего совета. Необходимо организовать вертикальную прокрутку CWnd (увы, не получается корректно работать CScrollView без его привязки к конкретному документу). Пользовался CWnd::SetScrollInfo(…) и CWnd::ScrollWindow(…), но происходит смещение лишь клиентской области окна. Смещённая же его часть не восполняется новым (ранее невидимым) содержимым.

Приведу пример кода :
MovesWnd.SetScrollRange(SB_VERT,0,500);
MovesWnd.ScrollWindow(0,-80);

Высота полной области рисования – 500, но высота клиентской области окна – лишь 400. Смещается лишь область окна, нижняя же его часть остаётся заполненной старым материалом, а не новым (ранее невидимым). Пробовал пользоваться вместо CWnd::SetScrollRange(…) методом CWnd::SetScrollInfo(…), но результат тот же. Как быть? И ещё. При малейшем перекрытии области окна OnPaint() сразу уничтожает смещение. Где бы его стоило обновлять? Быть может, где-нибудь в Интернете есть конкретные примеры, посвящённые этому вопросу? Заранее спасибо.

PM MAIL   Вверх
Myth
Дата 15.6.2003, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообще то можно использовать CScrollView и без привязки документа а просто создовать его как CWnd, а лучше отнаследоваться от CScrollView.
PM MAIL   Вверх
semion_p
Дата 15.6.2003, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, это было бы прекрасно, но, увы, во время закрытия окна вылезает runtime error, причём в недокументированном модуле (ассемблерные мнемоники). Одним словом, не знаешь где точка входа у данной ошибки (но понятно, что при деструкции CScrollView).
PM MAIL   Вверх
RAN
Дата 15.6.2003, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Уважаемый, semion_p, насколько я понял из описанной Вами картины, тут проблема с методом OnPaint(), который не учитывает прокрутки.
Цитата
Смещается лишь область окна, нижняя же его часть остаётся заполненной старым материалом, а не новым (ранее невидимым).

Вероятно, нижняя часть перерисовывается методом OnPaint, но так как этот метод не учитывает, что изображение смещено, он "лепит" туда то, что там было до смещения.
Цитата
При малейшем перекрытии области окна OnPaint() сразу уничтожает смещение

Причина та же.

Вывод, если хотите, чтоб работало именно так, то надо переписать OnPaint. Скажу сразу, что это его значительно усложнит (сам писал такую вещь, когда не было другого выхода). Или же создать ещё одно окно внутри.
PM MAIL ICQ   Вверх
semion_p
Дата 16.6.2003, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо. Покопаюсь ещё немного с CScrollView(а вдруг заработает?), и cтану переписовать OnPaint().

Это сообщение отредактировал(а) semion_p - 16.6.2003, 00:27
PM MAIL   Вверх
DENNN
Дата 16.6.2003, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Вывод, если хотите, чтоб работало именно так, то надо переписать OnPaint. Скажу сразу, что это его значительно усложнит

Ничего усложнять не надо, если используется SetViewportOrg/SetWindwOrg (что кстати в CScrollView уже сделано). Тогда в OnPaint можно просто рисовать вся сцену, не беспокоясь о том где сейчас скроллинг. smile.gif
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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