Поиск:

Ответ в темуСоздание новой темы Создание опроса
> с помощью CProgressCtrl изменять цвет диалог.окна, как сделать???? 
:(
    Опции темы
AnnyLondon
Дата 19.12.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



привет всем.ПОМОГИТЕ!!!

все перепробовала.
как изменять цвет диалогового окна с помощью  CProgressCtrl??
как соотнести движение  индикатора прогресса с изменением цвета клиентской области ,к примеру, от светлокрасного до темно-красного?

и еще вопрос, можно ли сделать тоже самое с самим индикатором прогресса?чтобы цвет менялся от светлого к темному?

за ранее спасибо! 
PM MAIL   Вверх
Dreamer_0x01
Дата 19.12.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(AnnyLondon @  19.12.2010,  22:55 Найти цитируемый пост)
все перепробовала.


А что именно пробовали?
Тут способов в общем-то не так уж много - например, ловить WM_CTLCOLOR, либо WM_PAINT, смотря с какой цлью вы это окно создаете.


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


Новичок



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

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



вот пример.
по нажатию "ок" нужно, чтобы цвет клиентской области менялся

void MyDlg::OnBnClickedOk()
{    
  cProgress.SetRange(0,255); // диапазон
 cProgress.SetPos(0);       // позиция    


 for (int x=0;x<=255;x++)   // цикл 
 { 
     cProgress.SetPos(x);   // меняем позицию
     Sleep(200);        // задержка
      my_color.DeleteObject();// удаляем старую кисть
   my_color.CreateSolidBrush(RGB(x, 255, 0)); 
    Invalidate();
 }
    // TODO: добавьте свой код обработчика уведомлений
    
}

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

Добавлено через 42 секунды
так мне не просто цвет нужно поставить...нужно чтобы он менялся
PM MAIL   Вверх
triclosan
Дата 19.12.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



надо добавить обработчик (возбуждается, на событие ОнКлик или ОнЧендж), который читает позицию ползунка и меняет цвет (чего захотите) на какой захотите хотите
PM MAIL   Вверх
AnnyLondon
Дата 19.12.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



triclosan  не поняла вас..
PM MAIL   Вверх
Dreamer_0x01
Дата 20.12.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



AnnyLondon, 
1. как вы используете кисть my_color?
2. что конкретно требуется в задании - зачем в цикле все время менять значения прогресса, это так требуется?
3. Не нужно делать Sleep() в цикле - вы этим "затыкаете" оконный поток примерно на 51 секунду, в течение этого времени ваше приложение не будет реагировать вообще ни на какие действия..

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




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


Эксперт
****


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

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



Кроме прочего, пока работает ваш цикл, все мертво висит... Invalidate всего лишь помечает окно как нуждающееся в перерисовке, но перерисовано оно будет только на OnPaint, который, разумеется, пока работает цикл, не придет. Можно, конечно, вызывать UpdateWindow, но тоже нехорошо - все эти слипы действительно все намертво блокируют. 
Если ты хочешь, чтобы по кнопке OK диалог плавно поменял цвета, сделай следующее.
1. По команде OK ставь таймер.
2. По команде таймера ставь новое положение движка, заказывай перерисовку (Invalidate)
3. В EraseBackgnd меняй кисть фона в соответствии с текущим положением движка... Конечно, раз все происходит в рамках диалога, проще не движок считывать, а завести управляющую переменную, которая будет и движение прогресса означать, и цвет кисти.
Как-то так

А красить прогресс-бар - через OwnerDraw только. Или проверить, поддерживает ли этот контрол CustomDraw 


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


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


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

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



Цитата(Earnest @  20.12.2010,  14:38 Найти цитируемый пост)
А красить прогресс-бар - через OwnerDraw только.

проще свой progress написать, не настолько сложный элемент ;)

Перерисовать можно и в том цикле, который приведен в коде, вставив в него прокачку сообщений с помощью например вот такой функции:
Код

void MSG_Pushing()
{
            MSG msg;
            while(::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)){
                if(msg.message == WM_QUIT) return;
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
}



Но еще раз говорю, скорее всего задание совсем не в этом состояло, но кому придет в голову в цикле гонять прогресс туда-сюда и еще цвет окна при этом менять?


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


Новичок



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

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



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

BOOL MyDlg::OnEraseBkgnd(CDC* pDC)
 {  CDC dc;  // Контекст для рисования
  CRect rect;
  GetClientRect(&rect);//Координаты (хотя можно брать из структуры lpDrawItemStruct)
 my_color.DeleteObject();// удаляем старую кисть
  my_color.CreateSolidBrush(RGB(255,way,way)); 
 return TRUE;
}



user posted image

цвет меняется.то что нужно, только не вся область закрашивается. smile

Добавлено через 14 минут и 32 секунды
сделала так:
Код

BOOL MyDlg::OnEraseBkgnd(CDC* pDC)
 { 
   COLORREF color=RGB(255,way,way);
  CBrush brush(color);
    CRect rect;
    GetClientRect(&rect);
    pDC->FillRect(&rect,&brush);
    return TRUE;
}


мерцает экран.... smile 
PM MAIL   Вверх
AnnyLondon
Дата 20.12.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Dreamer_0x01 @  20.12.2010,  18:36 Найти цитируемый пост)
Но еще раз говорю, скорее всего задание совсем не в этом состояло, но кому придет в голову в цикле гонять прогресс туда-сюда и еще цвет окна при этом менять?



нашему преподу..это курсач!

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


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


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

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



AnnyLondon, 
ClipChildren отключить пробовала?

Если не получится, то тогда делай так.
В OnEraseBkgnd оставь только return FALSE.

А в обработчике OnPaint сделай вот что:
Код

COLORREF color=RGB(255,way,way);
CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(&rect,color);


В этом случае тебе и кисть не нужна.


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


Новичок



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

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



когда прописываю в OnPaint б пишет, что pDC не определен, а сделать его как получаемое значение функцией нельзя....ошибку выдает( smile 
PM MAIL   Вверх
Dreamer_0x01
Дата 21.12.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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





Цитата(AnnyLondon @  20.12.2010,  22:54 Найти цитируемый пост)
когда прописываю в OnPaint б пишет, что pDC не определен, а сделать его как получаемое значение функцией нельзя....ошибку выдает(


Не надо изобретать велосипед - пусть Студия сгенерирует обработчик WM_PAINT за вас.
Контекст в вашем случае в этом обработчике будет получен так:
CPaintDC dc(this);


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


Эксперт
****


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

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



AnnyLondon, это контролы под собой сами рисуют. Можно обрабатывать WM_CTLCOLOR и ставить кисть, соответствующую текущему фону. Или сделать контролы прозрачными, хотя последнее я не пробовала.
Буйная фантазия у вашего препода. Главное, очень жизненная задача. smile 


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


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


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

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



Цитата(Earnest @  21.12.2010,  08:56 Найти цитируемый пост)
Буйная фантазия у вашего препода. Главное, очень жизненная задача.

мне все-таки до последнего кажется. что препод хотел закрашивать цвет не по таймеру и показанию прогресс бара, а по перетаскиванию ползунка или скроллбара, как-то так ;)
Либо второй вариант - преподаватель немножко не того курнул ;)



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


Эксперт
****


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

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



Конечно, оффтопик...
Нынешние преподы сильно от практики оторваны. Книжек начитались, в лучшем случае, а так, чтобы реальное что-то делать, да еще для реального (коммерческого), а не академического  применения... нет таких, наверное.


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


Новичок



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

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



Цитата(Earnest @  21.12.2010,  08:56 Найти цитируемый пост)
Буйная фантазия у вашего препода. Главное, очень жизненная задача.  

да он вообще сумасшедший...он сам не знает, как это делается.



Цитата(Dreamer_0x01 @  21.12.2010,  11:13 Найти цитируемый пост)
мне все-таки до последнего кажется. что препод хотел закрашивать цвет не по таймеру и показанию прогресс бара, а по перетаскиванию ползунка или скроллбара, как-то так ;)Либо второй вариант - преподаватель немножко не того курнул ;)



специально для вас полное задание:
"использовать классы панели инструментов (CToolBar), строки состояния (CStatusBar), всплывающих подсказок (CToolTrip), индикатора прогресса (CProgressCtrl). на основе этого создать диалоговое окно с панелью инструментов, состоящих из четырех кнопок ис подсказками и индикатором прогресса.
user posted image
в строке состояния отображаются координаты левой кнопки мыши. с помощью трех первых кнопок выбирается цвет в макросе rgb;
сделать так, чтобы при нажатии ОК индикатор начал двигаться от 0 до конца. Движение индикатора соотнести с изменением выбранного цвета от светлых до темных тонов. При движении индикатора цвет клиенской области окна окрашивается в соответствующие цвета."


и еще вопрос, как изменить цвет прогресса?я так и не поняла...


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


Новичок



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

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



Цитата(Dreamer_0x01 @  20.12.2010,  21:29 Найти цитируемый пост)
Если не получится, то тогда делай так.В OnEraseBkgnd оставь только return FALSE.А в обработчике OnPaint сделай вот что:код C++1:2:3:4:COLORREF color=RGB(255,way,way);CRect rect;GetClientRect(&rect);pDC->FillSolidRect(&rect,color);highlightSyntax('cpp_TM4OTE','cpp');В этом случае тебе и кисть не нужна.


сделала как сказали
Код

void MyDlg::OnPaint()
{  
CPaintDC dc(this);
COLORREF color=RGB(255,255,255);//белый цвет
     switch (clr)
        { case 1:
   color=RGB(255,way,way);
     break;
        case 2:
             color=RGB(way,255,way);
 break;
case 3:
    color=RGB(way,way,255);
 break;
      default : ;}
  CBrush brush(color);
    CRect rect;
    GetClientRect(&rect);
    dc.FillSolidRect(&rect,color);

      
    }

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


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


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

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



Цитата

всеравно мерцает....


Так, тут подробнее - каким образом мерцает - мерцает все окно, или только его части вокруг контролов, как на вашем рисунке?
Если мерцает все окно, то осталось дело за малым - двойную буферизацию влепить ;)

Про задание ясно, оно нежизненное, но придется выполнить, чтобы вам зачет поставили ;)


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


Новичок



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

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



Dreamer_0x01,  клиентская область мерзает...
PM MAIL   Вверх
AnnyLondon
Дата 24.12.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



только там где расскрашиваю
PM MAIL   Вверх
Dreamer_0x01
Дата 24.12.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



AnnyLondon, 
зажмите проект в архив, положите на файлообменник и ссылку мне в личку киньте. 
Попробую своими глазами посмотреть, что у вас за проблема.



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


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


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

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



Впрочем, ладно, потрачу на вас еще 10 минут.
Итак, создал проект в студии, добавил 10 строчек кода, реализвал тебуемый вам пример с перерисовкой окна,
посмотрите, как сделано и доработайте свой проект в соответствиии с примером.


Прикладываю файл к сообщению.


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ProgColor.rar 129,71 Kb


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


 




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


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

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