PDA

Просмотр полной версии : Прорисовка окна



Aram
23.05.2007, 00:04
здравствуйте!
скажите пожалуйста как сделать, чтоб изоображения в окне представления перемещалась во время прокрутки (т.е. где мне перерисовывать )

WinMain
23.05.2007, 13:55
Если ты работаешь с MFC, то для прокрутки окно вида должно наследоваться не от CView, а от CScrollView. Отрисовка, как и в обычном CView, производится в методе OnDraw()

Aram
23.05.2007, 19:23
Если ты работаешь с MFC, то для прокрутки окно вида должно наследоваться не от CView, а от CScrollView. Отрисовка, как и в обычном CView, производится в методе OnDraw()

У меня так и есть окно вида порожден от CScrollView прорисовку делаю в OnDraw, но в режиме Debug я когда я двигаю полосу прокрутки то программа в OnDraw не входит

BBB
24.05.2007, 09:48
Aram,
Может, на этот контрол надо что-нибудь вроде флага OWNERDRAW поставить? Наверняка не знаю, но во многих других типах контролов возможность установки такого флага имеется. (А, может, сейчас вот вообще какую-нибудь глупость сказал :))

Romeo
24.05.2007, 13:50
Есть виндовые нотификации WM_HSCROLL и WM_VSCROLL, которые посылает паренту Scroll контрол. Именно их и нужно слушать. В случае MFC, думаю, эти нотификации превращаются в виртуальные функции, например OnHScroll, которые нужно перегружать и имплементировать у себя в классе.

WinMain
24.05.2007, 14:28
BBB, ты и правда не в тему ляпнул.
Romeo, Все необходимые оконные сообщения в классе CScrollView уже перехвачены и обработаны, все необходимые виртуальные функции тоже имплементированы. Нужно только правильно всем этим воспользоваться. Скорее всего автор топика сам чего-то накосячил. Вот пример проекта, который я сам сделал. У меня всё работает.

Aram
25.05.2007, 11:18
BBB, ты и правда не в тему ляпнул.
Romeo, Все необходимые оконные сообщения в классе CScrollView уже перехвачены и обработаны, все необходимые виртуальные функции тоже имплементированы. Нужно только правильно всем этим воспользоваться. Скорее всего автор топика сам чего-то накосячил. Вот пример проекта, который я сам сделал. У меня всё работает.

Уважаемый WinMain Ваша программа прекрасно работает (в режиме Debug при прокрутки или изменении размера окна программа входит в OnDraw() ), но в моей программе при прокрутки или при изменении размера окна программа не входит в OnDraw()). Когда нажимаю на Print Preview то программа входит в OnDraw.
Я работаю компилятором Visual Studio 6.0. делаю следующее
В окне ClassView щелкаю на CScrollView, правым щелчком мыши выбираю «Add Virtual Function» затем в окне New Virtual Function выбираю OnDraw() затем нажимаю на кнопку Add and Edit.

Romeo
25.05.2007, 13:40
ну вот, проблема локализована. значит во всём виноват, как обычно, программист, а не разработчик среды программирования :) осталось самое простое: внимательно сравнить ключевые места в работающем и в не работающем коде. что может быть проще? :)

Aram
25.05.2007, 17:21
Проблема решилась
Я удалил OnPaint() и программа уже входит в OnDraw(). Получается OnPaint() и OnDraw() одновременно нельзя использовать?
Но у меня осталась еще одна проблема: Мне нужно, чтоб при прокрутки начало координат тоже смещались т.е (Например первоначальное начало координат это когда горизонтальная полоса находится в крайнем левом положении а вертикальная в крайнем верхнем положении), когда я горизонтальную полосу прокрутки передвигаю на 10 мм мне нужно чтоб координаты видимой области тоже изменялись т.е. координаты нижнего левого угла стали (10, 0) . Еще один вопрос почему когда в OnInitialUpdate
я изменяю SetScrollSizes(MM_TEXT,Size); на SetScrollSizes(MM_LOENGLISH, Size); то текст не отображается.

Absurd
25.05.2007, 17:36
Проблема решилась
Я удалил OnPaint() и программа уже входит в OnDraw(). Получается OnPaint() и OnDraw() одновременно нельзя использовать?

Попробуй в начало OnPaint засунуть CScrollView::OnPaint(параметры)

Romeo
25.05.2007, 18:48
Совершенно верно. Посмотри имплементацию OnPaint базоваго класса и увидишь, что она вызывает OnDraw. Таким образом, если ты перегружаешь OnPaint в своём классе и не вызываешь там OnPaint базового класса, то OnDraw просто некому вызвать, вот и всё.