Динамическое изменение цвета элементов упраления
Необходимо по щелчку на кнопку изменить цвет текста и фона объекта 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?
Спасибо.
Возникла проблема.
Необходимо по щелчку на кнопку изменить цвет текста и фона объекта 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
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd==GetDlgItem(IDC_STATIC1))
{
pDC->SetTextColor(clrText);
pDC->SetBkColor(clrBack);
}
return hbr;
}
3й нужно бы обявить в OnPaint и самому выводить IDC_STATIC1.
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();
но это же через задницу!!!
Всем спасибо.
насколько я понял функция возвращает кисть для перерисовки окна, но тогда зачем "pDC->SetBkColor(clrBack);"?
И еще, как получить указатель на окно, додумался токо так:
CWnd* pWnd = CWnd::GetDlgItem(IDOK);
pWnd = pWnd->GetParent();
но это же через задницу!!!
Всем спасибо.
SetBkColor устанавливает фон Controla. Исправил код, brush не нужно создавать.(писал по памяти).
this это тоже указатель на диалоговое окно.
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);"?
Так попробуй, поэксперементируй.
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.
И еще, как получить указатель на окно, додумался токо так:
CWnd* pWnd = CWnd::GetDlgItem(IDOK);
pWnd = pWnd->GetParent();
но это же через задницу!!!
Где ты хочешь его получить?
В методе какого класса?
this это тоже указатель на диалоговое окно.
Ты, видимо, хотел сказать, что this - это константный указатель на экземпляр класса в контексте которого выполняется данный метод-член.
Но this не имеет никакого отношения к окнам, даже диалоговым... :)
Но 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();
...
...
}
Как тебе такой код?
Скорей всего...Но какая принципиальная разница между pWnd полученный
CWnd* pWnd = /*CWnd::*/GetDlgItem(IDOK);
pWnd = pWnd->GetParent();
и переменной this, внутри методов этого класса?
В числах разницы нет, но...
"this это тоже указатель на диалоговое окно" - звучит, как постулат.
Начинающий, взяв его на вооружение, может в дальнейшем считать, что this - это везде указатель на диалоговое окно.
Короче, я опять придрался к словам. :)
В числах разницы нет, но...
"this это тоже указатель на диалоговое окно" - звучит, как постулат.
Начинающий, взяв его на вооружение, может в дальнейшем считать, что this - это везде указатель на диалоговое окно.
Ok. Согласен.
Короче, я опять придрался к словам. :)
Типа как я с вопросом: "Green!Исправь меня если ошибаюсь, но 2 в степени 0 это не 1?"
Будем считать, что 1:1 (:D)