Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите добить программу, или окно-контейнер и работа с ним.. 
:(
    Опции темы
Coocky
Дата 30.1.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Итак я научился делать прозразный фон окон! Спасибо Earnest! Правда я чуть поправил код, ибо он не работал до конца нормально. Но огромное спасибо тебе за мысль!!! Спасла старика, и дала веру в себя! smile
Чуть позже я выложу вам способ smile
Теперь помогите добить окна..Я совсем перегорел.. smile
Я прикрепляю файл с интерфейсом.
Есть БОЛЬШОЕ главное диалоговое окно. Оно имеет три кнопки слева, две справа вверху и окно контейнер.
Обратите внимание! Посередине него есть большое окно. Оно имеет полосу прокрутки. Остальное вы не увидете из-за прозрачного фона оно сделано производным от СWnd Это окно контейнерsmile
Я нарисовал на БОЛЬШОМ (главном диалоге его как CUSTOM CONTROL)
Внутри этого окна создаются белые окошки-динамически по мере поступления сообщений от системы.
Белые окошки я сделал от диалоговых производными.
Теперь вопросы.
1.Где динамически создавать диалоговые окна? Так как я окно контейнер не создаю через Create(), то сообщения в этом классе по созданию окна отлавить невозможно. Поэтому я создаю диалоговые окна в OnInitDialog() большого окна..
2.Где ресайзить белые диалоговые окна? Они должны ресайэиться вместе с главным окном.
3.Как лучше контролировать каждое созданое белое окошко? Как знать о его уникальности? Создать массив указателей? Назначать каждому ID? Но как знать, что именно пятое диалоговое окошко должно обновить в себе элементы?

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  all.rar 51,45 Kb


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 30.1.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Никто даже не скачал файл! smile

Помогите!
smile
Добавлено @ 17:45
Я ж вам помогал в свое время, жулики! smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 30.1.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Coocky, это опять я...
Во первых, молодец, что справился с прозрачностью! Я же тебе говорила, что справишься smile
Во-вторых:
1) в OnInitDialog создавать дополнительные окна вполне нормально
2) Где ресайзить? Что за вопрос! Это же его child'ы - значит, в OnSize основного диалога
3) Конечно, нужно их все запомнить в массиве, я бы помнила pWnd, нафига их ID, это вообще что-нибудь служебное, лишь бы было.
4) Обновляются пусть сами, на OnIdle, и сами следят за своими изменениями. Скажем, главное окно по Idle вызывает их Idle-обработчики.

Как узнать, что именно пятое окно должно обновить свои данные? Можно по-разному сделать.

Например, схема N1, асинхронная: окна запрашивают данные у какого-либо объекта, назовем его "источник данных", кто бы он не был. Этот объект обладает следующим свойством: при изменении части данных он инкрементирует свой внутренний флаг timestamp.Окно, которое должно выводить данные этого источника, тоже имеет свой timestamp. Idle-обработчик спрашивает источник данных - какой нынче timestamp. Если у меня такой же, спим спокойно дальше, если больше, чем у меня, обновляем данные, обновляем timestamp и снова спим дальше.
А далее - можно по источнику данных на каждое окно, можно один для всех - как удобно...

Схема N 2, синхронная: реализуем шаблон Подписчик-Издатель. Ну, то есть, источник данных, сразу после обновления, рассылает уведомления всем заинтересованным объектам (тем, что подписались).

Мне лично для синхронизации с UI больше нравится схема N1: обновлять timestamp можно после изменения любого поля, не беспокоясь о том, единичное это изменение или пакетное - обновление данных будет происходить на Idle, без лишних морганий.


--------------------
...
PM   Вверх
Coocky
Дата 30.1.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 30.1.2006, 19:21 Найти цитируемый пост)

Во первых, молодец, что справился с прозрачностью! Я же тебе говорила, что справишься

благодаря тебе smile
Цитата(Earnest @ 30.1.2006, 19:21 Найти цитируемый пост)

2) Где ресайзить? Что за вопрос! Это же его child'ы - значит, в OnSize основного диалога

Т.е и диалоги и диалоговы элементы? Все в обработчике основного окна?
Ну я понимаю кнопки БОЛЬШОГО диалога, ну понимаю , что окно контейнер надо, но разве белый диалог и его дочернии элементы тоже там?
Я чего спросил.. Попробывал я ресайэить кнопки белого диалога(так называю что б понятней из рисунка было.. smile ) в обработчике OnSize() этого диалога... smile Дуля с маком(как в детстве говорили)
Вот примерно что получается
Код

БелыйДиалог::OnSize(cx, cy)

{

if ( IsWindow (кнопка_диалога))

{
CRect rect;
кнопка_диалога.GetWindowRect(&rect);
ScrenToClient(&rect);
// дальше писать нет смысла, ибо даже через отладчик с точками останова видно, что функция НЕ РАБОТАЕТ!! Почему?
...
...
..

}




}




Дя меня вообще остались важными 3 момента.
1.Скролирование окна контейнера. Никогда руками не делал, но правда еще и не брался smile Но на всякий случай уже боюсь.
2.Где обрабатывать(в каком классе) сообщения. Дело в том, что программа "слушает" программы шпионы. И как только (я не знаю как это происходит-это драйверный отдел делает smile ) обнаруживает его-создается белый диалог с заполнеными данными про обнаруженого шпиона. Таких диалогов может создаться бесконечно.
Т.е стоит вопрос-либо класс окна контейнера либо БОЛЬШОГО окна (слушать в классе белого диалога я не вижу смысла smile )
3.КАК же правильно всех ресайзить!! smile Где,т.е. smile

Это сообщение отредактировал(а) Coocky - 30.1.2006, 21:42


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 30.1.2006, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Вставлю пару слов по поводу ресайзинга.
Я с этим уже прилично намучался, и вспомнил свой небольшой опыт программирования на JAVA. Так вот, в GUI-прибамбасе этого языка ("java awt", если не изменяет память, называется), по умолчанию на всех окнах установлны так называемые менеджеры компоновки. То есть заранее все окна разбиты на какую-то логическую структуру (например, табличный менеджер компоновки), и при добавлении элементов в окно элементы сазу заполняют такую структуру. (То есть например, ячейки некой абстрактной таблицы). И дальше при любых махинациях с позицией/размером окон менеджеры компоновки сами перерисовывают контролы в соответствии с этой "Картой". Размеры ячеек создаются как фиксированными, в пикселах, так и в процентном соотношении от размера окна. (Если когда-нибудь работал с HTML, то наверняка знако с таким подходом. )

Я подумал, почему бы данной идее не прижиться и в родимом MFC, и реализовал у себя класс, подобный явовскому табличному менеджеру компоновки. Экземпляр этого класса я создаю в каждом нужном мне окне, связываю с окном-хозяином, и в его ячейки помещаю *CWnd всех контролов, находящихся в окне-хозяине. Единственное, что после этого остается сделать - в окне-хозяине в обработчике WM_SIZE вызвать одну из функций этого класса. И все. О ресайзинге после этого можно забыть. Главное, в каждом окне правильно расчертить карту, то есть правильно заполнить параметры менеджера компоновки. Ну и естественно, делается все по принципу "матрешек" - то есть в каждом масштабируемым подобным образом окошке создается свой табличный менежер, в его ячейках - свой, и так, пока каждый контрол не окажется на своем законном месте.

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

Это сообщение отредактировал(а) Dreamer_0x01 - 30.1.2006, 23:11


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 30.1.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Кстати,о скроллинге. Одной из моих первых программ на MFC была фишка, где одно окно скроллировалось внутри другого. Ничего сложного и глючащего, все прекрасно работало.
А делал так -
1. в главном окне создавал окошко "окно 1" от CWnd и полосы прокрутки.
2. Внутри "окна 1" создавал "диалог 2" от CDialog со стилем CHILD, в отором создавал столько контроло и окон, сколько душе угодно.
3. Делал SetWindowPos "диалога 2" внутрь "окна 1" c флагом "SWP_NOZORDER" и "SWP_NOSIZE". И вот координаты, передаваемые в этот SetWindowPos величины, высчитанные из отношения разности в размерах окон "диалог 2" и "окно 1", к позиции скроллбара. А параметры скроллбара, соответственно, высчитывал также сходя из отношения размеров этих двух окон. Могу в принципе нарисовать рисуночек, если не понятно. Либо сотворить небольшой проектик, где это реализуется.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Dreamer_0x01 @ 30.1.2006, 23:25 Найти цитируемый пост)

1. в главном окне создавал окошко "окно 1" от CWnd и полосы прокрутки.
2. Внутри "окна 1" создавал "диалог 2" от CDialog со стилем CHILD, в отором создавал столько контроло и окон, сколько душе угодно.

Почти моя ситуация, только этих диалогов может быть сколь угодно и создаются они динамически smile
Но это еще впереди..Главная проблема сейчас №1-немогу отпозиционировать элементы самого вложеного диалога по отношению к этому диалогу. Читай выше smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Так как предлагает Earnest-надо тогда перебирать все диалоги в окне контейнере(кстати, а как правильно перебрать все диалоги и получить на них указатели-для окна контейнера)?-не сложно ли это будет?
Добавлено @ 10:55
Хаха!
Вообще бред!
Код

void MyDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

             CRect rect;
             GetWindowRect(&rect);
// Не работает! Отладчик просто пролетает мимо нее Кто обьяснит-что происходит!
        
    



}



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



smile smile smile smile
Обьект умирает до отладки smile
Простите инвалида smile
Код

БелыйДиалог::OnSize(cx, cy)

{
CRect rect;

if ( IsWindow (кнопка_диалога))

{

кнопка_диалога.GetWindowRect(&rect);
ScrenToClient(&rect);
РАБОТАЕТ!! 
...
...
..

}



}


Добавлено @ 11:24
Итак ресайзинг побежден..Осталась прокрутка smile
Ждите новых сообщений


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Ах да,забыл спросить smile Как перебрать все диалоги(получить на них указатели) в окне контейнере?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Ну что ж,я начинаю востанавливать свою былую форму smile
Итак перебор все окон smile
Код

void MyWnd::OnSize(UINT nType, int cx, int cy)
{
    CWnd::OnSize(nType, cx, cy);



CWnd *pChild = this->GetWindow(GW_CHILD);
while (pChild) 
{
  
  pChild->//позиционируем
  
  pChild = pChild->GetWindow(GW_HWNDNEXT);
}
    

}

smile
Осталась прокрутка, пока smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 31.1.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Coocky @ 31.1.2006, 10:30 Найти цитируемый пост)

Почти моя ситуация, только этих диалогов может быть сколь угодно и создаются они динамически

Ну и что это меняет?

Цитата(Coocky @ 31.1.2006, 11:43 Найти цитируемый пост)

Осталась прокрутка

и как поживает?





--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Dreamer_0x01 @ 31.1.2006, 12:31 Найти цитируемый пост)

Ну и что это меняет?

Еще не знаю smile Всегда пользовался только халявным CSrollView smile
Цитата(Dreamer_0x01 @ 31.1.2006, 12:31 Найти цитируемый пост)

и как поживает?

Я даже не знаю как запускать, не говоря о расчетах.. smile
Я не пойму -окно само прокрутит или нужно сдвигать все диалоги при прокрутке?



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Coocky "Само" ничего не делается smile.

Не совсем поняла из твоих постов: эти самые диалоги, которых сколько угодно и которые динамически создаются - они что, в контейнере располагаются друг под другом, как бы на длинной ленте, которая проматывается через окно контейнера? Или я что-то путаю?

Почему бы тебе тогда не использовать ScrollView в качестве контейнера?
Можно также посмотреть код FormView.

Насчет ресайза я, конечно, имела в виду, что каждый, кто получает WM_SIZE, вызывает SizeWindow или MoveWindow (или лучше SetWindowPos) только для своих непосредственных детей, они, соответственно - своих и т.д.





--------------------
...
PM   Вверх
Coocky
Дата 31.1.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 31.1.2006, 15:11 Найти цитируемый пост)

Не совсем поняла из твоих постов: эти самые диалоги, которых сколько угодно и которые динамически создаются - они что, в контейнере располагаются друг под другом, как бы на длинной ленте, которая проматывается через окно контейнера? Или я что-то путаю?

Точно. Только еще эти диалоги могут сворачиваться и разворачиваться пользователем smile
Цитата(Earnest @ 31.1.2006, 15:11 Найти цитируемый пост)

Почему бы тебе тогда не использовать ScrollView в качестве контейнера?


А разве нет проблем присоздании на диалоге ScrollView? Просто добавил класс и все? smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Вообще-то есть, но вполне обходимые.
Точно уже не помню, но смысл в том, что все view хочут иметь папой frame-window. Но хочут они этого только в паре мест, которые можно переопределить. Пару месяцев назад я в какой-то теме подробно описывала, что именно и где нужно для этого прикрутить. Тема была про использование CListView вместо CListCtrl. Я подробностей уже не помню, можешь поищешь на форуме? Если не найдешь, попробую восстановить. Помню, я это из своего старого кода выдирала...
Добавлено @ 15:24
Нашла, вот
Добавлено @ 15:28
Конечно, нужно определить свой производный класс, а в качестве документа - использовать объект, который выполняет роль источника данных. Если его еще нет - создай, интерфейс с управлением данными лучше поделить.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 31.1.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Coocky @ 31.1.2006, 12:56 Найти цитируемый пост)

Всегда пользовался только халявным CSrollView


Нихрена себе халявный. Я даже не смог разобраться, для чего он предназначен, а не только как с ним пользоваться.
Поэтому и делал скроллинг вручную =)

Цитата(Coocky @ 31.1.2006, 12:56 Найти цитируемый пост)

Я даже не знаю как запускать, не говоря о расчетах.. 
Я не пойму -окно само прокрутит или нужно сдвигать все диалоги при прокрутке?

Слушай, я щас в запаре, но вот вечером могу наваять тебе простенький диалог, где все будет прокручиваться так,как я говорил.



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Вот только что сделал. Нехочу документ..Все нормально работает, пока не уничтожаю окно smile
Вылетаю в дебаг. Причем проблема не одна , а куча... А можно без документа? smile
Добавлено @ 15:59
Цитата(Dreamer_0x01 @ 31.1.2006, 15:35 Найти цитируемый пост)

Нихрена себе халявный. Я даже не смог разобраться, для чего он предназначен, а не только как с ним пользоваться.

smile
Это потому, что вы не умеете их готовить smile
Цитата(Dreamer_0x01 @ 31.1.2006, 15:35 Найти цитируемый пост)

Слушай, я щас в запаре, но вот вечером могу наваять тебе простенький диалог, где все будет прокручиваться так,как я говорил.

Окей! Только ,если не трудно-сделай диалог, а в нем окно с прокруткой. Ну и пусть в том окне созаться 100 кнопок.
Если я с Earnest не добью SrollView, тогда возьму твой вариант smile Да и полезно будет посмотреть и научится скролить smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Coocky @ 31.1.2006, 15:53 Найти цитируемый пост)

Вот только что сделал. Нехочу документ..Все нормально работает, пока не уничтожаю окно 
Вылетаю в дебаг. Причем проблема не одна , а куча... А можно без документа?

Не хочешь, не надо, можно и без документа. View всегда проверяет, есть ли у него документ...
Показывай, куда вылетает... ASSERT небось какой-нибудь?


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


Терминатор
**


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

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



Цитата(Coocky @ 31.1.2006, 15:53 Найти цитируемый пост)

А можно без документа?

В смысле?



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Код

 /* forced failure */
        if (!(*_pfnAllocHook)(_HOOK_FREE, pUserData, 0, nBlockUse, 0L, NULL, 0))
        {
            _RPT0(_CRT_WARN, "Client hook free failure.\n");

            return;
        }

        /*
         * If this ASSERT fails, a bad pointer has been passed in. It may be
         * totally bogus, or it may have been allocated from another heap.
         * The pointer MUST come from the 'local' heap.
         */
        _ASSERTE(_CrtIsValidHeapPointer(pUserData));

        /* get a pointer to memory block header */
        pHead = pHdr(pUserData);

Добавлено @ 16:11
Цитата(Dreamer_0x01 @ 31.1.2006, 16:04 Найти цитируемый пост)

В смысле?

ну почитай статью Earnest она предлагает документ прикреплять. А мне он не нужен. Только прокрутка smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Короче не нравится ему, что указатель не из той кучи smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Coocky
Проверь, что у тебя в PostNcDestroy.
Может, ты решил вообще ее не определять, раз флаг bDynamic тебе не нужен?
Так вот, по умолчанию, PostNcDestroy всегда удаляет this. Тебе же нужно переопределить этот метод и сделать его пустым...

Если я не угадала, посмотри выше по стеку, какой именно указатель удаляется.


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 31.1.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Coocky
Через минут 10 я тебе пример со сколлинго залью. Жди, я сюда ссылку кину.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 31.1.2006, 16:27 Найти цитируемый пост)

Проверь, что у тебя в PostNcDestroy.
Может, ты решил вообще ее не определять, раз флаг bDynamic тебе не нужен?
Так вот, по умолчанию, PostNcDestroy всегда удаляет this. Тебе же нужно переопределить этот метод и сделать его пустым...

smile
Держи плюс smile
Слушай, но откуда такая инфа?
Цитата(Dreamer_0x01 @ 31.1.2006, 16:35 Найти цитируемый пост)

Через минут 10 я тебе пример со сколлинго залью. Жди, я сюда ссылку кину.

Жду с нетерпением smile
Добавлено @ 16:44
Цитата(Coocky @ 31.1.2006, 16:40 Найти цитируемый пост)

Держи плюс 

Сегодня не дают.Завтра smile
Блин, я всем хочу сказать. За все время существования форума, Earnest у нас третий человек из "высших".
На сколько я помню до нее из гениев были
1. mr.DUDA
2.Андрей Ямов
Теперь Earnest smile
Жаль что такие люди не всегда на форуме. Обычно они его покидают через время. Но пока они есть-черпайте знания smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Значит, угадала...

Ну, Coocky, ты сказал... слезы душат... пойду искать носовой платок... smile


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 31.1.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Итак, вот тебе примерчик, правда, я очень торопился - увидишь по коду =)
И скроллинг только вертикальный сделал. Если понравится идея - горизонтальны сам сообразишь, он попроще в плане нормального пересчета координат будет ;)

На народ.ру конечно отстойно заливать, но больше некуда, так что уж не обессудь ;)
http://megadreamer.narod.ru/Test2.rar



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 31.1.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Э.....Проблема.
Окно скролируется вместе с бекграундом smile
Добавлено @ 17:02
Dreamer_0x01
Не у тебя smile
Сейчас твое гляну smile
Круто! Молодец и быстро -то как! smile
Интересно, а проблемы с бекраундом будут?
Ща проверим
З.Ы.
Спасибо всем, не ожидал от вас такой инициативной помощи smile
Добавлено @ 17:05
Код

void NewView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default
Invalidate();
    CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

Пардон. Я сильно паникую smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Coocky @ 31.1.2006, 16:55 Найти цитируемый пост)

Окно скролируется вместе с бекграундом

Хм, возможно, как-то забыла про твои хитрые фоны.
Подозреваю, что тоже самое будет в варианте Dreamer_0x01, если он использует функцию ScrollDC.
Но прикрутить можно все... пойду посмотрю в ScrollView.


--------------------
...
PM   Вверх
Coocky
Дата 31.1.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 31.1.2006, 17:12 Найти цитируемый пост)

пойду посмотрю в ScrollView.

Все. На сегодня всем отбой! smile
Да думаю уже и все проблемы smile
Все скролируется и перерисовывается БЕЗ МЕРЦАНИЙ smile Всем спасибо еще раз.
С меня форуму-прозрачные окна smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 31.1.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Так чье решение все-таки взял за основу? ;)
Добавлено @ 19:08
Цитата(Earnest @ 31.1.2006, 17:12 Найти цитируемый пост)

Подозреваю, что тоже самое будет в варианте Dreamer_0x01, если он использует функцию ScrollDC.

Не-а smile Я вообще контекст не трогаю, просто тупое "таскание" одного окна по другому smile



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Тогда, может, ScrollWindow (как в ScrollView) ?
Та же фигня... Короче, в данном случае (чтобы фон был прибит) придется перерисовывать все окно, потому что функции ScrollЧегоНибудь очень экономно перемещают биты контекста и плевать им, что там - фон, текст. А в данном случае нужно именно тупо перерисовывать окно в другой позиции...


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 31.1.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Earnest @ 31.1.2006, 19:21 Найти цитируемый пост)

Тогда, может, ScrollWindow (как в ScrollView) ?

Нет. Там роме SetWindowPos() ни одной функции, что-либо скролирующей =)

Цитата(Earnest @ 31.1.2006, 19:21 Найти цитируемый пост)

А в данном случае нужно именно тупо перерисовывать окно в другой позиции...

Так посмотри в моем коде - так и делается! Окно таскается именно целиком =)
Я вот только не очень понял изначально - хорошо это или плохо? Нужно, чтобы фон гулял вместе с окном, или наоборот, стоял на месте?



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Coocky, по-моему, нужно, чтобы фон не двигался.
Значит, твой код ему подойдет.
А вообще, если таких изысков с фоном нет (т.е. окно прокручивается как единое целое), обычно используют ScrollWindow или ScrollDC (это просто копирование той части окна, которая уже есть, но в новую позицию). Плюс, ScrollWindow еще дополнительно делает инвалидными те части окна, которые до перемещения были скрыты. И для них тебе приходит WM_PAINT.
Если делаешь ScrollDC, то это нужно делать руками, но больше управляемость...

Конечно, код получается посложнее, чем просто SetWindowPos. Но если для, скажем, списка какого-нибудь перисовка (а SetWindowPos - это полная перерисовка, как ты понимаешь)... - максимум моргание вызовет (с которым можно побороться), то для окна набитого более-менее сложной графикой (или картинкой смасштабированной), такая реализация скроллинга будет сильно тормозить... А закат солнца вручную (ScrollDC + Invalidate недостающих кусочков) - летает...




--------------------
...
PM   Вверх
Dreamer_0x01
Дата 31.1.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Earnest @ 31.1.2006, 20:17 Найти цитируемый пост)

то для окна набитого более-менее сложной графикой (или картинкой смасштабированной), такая реализация скроллинга будет сильно тормозить...

Я согласен, но во-первых, можно сделать "умную" перерисовку в OnPaint,отрисовав предварительно все содержимое окна в некий виртуальный битмеп размера, равного таскаемому окну, а во-вторых, от прокрутки обычно диких скоростей перерисовки не требуется, главное, как ты уж упомянула, чтобы не было противного глазу моргания. А подтормаживания скроллбаров работе не вредят (например, вспомним чтение документа в MS Word). Мы один раз тыркаемся в скролл, выставляем область прокрутки на нужную позицию, не сильно обращая внимания на небольшие задержки в скроллировании (а их можно сделать действительно совсем небольшими),и потом долго и упорно читаем текст с данного места.
Добавлено @ 20:48
Вообще, в программировании внешнего интерфейса есть две крайности:
1. Красиво, запутано,но глючно.
2. Строго, быстро, но скучно

smile


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 31.1.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Dreamer_0x01 @ 31.1.2006, 20:43 Найти цитируемый пост)

А подтормаживания скроллбаров работе не вредят (например, вспомним чтение документа в MS Word).

Я про графику говорила - рабочий экран программ типа Photoshop, Corel, AutoCAD в конце концов. Кроме того, прокрутка - это не только с помощью скролл-баров, но еще и с помощью мышиного косеса, а также панорамирование (это когда экран как бы таскают за любое место - черт его знает, почему это панорамированием называется). Короче говоря, если в таких программах прокрутка будет тормозить, пользователи повесятся... или закидают тухлыми яйцами аффтара smile


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 31.1.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Ладно, подождем Coocky, послушаем, чем же все-таки закончились его страдания.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 1.2.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Dreamer_0x01 @ 31.1.2006, 21:17 Найти цитируемый пост)

Ладно, подождем Coocky, послушаем, чем же все-таки закончились его страдания.

smile


Они еще вчера закончились smile
Цитата



Код



 void NewView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default

Invalidate();

    CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

 





Пардон. Я сильно паникую 


Че у вас с трафиком? smile Или я так быстро пишу. что вы не успеваете читать smile
Вот еще , что хотел спросить.. Про OnIdle.
Она только ж в App перегружается?
Дело в том, при каждом ресайзинге большого окна я перерисовываю две кнопки в правом верхнем углу. Если этого не сделать, то если резко и быстро таскать приложение(растягивать) влево-вправо, то рано или поздго-одна кнопка захватит часть изображения второй. Однако если перерисовывать -все нормально-но Ма-а-аленькое мерцание при растягивании. Я вот подумал, а что если перерисовать после растяжки, т.е. словить отсутсвие сообщения. Но только один раз, вернее когда значение счетчика остусвия сообщений =1 smile
Только вот плохо то, ЧТО б достучаться до кнопки, нужно лезть к ним через указатели.
Как можно решить эту проблему? И вообщем сам способ-хорош?



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 1.2.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Dreamer_0x01 @ 31.1.2006, 19:02 Найти цитируемый пост)

Так чье решение все-таки взял за основу? ;)

Ну CScrollView Просто прокрутка там делается ОДНОЙ функцией smile Ну и твой пример посмотрел и сохранил.
Надо ж знать, как самому крутить. Кстати-ничего сложного, чистая математика. Я просто думал, что окна нужно еще и самому отрисовывать, когда они выходят за рамки окна smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 1.2.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Coocky @ 1.2.2006, 10:51 Найти цитируемый пост)

Вот еще , что хотел спросить.. Про OnIdle.
Она только ж в App перегружается?

Еще в документе.

Но в окнах тоже можно ловить Idle.
В модальном диалоге, в карту сообщений нужно добавить обработчик сообщения WM_KICKIDLE. Это сообщение определено в MFC, нужно подключить afxpriv.h
Кажется, сообщение посылается без параметров, во всяком случае, я никогда их не использовала, и не знаю, что в них. Поэтому получить счетчик отсутствия сообщений не получится. Но можно (и даже лучше) сделать так: завести переменную в классе, скажем, bNeedRedraw, OnSize - ставим ее в 1, OnIdle - проверяем, и если она 1, делаем кнопкам Invalidate и сбрасываем.



--------------------
...
PM   Вверх
Coocky
Дата 1.2.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 1.2.2006, 12:17 Найти цитируемый пост)

В модальном диалоге,

Дык откелева у меня модальный диалог? smile Для моего диалога есть что нибудь похожее? А для беленьких? smile
Пойми, я хочу в OnIdle сделать переисовку, но как мне достучаться до окон из CWinApp?
А если оттуда нельзя, как же получить похожее на OnIdle в моих классах?



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 1.2.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



А какой же у тебя диалог? В твоем коде, что я видела - главный диалог модальный и есть. У тебя ведь вообще диалоговое приложение. Остальные диалоги - вложенные child'ы. Им ничего такого не приходит - значит, нарисуй соответствующую функцию у контейнера и вызывай из главного диалога. А главному - должен приходить WM_KICKIDLE, как я и говорила.

Для справки: для немодальных окон тоже есть свое сообщение:
WM_IDLEUPDATECMDUI, расылается из App как раз на Idle. Но это только для SDI или MDI приложения.


--------------------
...
PM   Вверх
Coocky
Дата 1.2.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 1.2.2006, 12:59 Найти цитируемый пост)

А какой же у тебя диалог? В твоем коде, что я видела - главный диалог модальный и есть.

А ну да smile
Цитата(Earnest @ 1.2.2006, 12:59 Найти цитируемый пост)

А главному - должен приходить WM_KICKIDLE

Че-то я и в МСДН толком ничего не найду по этому сообщению.
Как его определить?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 1.2.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Coocky

Цитата

как мне достучаться до окон из CWinApp?

Код

                CJPApp* ap;
    ap = (CJPApp*)AfxGetApp();
    CFrameWnd* pFrame = (CFrameWnd*) AfxGetMainWnd();
    CJPDoc* pDoc = (CJPDoc*)pFrame->GetActiveDocument();

и т.д.
А послать сообщение можешь вообще накрайняк всем, зарегистрировав его... Или Взведи евент, а по нему отрисовывай отдельно каждое окно. А лучше просто (диалоги то надеюсь объявляешь во фрейме документа?) взять да послать WM_PAINT каждому аля ::PostMessage(pFrame->mydlg[7]->GetSafeHwnf(),WM_PAINT,0,0) или напрямки pFrame->mydlg[7]->Invalidate(). А если я не в тему, то уж не обессуть


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Coocky
Дата 1.2.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Да у меня окно диалоговое smile Какие фреймы smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 1.2.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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




A!
Забросил я это дело... smile
Не призодит сообщения smile Молчит моя OnIdle smile

Это сообщение отредактировал(а) Coocky - 1.2.2006, 13:57


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 1.2.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Cтвойдиалог* pDlg = (Cтвойдиалог*)AfxGetMainWnd();
он же Cтвояаппликация* papp = (Cтвояаппликация*)AfxGetApp()->m_pMainWnd;

Думаю, что диалоги ты объявляешь либо в "Cтвояаппликация" либо в "Cтвойдиалог" - вот тебе и доступ до всего smile
Добавлено @ 14:11
а я все таки думаю, что не стоит так широко использовать OnIddle, в крайнем случае в ней какой-нибудь евент взвести... так как пока мы находимся в OnIddle, то ничего другого не сможем наверное сделать (я опять про ядреную войну с отображением кнопки smile smile ) - война вот уже как полчаса, а оператор - кнопкодав не видит ничего, сидит кино зырит, а в OnIddle вообще пошла выполняться дефрагментация дисков на соседнем компе smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Coocky
Дата 1.2.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



а не вызывается она у меня smile ,OnIdle smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 1.2.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



значит грузишь прогу... А может и не вызывается, вот как проверить? smile - так возьми супер комп smile и ежели не вызовется, тогда просто не заходит туды. Хороший способ, правда? smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 1.2.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Coocky
Про WM_KICKIDLE в MSDN действитеьльно мало (где-то в technical notes).
Ничего сложного.
1) Подключи файл <afxpriv.h>
2) В главном диалоге создай обработчик afx_msg LRESULT OnKickIdle(WPARAM,LPARAM);
(имя произвольное)
3) В карту сообщений добавь ON_MESSAGE(WM_KICKIDLE,OnKickIdle)
4) В самом обработчике делай, что хотел на Idle, возвращай 0.
Добавлено @ 14:33
OnIdle приложению не приходит потому, что это диалоговое приложение - там не вызывается CWinApp::Run, а работает просто CDialog::RunModalLoop. Там все чуть-чуть по другому. А WM_KICKIDLE должен приходить.
Добавлено @ 14:35
Цитата(takedo @ 1.2.2006, 14:07 Найти цитируемый пост)

не стоит так широко использовать OnIddle

Как раз очень удобно использовать Idle-обработку. Но конечно, с умом - ничего тяжелого там делать не следует. На случай ядерной войны. smile
Но прорисовка к тяжелым функциям не относится.



--------------------
...
PM   Вверх
takedo
Дата 1.2.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest smile
Добавлено @ 14:43
Цитата

Но прорисовка к тяжелым функциям не относится.

Кстати, писал я в молодости визуализацию результатов газодинамических расчетов(заливка разными цветами каждой точки- расчетной ячейки) - очень надо сказать тяжеленькая операция, если ещё и вектора - никогда момент начала войны не словить... smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 1.2.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Кто же спорит, все что угодно можно тяжелым сделать... умеючи-то smile
Я про приложение Cooky говорила.


--------------------
...
PM   Вверх
Coocky
Дата 1.2.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Earnest
Ну что... Еще раз доказала-что лучшая smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 1.2.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Я вот осмелюсь вместо OnIdle воспользоваться...только не кидайтесь тухлыми помидорами преждевременно...WM_TIMER в самом окне, чтоб не надо было до него достукиваться!
Ведь это сообщение не синхронное, и если таймер его посылать чаще, чем допускает система, оно просто будет выкидываться из очереди. То есть в те моменты, когда окно ничем не занято, мы это сообщение будем ловить нормально. Как только приложение "дало газу ;)", оконная очередь сообщений нагружается и сообщения WM_TIMER не игнорируются. Думаю, стоит попробовать, во всяком случае, это точно способ хорошо самоизвратиться ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 1.2.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Dreamer_0x01 @ 1.2.2006, 18:14 Найти цитируемый пост)

Как только приложение "дало газу ;)", оконная очередь сообщений нагружается и сообщения WM_TIMER не

Интересен еще интервал, что б выкидывалось. Что б даже на движение мыши реагировало, т.е. уже выкидывалось. Такое возможно? С каким интервалом?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 1.2.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



WM_TIMER можно, но действительно не очень понятно какой интервал установить. Кстати он не может быть меньше 10 mc.
Однако в данном случае OnIdle лучше, т.к. это сообщение гарантированно приходит каждый раз как очередь сообщений опустошается - т.е. как раз тогда, когда приложение освободилось.


--------------------
...
PM   Вверх
Coocky
Дата 1.2.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Попробывал. Кнопки как в фантастике-плавно асинхроно перерисовываются в виде пробегающей строчки. Прикольный эффект, но для другого раза smile
А толком не спасает. все равно заметно, если резко дергать smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 1.2.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Earnest @ 1.2.2006, 18:47 Найти цитируемый пост)

Кстати он не может быть меньше 10 mc.


Вот такой интервал как раз и установить. Чтоб сообщения проходили только когда система подразгрузилась. Но! Можно ведь еще добавить в класс переменную. И с помощью нее отслеживать каждые сто таких сообщений. По переполнению этого значения ее обнулять, и вызывать прорисовку. Тогда мы как раз и получим при сильной загруженности нечастые перерисовки (сотня событий через занятую очередь будет "пропихиваться" достаточно долго.) А при слабой загруженности будем переполнять эту переменную гораздо чаще.
Добавлено @ 19:47
Цитата(Coocky @ 1.2.2006, 18:51 Найти цитируемый пост)

Попробывал. Кнопки как в фантастике-плавно асинхроно перерисовываются в виде пробегающей строчки. Прикольный эффект, но для другого раза

Покажи начальству, может, оценит и попросит оставить smile



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


 




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


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

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