Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Help! Помогите изменить цвет контрола?


Автор: Aids 29.9.2009, 13:43
не могу поменять цвет кнопки.
Код

    CDC *dc;
    dc=Bt1.GetDC();
    CPen *pPen=new CPen(PS_DASH,10,RGB(0,0,255));
    CBrush *pBrush=new CBrush(RGB(0,0,255));
    dc->SelectObject(pPen);
    dc->SelectObject(pBrush);


не работает. Что сделал не так?

Автор: Earnest 29.9.2009, 13:46
А где ты это делаешь? И что за кнопка?

Автор: Aids 29.9.2009, 13:49
Это событие на кнопку Bt0, должна поменять цвет Bt1.
Кнопка из ресурсов:
Код

public:
    CButton Bt0;
public:
    CButton Bt1;


Код

void CCalcDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_BUTTON30, Bt0);
    DDX_Control(pDX, IDC_BUTTON23, Bt1);
    DDX_Control(pDX, IDC_BUTTON22, Bt2);
    DDX_Control(pDX, IDC_BUTTON21, Bt3);
    DDX_Control(pDX, IDC_BUTTON16, Bt4);
    DDX_Control(pDX, IDC_BUTTON15, Bt5);
    DDX_Control(pDX, IDC_BUTTON14, Bt6);
    DDX_Control(pDX, IDC_BUTTON9, Bt7);
    DDX_Control(pDX, IDC_BUTTON8, Bt8);
    DDX_Control(pDX, IDC_BUTTON7, Bt9);
}



Автор: Earnest 29.9.2009, 13:56
Тогда все не так. Делаешь, в смысле.
В приведенном коде ты создаешь кисть и выбираешь ее в контекст, вот и все. С чего ты взял, что это заменит цвет кнопки? Откуда система о твоей кисти узнает? Более того, кисть накроется сразу по выходу из функции, где ты ее создаешь.
Чтобы сделать кнопку нестандартного цвета, нужно сделать ее owner-draw, иначе никак. Вот в коде рисования кнопки ты можешь создать кисть, выбрать ее в контекст и нарисовать кнопку. Вроде недавно была тема по поводу рисования owner-draw кнопок, поищи.

Автор: Alca 29.9.2009, 14:03
http://www.codeproject.com/KB/buttons/oddbutton.aspx

Добавлено через 52 секунды
http://www.codeproject.com/KB/buttons/nativewin32xpthemes.aspx

Добавлено через 1 минуту и 4 секунды
http://www.codeproject.com/info/search.aspx?artkw=+owner-draw+button&sbo=kw

Автор: Aids 29.9.2009, 14:30
Earnest
Цитата

Откуда система о твоей кисти узнает? 

Какое событие надо вызвать, чтобы система узнала о новом контексте? Или какое обработать?
Цитата

Более того, кисть накроется сразу по выходу из функции, где ты ее создаешь.


почему накроется. я ведь память выделяю из кучи, а не из стека.
Код

CPen *pPen=new CPen(PS_DASH,10,RGB(0,0,255));

я лиш потеляю указатель на pPen

Автор: Earnest 29.9.2009, 14:39
Цитата(Aids @  29.9.2009,  15:30 Найти цитируемый пост)
Какое событие надо вызвать, чтобы система узнала о новом контексте? Или какое обработать?

Никакое. В смысле нет такого способа.
Цитата(Aids @  29.9.2009,  15:30 Найти цитируемый пост)
почему накроется. я ведь память выделяю из кучи, а не из стека.

Да, верно, не заметила.

Но суть это не меняет. Тебе нужно самому рисовать кнопку, that's it. 
Alca, кстати, тебе примеров накидал. Так что изучай.

Автор: Aids 29.9.2009, 14:57
ничего не пойму. мне что придётся на подобии CBitmapButton класса использовать и прорисовывать как минимум два состояния нажатия и отжатия? Можно же как то подругому наверное? Ведь на форме же можно рисовать! так и на кнопке можно!

Автор: Earnest 29.9.2009, 15:12
Цитата(Aids @  29.9.2009,  15:57 Найти цитируемый пост)
мне что придётся на подобии CBitmapButton класса использовать и прорисовывать как минимум два состояния нажатия и отжатия

Именно.

Цитата(Aids @  29.9.2009,  15:57 Найти цитируемый пост)
 Ведь на форме же можно рисовать! так и на кнопке можно! 

Можно, для этого и придуман стиль OwnerDraw. А ты думаешь в OnPaint рисовать будет проще? Ничего подобного. DrawItem тебе все расскажет: в каком состоянии кнопка (нажата\отжата, в фокусе или нет). А в OnPaint тебе самому этим заниматься придется. Ну не поддерживает стандартная кнопка изменение фона, всегда рисует стандартной кистью, наплевав на все. MSDN читай.

В принципе, если используется манифест и темы, то вроде кнопка реагирует на CUSMOMDRAW, тогда чуть-чуть меньше самому рисовать - можно писать только то, что нестандартно. Но точно не знаю - вроде где-то недавно промелькивало.
Но поскольку кнопка - один из самых простых для рисования контролов, то я бы не стала париться. Все рисование - фон, рамка и текст. 


Автор: Aids 1.10.2009, 07:40
Earnest
А если мне надо поменять цвет шрифта у надписи кнопки, то её тоже придётся рисовать.

Автор: Earnest 1.10.2009, 07:57
Да, нажимаемые кнопки поддаются только owner-draw. Но это очень просто, как уже было сказано.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)