Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить цвет диалога, Как? 
:(
    Опции темы
bel_nikita
  Дата 26.9.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Как изменить цвет диалога, например, в синий?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 26.9.2005, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



smile
Стареешь? smile
Для этого используется сообщение Windows WM_CTLCOLOR, которое элементы управления посылают родительскому окну для собственной отрисовки
Код

HBRUSH CTestDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    
    if (CTLCOLOR_DLG  == nCtlColor)
    {
        delete brush;
        // Создание новой кисти
        brush = new CBrush;
        // Создание кисти со штриховкой
        brush->CreateHatchBrush(HS_DIAGCROSS, textColor);
        // Установка цвета фона "под штриховкой"
        pDC->SetBkColor(bkColor);
        // Установка цвета текста
        pDC->SetTextColor(textColor);
        // "Подменяем" кисть (возвращаем свою)
        return *brush;    }

    return hbr;

}


Есть следующие идентификаторы:

CTLCOLOR_BTN - Кнопка
CTLCOLOR_DLG - Диалог
CTLCOLOR_EDIT - Элемент редактирования
CTLCOLOR_LISTBOX - Список
CTLCOLOR_MSGBOX - Окно сообщений
CTLCOLOR_SCROLLBAR - Скролинг
CTLCOLOR_STATIC - Статический текст

Это сообщение отредактировал(а) Coocky - 26.9.2005, 17:04


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


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Это цвет элементов менять. А как мне фон диалога изменить?
У меня есть класс CChildView. Нужно получить его цвет и приминить его к диалогу, который в свою очередь будет отрисоваться на CChildView

Вот, пытаюсь изменить цвет диалога:
Код

HBRUSH CDWaitting::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: Change any attributes of the DC here
  if (pWnd->GetDlgCtrlID() == CTLCOLOR_DLG )
  {
    // Set the text color to red.
    pDC->SetTextColor( RGB(255, 0, 0) );

    // Set the background mode for text to transparent 
    // so background will show thru.
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetBkColor(RGB(255, 0, 0));

    // Return handle to our CBrush object.
    //hbr = m_brush;
  }
    
    // TODO: Return a different brush if the default is not desired
    return hbr;
}




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
kometa_triatlon
Дата 26.9.2005, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Coocky
Кстати, это какой-то дурацкий способ. Он чаще всего не работает smile
Часто работает на половину...


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
bel_nikita
Дата 26.9.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
Кстати, это какой-то дурацкий способ. Он чаще всего не работает

Ну, так приведите хоть какой-нибудь код smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 27.9.2005, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Самое тупое, что сразу приходи в голову - перекрыть OnEraseBkgnd и там своей кистью замазать...
Можно и по другому:
Фон окна определяется кистью, которая записана в классе окна. Имеется в виду Window class, конечно. Подсунуть свой класс вместь стандартного можно в PreCreateWindow: зарегистрировать свой класс и записать его в структуру CREATESTRUCT (параметр PreCreateWindow). А потом вызвать базовый PreCreateWindow. Код регистрации диалога лучше найти в MFC и списать, чтобы не париться потом с разрегистрацией своего класса. Он не сложный, но наизусть не помню.

Добавлено @ 09:39
Цитата(kometa_triatlon @ 26.9.2005, 18:00)
Кстати, это какой-то дурацкий способ. Он чаще всего не работает 
Часто работает на половину...

OnCtlColor нормально работает, но есть ограничения. Скажем, комбобоксу или эдиту неактивному цвет текста фиг поменяешь...


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


Опытный
**


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

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



Для получения цвета можно воспользоваться GetSysColor, GetSysColorBrush. А перерисовать можно и вообще в OnDraw или в OnPaint с нужным цветом. smile


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


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

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



CWinApp::SetDialogBkColor - но меняет цвет всех диалогово smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Coocky
Дата 27.9.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Цитата(bel_nikita @ 26.9.2005, 17:46)
У меня есть класс CChildView. Нужно получить его цвет и приминить его к диалогу, который в свою очередь будет отрисоваться на CChildView

smile
Дык ты не путай грешное с праведным мы, МФС- ники этого не любим smile
У тебя , брат не диалог, а представление, производное от CFormView smile
Код

BOOL BackWardLinks::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default
    BITMAP bitmapinfo;
    bitmap.GetObject(sizeof(BITMAP),&bitmapinfo);
    pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &mem, 0, 0,bitmapinfo.bmWidth,bitmapinfo.bmHeight, SRCCOPY);
    
    return TRUE;
    
}

Так я загружал растр на фон представления,производного от CFormView в обработчике ON_WM_ERASEBKGND
Добавлено @ 10:40
Цитата(kometa_triatlon @ 26.9.2005, 18:00)
Кстати, это какой-то дурацкий способ. Он чаще всего не работает 
Часто работает на половину...

Ну зачем же так сразу.. smile
Я молодым разукрашивал диалоги "на раз", все работало.... smile
Уж диалог точно красился smile



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


Шустрый
*


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

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



Все просто вроде:
Создаем кисть нужного цвета и ее возвращаем
Код
HBRUSH CDB::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) 
{
//HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
HBRUSH hbr=CreateSolidBrush(RGB(0,0,255));
return hbr;
}

Если эдитбоксы есть, то:
Код
HBRUSH CDB::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) 
{
//HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
HBRUSH hbr;
if(nCtlColor==CTLCOLOR_EDIT)
{
hbr=CreateSolidBrush(RGB(255,255,255));
return hbr;
}
hbr=CreateSolidBrush(RGB(0,0,255));
return hbr;
}


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


Шустрый
*


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

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



почему данный подход абсолютно бесполезен для windows xp
в 98 всё работает нормально, а в хр ничего не меняется, как будто и нет этого кода?
PM MAIL   Вверх
AlexPro
Дата 24.1.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



smile А вся проблема в том (на мой взгляд), что в Майкрософте работают черезчур умные программисты: они забыли, что такое простые вещи.smile Неужели трудно было в базовом классе CWnd определить функцию SetColor, которая сама бы возилась со всеми своими сообщениями, кистями и перьями? Насколько бы это облегчило жизнь рядовым (не членам Майкрософт) программистам. Лично меня это напрягает. Да и тут такая дискуссия развернулась из-за элементарнейшей (по крайней мере, в других языках программированя) операции по смене цвета. Сорри за оффтопик, - наболело! smile
Цитата(Alexsar @ 24.1.2006, 02:44 Найти цитируемый пост)
почему данный подход абсолютно бесполезен для windows xp

Темы включены? Может они могут закрывать раскраску?
PM MAIL   Вверх
Alexsar
Дата 24.1.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как-нибудь это можно реализовать в хр?
PM MAIL   Вверх
CityAC
Дата 6.2.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как по нажатию кнопки на диалоге поменять цвет диалогового окна.
Код

void MyDialog::OnBnClickedClrBtn()
{
    CColorDialog dlg;
    dlg.m_cc.rgbResult = RGB(169,184,184);
    dlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT;
    if(dlg.DoModal() == IDOK)
    {
        m_TipBack = dlg.GetColor();// выбираю цвет в ColorDialog  , а что делать дальше не знаю
       
        
        
    }
    // TODO: Add your control notification handler code here
}

функция HBRUSH CMainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
у меня прописана и я так понял она вызывается системой при создании диалога
а как поменять фон уже созданного диалога ?


Это сообщение отредактировал(а) CityAC - 6.2.2007, 20:51
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
vinter
Дата 7.2.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата
у меня прописана и я так понял она вызывается системой при создании диалога


при перерисовке тоже
создай кисть одну, и в кнопке меняй ее цвет на требуемый тебе, а в OnCtlColor возвращай эту кисть, и не забывай после создания кисти Invalidate();
примерно так
Код

void MyDialog::OnBnClickedClrBtn()
{
    CColorDialog dlg;
    dlg.m_cc.rgbResult = RGB(169,184,184);
    dlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT;
    if(dlg.DoModal() == IDOK)
    {
        m_TipBack = dlg.GetColor();// выбираю цвет в ColorDialog  , а что делать дальше не знаю
       
        
        
    }
    // TODO: Add your control notification handler code here
    brush.DeleteObject();// удаляем старую кисть
    brush.Create(RGB(255, 255, 0)); 
    Invalidate();
}

 HBRUSH CMainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
     return brush;
}





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


 




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


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

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