Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамическое изменение цвета элементов упраления

5.7K
24 сентября 2004 года
Andrdandr
29 / / 17.09.2004
Возникла проблема.
Необходимо по щелчку на кнопку изменить цвет текста и фона объекта CStatic на цвета в переменных
COLORREF clrBack, clrText;
Нашел два способа:
1) перегрузка OnClrControl // или как-то так
2) создание своего класса
class MyStatic: public CStatic

3)Пробовал так:
CWnd* pwnd = GetDlgItem(IDC_STATIC1);
CDC* pDc = pwnd->GetDC();
pDC->SetTextColor(clrText);
pDC->SetBkColor(clrBack);

но, почему-то не работает.

Возможен ли альтернативный вариант, который был бы проще. Ели же нет, то плз, постните объяснения первых двух. И почему неработает 3?
Спасибо.
3
24 сентября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Andrdandr
Возникла проблема.
Необходимо по щелчку на кнопку изменить цвет текста и фона объекта CStatic на цвета в переменных
COLORREF clrBack, clrText;
Нашел два способа:
1) перегрузка OnClrControl // или как-то так
2) создание своего класса
class MyStatic: public CStatic

3)Пробовал так:
CWnd* pwnd = GetDlgItem(IDC_STATIC1);
CDC* pDc = pwnd->GetDC();
pDC->SetTextColor(clrText);
pDC->SetBkColor(clrBack);

но, почему-то не работает.

Возможен ли альтернативный вариант, который был бы проще. Ели же нет, то плз, постните объяснения первых двух. И почему неработает 3?
Спасибо.



SetTextColor, SetBkColor и т.п. работает в обработчиках связанных с перерисовкой (WM_DRAWITEM, WM_CTLCOLOR и т.п.)

Поясни, что ты подразумевал под п.2, чем он отличается от п.1 ?

Цитата:

1) перегрузка OnClrControl // или как-то так
2) создание своего класса
class MyStatic: public CStatic

368
24 сентября 2004 года
rostyslav
629 / / 13.07.2004
 
Код:
HBRUSH CGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  if(pWnd==GetDlgItem(IDC_STATIC1))
  {
    pDC->SetTextColor(clrText);
    pDC->SetBkColor(clrBack);
  }
  return hbr;
}

3й нужно бы обявить в OnPaint и самому выводить IDC_STATIC1.
5.7K
24 сентября 2004 года
Andrdandr
29 / / 17.09.2004
Цитата:
Originally posted by Green


SetTextColor, SetBkColor и т.п. работает в обработчиках связанных с перерисовкой (WM_DRAWITEM, WM_CTLCOLOR и т.п.)

Поясни, что ты подразумевал под п.2, чем он отличается от п.1 ?



class CMyStatic: public CSTatic
{
// ...
HBRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlCOLOR)
{
//...
}
//...
};
Что-то вроде этого.

Еще вопрос, при изменении цвета окна, в одной из книг написано что-то такое:
HBRUSH CGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd==GetDlgItem(CTLCOLOR_DLG))
{
pDC->SetBkColor(clrBack);
hbr = CreateSolidBrush(clrBack);
}
return hbr;
}
насколько я понял функция возвращает кисть для перерисовки окна, но тогда зачем "pDC->SetBkColor(clrBack);"?
И еще, как получить указатель на окно, додумался токо так:
CWnd* pWnd = CWnd::GetDlgItem(IDOK);
pWnd = pWnd->GetParent();
но это же через задницу!!!

Всем спасибо.

368
24 сентября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Andrdandr

насколько я понял функция возвращает кисть для перерисовки окна, но тогда зачем "pDC->SetBkColor(clrBack);"?
И еще, как получить указатель на окно, додумался токо так:
CWnd* pWnd = CWnd::GetDlgItem(IDOK);
pWnd = pWnd->GetParent();
но это же через задницу!!!
Всем спасибо.



SetBkColor устанавливает фон Controla. Исправил код, brush не нужно создавать.(писал по памяти).

this это тоже указатель на диалоговое окно.

3
24 сентября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Andrdandr

class CMyStatic: public CSTatic
{
// ...
HBRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlCOLOR)
{
//...
}
//...
};
Что-то вроде этого.


Т.е. первый и второй пункт это одно и тоже.

Цитата:
Originally posted by Andrdandr

Еще вопрос, при изменении цвета окна, в одной из книг написано что-то такое:
HBRUSH CGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd==GetDlgItem(CTLCOLOR_DLG))
{
pDC->SetBkColor(clrBack);
hbr = CreateSolidBrush(clrBack);
}
return hbr;
}
насколько я понял функция возвращает кисть для перерисовки окна, но тогда зачем "pDC->SetBkColor(clrBack);"?


Так попробуй, поэксперементируй.

Цитата:

To change the background color of a single-line edit control, set the brush handle in both the CTLCOLOR_EDIT and CTLCOLOR_MSGBOX message codes, and call the CDC::SetBkColor method in response to the CTLCOLOR_EDIT code.

OnCtlColor will not be called for the list box of a drop-down combo box because the drop-down list box is actually a child of the combo box and not a child of the window. To change the color of the drop-down list box, create a CComboBox with an override of OnCtlColor that checks for CTLCOLOR_LISTBOX in the nCtlColor parameter. In this handler, the SetBkColor method must be used to set the background color for the text.



Цитата:
Originally posted by Andrdandr

И еще, как получить указатель на окно, додумался токо так:
CWnd* pWnd = CWnd::GetDlgItem(IDOK);
pWnd = pWnd->GetParent();
но это же через задницу!!!


Где ты хочешь его получить?
В методе какого класса?

3
24 сентября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by rostyslav

this это тоже указатель на диалоговое окно.


Ты, видимо, хотел сказать, что this - это константный указатель на экземпляр класса в контексте которого выполняется данный метод-член.
Но this не имеет никакого отношения к окнам, даже диалоговым... :)

368
24 сентября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Green

Но this не имеет никакого отношения к окнам, даже диалоговым... :)


Ну если это ты говоришь, то так оно и есть.(:))

Цитата:

Ты, видимо, хотел сказать, что this - это константный указатель на экземпляр класса в контексте которого выполняется данный метод-член.


Скорей всего...Но какая принципиальная разница между pWnd полученный
CWnd* pWnd = /*CWnd::*/GetDlgItem(IDOK);
pWnd = pWnd->GetParent();

и переменной this, внутри методов этого класса?

Мне не верится, что за пределами этого класса можно бы без ошибки вызвать
CWnd* pWnd = CWnd::GetDlgItem(IDOK);

Допустим есть один класс диалогового окна CDialog1, другой класс диалогового окна CDialog2, на которой есть Control c ID==IDC_CONTROL_D2, тогда

CDialog1::Metod()
{
CDialog2 dlg2;
CWnd* pWnd = CWnd::GetDlgItem(IDC_CONTROL_D2);
pWnd = pWnd->GetParent();
...
...
}

Как тебе такой код?

3
24 сентября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by rostyslav

Скорей всего...Но какая принципиальная разница между pWnd полученный
CWnd* pWnd = /*CWnd::*/GetDlgItem(IDOK);
pWnd = pWnd->GetParent();

и переменной this, внутри методов этого класса?



В числах разницы нет, но...
"this это тоже указатель на диалоговое окно" - звучит, как постулат.
Начинающий, взяв его на вооружение, может в дальнейшем считать, что this - это везде указатель на диалоговое окно.

Короче, я опять придрался к словам. :)

368
24 сентября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Green


В числах разницы нет, но...
"this это тоже указатель на диалоговое окно" - звучит, как постулат.
Начинающий, взяв его на вооружение, может в дальнейшем считать, что this - это везде указатель на диалоговое окно.


Ok. Согласен.

Цитата:

Короче, я опять придрался к словам. :)


Типа как я с вопросом: "Green!Исправь меня если ошибаюсь, но 2 в степени 0 это не 1?"

Будем считать, что 1:1 (:D)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог