Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2018, 12:22   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Как поменять цвет фона для кнопки (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, 10:19   #2
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

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

Код:
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, 11:38   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как через функции 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 03.12.2009 23:25
Как с помощью JavaScript изменить цвет фона ячеек в таблице,так что бы можно было выбрать цвет из списка Gotessa JavaScript, Ajax 1 09.05.2009 16:05
Цвет фона кнопки romets Win Api 10 23.01.2008 17:13