![]() |
|
|
![]()
|
|
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Так чье решение все-таки взял за основу? ;)
Добавлено @ 19:08
Не-а -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Тогда, может, ScrollWindow (как в ScrollView) ?
Та же фигня... Короче, в данном случае (чтобы фон был прибит) придется перерисовывать все окно, потому что функции ScrollЧегоНибудь очень экономно перемещают биты контекста и плевать им, что там - фон, текст. А в данном случае нужно именно тупо перерисовывать окно в другой позиции... -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Нет. Там роме SetWindowPos() ни одной функции, что-либо скролирующей =)
Так посмотри в моем коде - так и делается! Окно таскается именно целиком =) Я вот только не очень понял изначально - хорошо это или плохо? Нужно, чтобы фон гулял вместе с окном, или наоборот, стоял на месте? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Coocky, по-моему, нужно, чтобы фон не двигался.
Значит, твой код ему подойдет. А вообще, если таких изысков с фоном нет (т.е. окно прокручивается как единое целое), обычно используют ScrollWindow или ScrollDC (это просто копирование той части окна, которая уже есть, но в новую позицию). Плюс, ScrollWindow еще дополнительно делает инвалидными те части окна, которые до перемещения были скрыты. И для них тебе приходит WM_PAINT. Если делаешь ScrollDC, то это нужно делать руками, но больше управляемость... Конечно, код получается посложнее, чем просто SetWindowPos. Но если для, скажем, списка какого-нибудь перисовка (а SetWindowPos - это полная перерисовка, как ты понимаешь)... - максимум моргание вызовет (с которым можно побороться), то для окна набитого более-менее сложной графикой (или картинкой смасштабированной), такая реализация скроллинга будет сильно тормозить... А закат солнца вручную (ScrollDC + Invalidate недостающих кусочков) - летает... -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Я согласен, но во-первых, можно сделать "умную" перерисовку в OnPaint,отрисовав предварительно все содержимое окна в некий виртуальный битмеп размера, равного таскаемому окну, а во-вторых, от прокрутки обычно диких скоростей перерисовки не требуется, главное, как ты уж упомянула, чтобы не было противного глазу моргания. А подтормаживания скроллбаров работе не вредят (например, вспомним чтение документа в MS Word). Мы один раз тыркаемся в скролл, выставляем область прокрутки на нужную позицию, не сильно обращая внимания на небольшие задержки в скроллировании (а их можно сделать действительно совсем небольшими),и потом долго и упорно читаем текст с данного места. Добавлено @ 20:48 Вообще, в программировании внешнего интерфейса есть две крайности: 1. Красиво, запутано,но глючно. 2. Строго, быстро, но скучно -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Я про графику говорила - рабочий экран программ типа Photoshop, Corel, AutoCAD в конце концов. Кроме того, прокрутка - это не только с помощью скролл-баров, но еще и с помощью мышиного косеса, а также панорамирование (это когда экран как бы таскают за любое место - черт его знает, почему это панорамированием называется). Короче говоря, если в таких программах прокрутка будет тормозить, пользователи повесятся... или закидают тухлыми яйцами аффтара -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Ладно, подождем Coocky, послушаем, чем же все-таки закончились его страдания.
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
||||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Они еще вчера закончились
Че у вас с трафиком? Вот еще , что хотел спросить.. Про OnIdle. Она только ж в App перегружается? Дело в том, при каждом ресайзинге большого окна я перерисовываю две кнопки в правом верхнем углу. Если этого не сделать, то если резко и быстро таскать приложение(растягивать) влево-вправо, то рано или поздго-одна кнопка захватит часть изображения второй. Однако если перерисовывать -все нормально-но Ма-а-аленькое мерцание при растягивании. Я вот подумал, а что если перерисовать после растяжки, т.е. словить отсутсвие сообщения. Но только один раз, вернее когда значение счетчика остусвия сообщений =1 Только вот плохо то, ЧТО б достучаться до кнопки, нужно лезть к ним через указатели. Как можно решить эту проблему? И вообщем сам способ-хорош? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
||||||
|
|||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Ну CScrollView Просто прокрутка там делается ОДНОЙ функцией Надо ж знать, как самому крутить. Кстати-ничего сложного, чистая математика. Я просто думал, что окна нужно еще и самому отрисовывать, когда они выходят за рамки окна -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Еще в документе. Но в окнах тоже можно ловить Idle. В модальном диалоге, в карту сообщений нужно добавить обработчик сообщения WM_KICKIDLE. Это сообщение определено в MFC, нужно подключить afxpriv.h Кажется, сообщение посылается без параметров, во всяком случае, я никогда их не использовала, и не знаю, что в них. Поэтому получить счетчик отсутствия сообщений не получится. Но можно (и даже лучше) сделать так: завести переменную в классе, скажем, bNeedRedraw, OnSize - ставим ее в 1, OnIdle - проверяем, и если она 1, делаем кнопкам Invalidate и сбрасываем. -------------------- ... |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Дык откелева у меня модальный диалог? Пойми, я хочу в OnIdle сделать переисовку, но как мне достучаться до окон из CWinApp? А если оттуда нельзя, как же получить похожее на OnIdle в моих классах? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А какой же у тебя диалог? В твоем коде, что я видела - главный диалог модальный и есть. У тебя ведь вообще диалоговое приложение. Остальные диалоги - вложенные child'ы. Им ничего такого не приходит - значит, нарисуй соответствующую функцию у контейнера и вызывай из главного диалога. А главному - должен приходить WM_KICKIDLE, как я и говорила.
Для справки: для немодальных окон тоже есть свое сообщение: WM_IDLEUPDATECMDUI, расылается из App как раз на Idle. Но это только для SDI или MDI приложения. -------------------- ... |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
А ну да Че-то я и в МСДН толком ничего не найду по этому сообщению. Как его определить? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| takedo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Coocky
и т.д. А послать сообщение можешь вообще накрайняк всем, зарегистрировав его... Или Взведи евент, а по нему отрисовывай отдельно каждое окно. А лучше просто (диалоги то надеюсь объявляешь во фрейме документа?) взять да послать WM_PAINT каждому аля ::PostMessage(pFrame->mydlg[7]->GetSafeHwnf(),WM_PAINT,0,0) или напрямки pFrame->mydlg[7]->Invalidate(). А если я не в тему, то уж не обессуть -------------------- я не гольфист - я хоккеист |
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Да у меня окно диалоговое
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |