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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 05.04.2019, 10:26   #1
erslgoeirjh
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию Не восстанавливаются цвет и стили в компонентах

На диалоге находится группбокс m_IDC_STATIC12 типа CMyStatic. Внутри этого группбокса на диалоге находятся статический текст m_IDC_STATIC9 типа CMyStatic2
и текстовое поле m_IDC_EDIT3 типа CMyEdit. При этом во всех этих трёх классах есть поле paintstyle, показывающая, рисовать ли эти объекты в обычном режиме (то есть как CStatic и CEdit)
(paintstyle==0) или же рисовать их в особом режиме--со сменой цветов (paintstyle==1).
В программе при выполнения определённого условия этим трём компонентам задаётся значение paintstyle равное 1 и эти компоненты перерисовываются в особом режиме.
После этого, при нажатии кнопки "Очистить" этим трём компонентам задаётся значение paintstyle равное 0 и вызывается функция Redraw для каждого из них--с той целью, чтобы эти компоненты стали отображаться в обычном режиме
(то есть как CStatic и CEdit).
Однако этого не происходит--группбокс m_IDC_STATIC12 продолжается отображаться в особом режиме (то есть жёлтым цветом), теккстовое поле m_IDC_EDIT3 отображается каким-то странным цветом
(оттенком серого, но не тем серым цветом, каким оно было первоначально)(m_IDC_EDIT3 постевлен в режим "Отключено") и без тех чётких границ, какие он имеет при обычном режиме отображения.

В чём причина этого? Как исправить эту ошибку?

в файле MyStatic.cpp:

Код:
CMyStatic::CMyStatic()
{
    CStatic::CStatic();
    paintstyle = 0;
}

void  CMyStatic::OnPaint()
{
    if (paintstyle==0)
    {
        // обычный режим рисования
        CStatic::OnPaint();
    }
    if (paintstyle==1)
    {
        const MSG *msg = GetCurrentMessage();
        DefWindowProc(msg->message,msg->wParam,msg->lParam);
        RECT  rc;
        GetClientRect(&rc);
        CClientDC  myDC(this);
        brushcolor = myDC.GetDCBrushColor();
        pencolor = myDC.GetDCPenColor();
        CBrush  brush(RGB(255,255,0)); // жёлтый цвет
        myDC.SelectObject(&brush);
        myDC.FillRect(&rc,&brush);
        CPen  pen(0,1,RGB(0,0,0));
        myDC.SelectObject(&pen);
        myDC.Rectangle(&rc);
    }
}
в файле MyStatic2.cpp:

Код:
CMyStatic2::CMyStatic2()
{
    CStatic::CStatic();
    paintstyle = 0;
}

void  CMyStatic2::OnPaint()
{
    LOGFONT  lf;
    CFont *pFont;

    if (paintstyle==0)
    {
        // обычный режим рисования
        CStatic::OnPaint();
    }
    if (paintstyle==1)
    {
        const MSG *msg = GetCurrentMessage();
        DefWindowProc(msg->message,msg->wParam,msg->lParam);
        RECT  rc;
        GetClientRect(&rc);
        CClientDC  myDC(this);
        CBrush  brush(RGB(255,255,0));
        myDC.SelectObject(&brush);
        myDC.SetDCBrushColor(RGB(255,255,0));
        myDC.FillRect(&rc,&brush);
        myDC.SetBkColor(RGB(255,255,0));        
        CPen  pen(0,1,RGB(0,0,0));
        myDC.SelectObject(&pen);
        CString  strText;
        GetWindowText(strText);
        memset(&lf,0,sizeof(lf));
        lf.lfHeight = 8;
        lf.lfWidth = 7;
        lf.lfWeight = FW_BOLD;
        wcscpy(lf.lfFaceName,L"MS Sans Serif");
        pFont = new CFont();
        pFont->CreateFontIndirect(&lf);
        myDC.SelectObject(pFont);
        ::SetTextColor(myDC,RGB(0,0,0));
        ::DrawText(myDC,strText,strText.GetLength(),&rc,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
    }
}

в файле MyEdit.cpp:

Код:
CMyEdit::CMyEdit()
{
    CEdit::CEdit();
    paintstyle = 0;
}

void  CMyEdit::OnPaint()
{
    if (paintstyle==0)
    {
        // обычный режим рисования текстового поля
        CEdit::OnPaint();
    }
    if (paintstyle==1)
    {
        const MSG *msg = GetCurrentMessage();
        DefWindowProc(msg->message,msg->wParam,msg->lParam);
        RECT  rc;
        GetClientRect(&rc);
        CClientDC  myDC(this);
        brushcolor = myDC.GetDCBrushColor();
        pencolor = myDC.GetDCPenColor();
        myDC.SetDCBrushColor(RGB(255,255,255));
        myDC.FillRect(&rc,myDC.GetCurrentBrush());
        myDC.SetBkColor(RGB(255,255,255));
        myDC.SetTextColor(RGB(0,0,0));
        CPen  pen(0,2,RGB(0,128,0)); // зелёный цвет
        myDC.SelectObject(&pen);
        CString  strText;
        GetWindowText(strText);
        myDC.Rectangle(rc.left+1,rc.top+1,rc.right-1,rc.bottom-1);
        ::SetTextColor(myDC,RGB(0,0,0));
        ::DrawText(myDC,strText,strText.GetLength(),&rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    }
}

вызов из диалога смены режима отображения (поле paintstyle) для m_IDCSTATIC12, m_IDC_STATIC9 и m_IDC_EDIT3:


Код:
m_IDC_STATIC12.paintstyle = 1;
m_IDC_STATIC12.RedrawWindow();
m_IDC_STATIC9.RedrawWindow();
m_IDC_STATIC10.RedrawWindow();
m_IDC_STATIC11.RedrawWindow();
swprintf(ws,40,L" %d.%02d.%02d/%02d:%02d:%06.3f ET",year,month,day,hour,minute,second);
m_IDC_EDIT3.paintstyle = 1;
m_IDC_EDIT3.RedrawWindow();
m_IDC_EDIT3.SetWindowText(ws); 
m_IDC_STATIC9.paintstyle = 1;
m_IDC_STATIC9.RedrawWindow();

обработка нажатия кнопки "Очистить", которое должно восстанавливать цвета и стили для m_IDC_STATIC12, m_IDC_STATIC9 и m_IDC_EDIT3:

Код:
void CCalcDialog::OnBnClickedButton3()
// если была нажата кнопка "Очистить"
{
    // TODO: добавьте свой код обработчика уведомлений
    m_IDC_STATIC12.paintstyle = 0;
    m_IDC_STATIC12.RedrawWindow();
    m_IDC_STATIC9.paintstyle = 0;
    m_IDC_STATIC9.RedrawWindow();
    m_IDC_EDIT3.SetWindowText(L"");
    m_IDC_EDIT3.paintstyle = 0;
    m_IDC_EDIT3.RedrawWindow();
}
erslgoeirjh вне форума Ответить с цитированием
Старый 05.04.2019, 10:57   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,054
По умолчанию

Цитата:
Код:
    if (paintstyle==1)
    {
        ...
        brushcolor = myDC.GetDCBrushColor();
        pencolor = myDC.GetDCPenColor();
что ЗДЕСЬ будет brushcolor pencolor ?
при условии что это НЕ локальные переменные.
а будут это по всей видимости те самые свойства отображения "по умолчанию".
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.04.2019, 13:03   #3
erslgoeirjh
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию

Я пробовал восстановить цвета через brushcolor и pencolor--по-нормальному не получается восстановить цвета и стили.
erslgoeirjh вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как переопределить стили - не применяются стили совсем. mf`r HTML и CSS 12 08.02.2017 19:55
Не меняется цвет шрифтов, на компонентах в Delphi_7. StE111 Общие вопросы Delphi 4 26.11.2013 08:57
Периодически пропадают и восстанавливаются сетевые подключения Yanita Windows 0 16.09.2013 15:05
Каким образом можно изменять цвет фона и цвет шрифта в Label? jungle Win Api 17 20.09.2009 23:38
Стили ячеек. Цвет фона, шрифт: размер, начертание .. Virtson Microsoft Office Excel 3 10.03.2007 16:19


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS