Не восстанавливаются цвет и стили в компонентах
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 05.04.19 07:13
Оценка:
На диалоге находится группбокс 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();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.