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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

На диалоге находится группбокс 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, 11:57   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,929
Репутация: 2242
По умолчанию

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

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

Опции темы

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

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

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

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


15:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.