Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление окна, --- 
:(
    Опции темы
13dreams
Дата 27.7.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Отрисовываю текст и линии (в OnMouseMove) с помощью CDC и когда окно сворачиваю и потом разворачиваю - всё исчезает

подскажите в чём тут проблема? Я так понимаю нужно где-то запретить обновление экрана?
PM MAIL   Вверх
Earnest
Дата 27.7.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Проблема в том, что твой рисунок - это только пикселы на экране, которые само окно не помнит. Это твоя проблема. Рисовать нужно в OnPaint, а в MouseMove только запоминать нарисованные линии (куда-то складывать в векторном виде).


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


Новичок



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

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



Как сохранять\воспроизводить линии? Есть какие-то готовые решения или нужно что-то типа двухмерного массива (координаты х\у)?

и как тогда быть с отрисованным текстом?

или можно как-то в тот же двухмерный(х\у) массив сохранить весь экран по точкам?
................................................................................................................................................
нашёл две функции SaveDC()   RestoreDC()

перенёс свой код отрисовки текста в OnPaint

Код

void CTextTestDlg::OnPaint()
{    
    //...
    CClientDC dc(this);
    if (DrTxt)                          // ЭТО ФЛАГ ТОГО ЧТО НЕОБХОДИМО ОТРИСОВАТЬ ТЕКСТ
{        
    CFont font;
    LOGFONT lf =  { 20, 0, 0, 0, FW_BOLD, 0, 0, 0, 
        RUSSIAN_CHARSET, OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS,
        PROOF_QUALITY, VARIABLE_PITCH | FF_ROMAN, NULL } ;
    font.CreateFontIndirect( &lf ) ;
        dc.SelectObject( &font);
    
    dc.SetBkMode( TRANSPARENT );
    dc.DrawText( text, rect, DT_NOCLIP ) ;
    DrTxt=false;
    k=dc.SaveDC();            //СОХРАНЕНИЕ КОНТЕКТСА
    }
dc.RestoreDC(k);                 //ВОССТАНОВЛЕНИЕ ПРИ КАЖДОМ ВЫЗОВЕ OnPaint    
}


но почему-то не работает так как надо. Текст появляется только после процедуры свёртывания\развёртывания и только на один раз. После следующего такого действия исчезает. 


Это сообщение отредактировал(а) 13dreams - 27.7.2010, 12:20
PM MAIL   Вверх
Earnest
Дата 27.7.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(13dreams @  27.7.2010,  12:44 Найти цитируемый пост)
Как сохранять\воспроизводить линии? Есть какие-то готовые решения или нужно что-то типа двухмерного массива (координаты х\у)?
и как тогда быть с отрисованным текстом?

Да, линии хранить как массивы координат, текст - отдельно.
Цитата(13dreams @  27.7.2010,  12:44 Найти цитируемый пост)
или можно как-то в тот же двухмерный(х\у) массив сохранить весь экран по точкам?

Можно, но не нужно. Конечно, не в тот же двумерный массив, а просто как растр. Но, повторю, не нужно. 

Цитата(13dreams @  27.7.2010,  12:44 Найти цитируемый пост)
нашёл две функции SaveDC()   RestoreDC()

Это совсем из другой оперы, читай MSDN.
Что касается текста, то из твоего кода не видно, откуда он берется. Возможно, не сохраняется (сама строка). А возможно, дело просто в том, что ты не устанавливаешь цвет отрисовки текста (SetTextColor).




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


Новичок



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

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



1. По поводу линий : как только нарисовал линию - сразу её сохраняю и восстанавливать весь массив в котором хранятся линии нужно в OnPaint, как я понимаю? т.е. всё время когда будет генерироваться сообщение WM_PAINT - нужно будет нарисовать массив линий?

2. а как быть с текстом? И почему "не нужно" ,как вы выше написали, сохранять весь экран как растр?  "не нужно" в смысле "нельзя" или "нет необходимости"?


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


Эксперт
****


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

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



1. Не "восстанавливать", а просто рисовать. Да, по получении OnPaint, нужно рисовать все сохраненные объекты.

2. Запрограммировать можно все, или почти все. Так что "нет необходимости". 
Растр хранить накладно, получать по пикселу тоже. Можно, конечно, и не по пикселу, но все равно, вопрос хранения остается. 
Векторная информация гораздо компактнее.
А еще есть вопрос масштабирования - захочется тебе картинку увеличить\уменьшить в несколько раз, и что ты будешь делать с растром? Есть еще и вопрос идентификации нарисованных объектов. С векторными данными это элементарно, а с растром - совсем нетривиально. Ты, конечно, не писал, что тебе надо масштабировать картинку или выбирать объекты. Но это практически всегда требуется в графических приложениях - не сейчас, так позже.
И в чем проблемы с текстом-то? Ясно, что его нужно тоже хранить, только тут недостаточно x\y. Посмотри, какие параметры нужны при рисовании текста, реши, какие из них будут постоянными, а какие - переменными, и создай соответствующую структуру данных. Их и храни.


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


Новичок



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

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



Спасибо! С текстом технология ясна

с линиями вроде бы тоже получается. Единственное - наблюдаю странный результат. Все линии в моём приложении должны быть или горизонтальными или вертикальными. А при перерисовке у них появляется наклон

нужно что-то к чему-то привести?




Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  11.JPG 25,63 Kb
PM MAIL   Вверх
Earnest
Дата 29.7.2010, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что значит "должны"? Посмотри, какие координаты собираешь. У горизонтальной линии должна быть постоянной координата y, у вертикальной - x.


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


Новичок



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

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



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


 




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


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

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