Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.210.83.20] |
|
Сообщ.
#1
,
|
|
|
На диалоге находится группбокс 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(); } |
Сообщ.
#2
,
|
|
|
В OnPaint нужно использовать CPaintDC, а не CClientDC
DefWindowProc там не нужно вызывать |
Сообщ.
#3
,
|
|
|
А в чём разница между CPaintDC и CClientDC ?
Добавлено И ещё вопрос: как получить тот стандартный оттенок серого цвета, которым рисуются кнопки, окна и т.п.? |
Сообщ.
#4
,
|
|
|
Цитата erslgoeirjh @ А в чём разница между CPaintDC и CClientDC ? CPaintDC вызывает BeginPaint/EndPaint - эти функции дожны вызываться при обработке WM_PAINT Добавлено Цитата erslgoeirjh @ И ещё вопрос: как получить тот стандартный оттенок серого цвета, которым рисуются кнопки, окна и т.п.? DWORD GetSysColor( int nIndex ); |