Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 08.06.2018, 13:22   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 54
Репутация: 10
По умолчанию Как поменять цвет фона для кнопки (CButton)?

Есть кнопка IDC_BUTTON1, которой соответствует переменная m_IDC_BUTTON1 типа CButton.
Для этой кнопки я изменил высоту и ширину текста в функции CMyProgramDlg::OnInitDialog :

Код:

CMyProgramDlg::OnInitDialog()
{
    //...
    memset(&lf,0,sizeof(lf);
    lf.lfHeight = 25;
    lf.lfWidth = 10;
    lf.lfWeight = FW_BOLD;
    lf.lfCharSet = ANSI_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = PROOF_QUALITY;
    lf.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;
    wcscpy(lf.lfFaceName,L"MS sans Serif");
    pfont = new FOnt();
    pfont->CreateFontIndirect(&lf);
    m_IDC_BUTTON1.SetFont(pfont);
    return TRUE;
}


Это работает--текст в кнопке отображается нужным размером.

Но я захотел также изменить цвет фона в этой кнопке--например, на RGB(12,149,210). Цвет текста я оставил прежним--чёрным ( RGB(0,0,0) ).
В связи с этим я написал функцию:

Код:

HBRUSH  CMyProgramDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UITN nCtlColor)
{
    HBRUSH  hbr = CDialogEx::OnCtlColor(pDC,pWnd,nCtlColor);
    if (pWnd->GetDlgCtrlID()==IDC_BUTTON1)
    {
        pDC->SetBkColor(RGB(12,149,210));
        pDC->SetBkMode(TRANSPARENT);
    }
}

Однако у меня не происходит смена цвета фона кнопки--фон остаётся прежним.
Как мне решить эту проблему--чтобы у меня изменялся цвет фона кнопки, но при этом цвет текста оставался чёрным и текст был того размера, который я задал?
erslgoeirjh вне форума   Ответить с цитированием
Старый 13.06.2018, 11:19   #2
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 54
Репутация: 10
По умолчанию

С изменением цвета кнопки я разобрался:

Код:

void  CMyButton::OnPaint()
{
    CString  strText;

    LOGFONT  lf;
    memset(&lf,0,sizeof(lf));
    lf.lfHeight = 25;
    lf.lfWidth = 10;
    lf.lfWeight = FW_BOLD;
    lf.lfCharSet = ANSI_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = PROOF_QUALITY;
    lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf.lfFaceName,L"MS Sans Serif");
    CFont *pfont = new CFont();
    pfont->CreateFontIndirect(&lf);
    CDC *pDC = this->GetDC();
    RECT  rect;
    GetClientRect(&rect);
    GetWindowText(strText);
    HBRUSH  hBrush = CreateSolidBrush(RGB(141,179,226));
    pDC->SelectObject(hBrush);
    pDC->Rectangle(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
    pDC->SetBkColor(RGB(141,179,226));
    pDC->SetTextColor(RGB(255,255,255));
    pDC->SelectObject(pfont);
    pDC->DrawText(strText,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}


Но я решил пойти дальше--при нажатии на эту кнопку (то есть при нажатии левой кнопки "мыши") граница этой кнопки должна выделяться жирной линией, а при отпускании левой кнопки "мыши" граница кнопки должна восстанавливаться. Для этого я написал:

Код:

void  CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
    CButton::OnLButtonDown(nFlags,point);
    HPEN  hPen = CreatePen(PS_SOLID,2,RGB(0,0,0)); // жирная чёрная сплошная линия
    RECT  rect;
    GetClientRect(&rect);
    pDC->MoveTo(rect.left,rect.top);
    pDC->LineTo(rect.right,rect.top);
    pDC->LineTo(rect.right,rect.bottom);
    pDC->LineTo(rect.left,rect.bottom);
    pDC->LineTo(rect.left,rect.top);
    pDC->SetBkColor(RGB(255,255,255));
    pDC->SetTextColor(RGB(255,255,255));
    RedrawWindow();
}


При нажатии левой кнопки "мыши" это работает--граница кнопки выделяется чёрной жирной сплошной линией.
Но как сделать так, чтобы при отпускании левой кнопки "мыши" восстанавливалась бы граница кнопки в первоначальном виде?
erslgoeirjh вне форума   Ответить с цитированием
Старый 13.06.2018, 12:38   #3
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,424
Репутация: 1667
По умолчанию

В событии OnLButtonUp сделать просто InvalidateRect() и дело с концом
waleri на форуме   Ответить с цитированием
Старый 13.06.2018, 19:28   #4
2Lui
Пользователь
 
Регистрация: 14.03.2017
Сообщений: 35
Репутация: 27
По умолчанию

Посоветую работать с Windows Aplication в Rad Studio там все намного проще чем у визуалке
2Lui вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как через функции system() поменять цвет фона??? yura_zb Общие вопросы C/C++ 2 03.05.2011 13:58
Как задать для формы произвольный цвет фона, который отличается от установленного по умолчанию на С# phabion Общие вопросы .NET 2 21.04.2010 16:29
поменять цвет фона в шаблоне css joomla ronny137 HTML и CSS 0 04.12.2009 00:25
Как с помощью JavaScript изменить цвет фона ячеек в таблице,так что бы можно было выбрать цвет из списка Gotessa JavaScript, Ajax 1 09.05.2009 16:05
Цвет фона кнопки romets Win Api 10 23.01.2008 18:13


10:18.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru