На диалоге находится группбокс 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();
}
1613 г. = 2024 г.