На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Не восстанавливаются цвет и стили в компонентах
    На диалоге находится группбокс 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:

    ExpandedWrap disabled
      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:

    ExpandedWrap disabled
      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:

    ExpandedWrap disabled
      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:

    ExpandedWrap disabled
      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:

    ExpandedWrap disabled
      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();
      }
      В OnPaint нужно использовать CPaintDC, а не CClientDC
      DefWindowProc там не нужно вызывать
        А в чём разница между CPaintDC и CClientDC ?

        Добавлено
        И ещё вопрос: как получить тот стандартный оттенок серого цвета, которым рисуются кнопки, окна и т.п.?
          Цитата erslgoeirjh @
          А в чём разница между CPaintDC и CClientDC ?

          CPaintDC вызывает BeginPaint/EndPaint - эти функции дожны вызываться при обработке WM_PAINT

          Добавлено
          Цитата erslgoeirjh @
          И ещё вопрос: как получить тот стандартный оттенок серого цвета, которым рисуются кнопки, окна и т.п.?

          DWORD GetSysColor(
          int nIndex
          );
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0316 ]   [ 16 queries used ]   [ Generated: 28.03.24, 11:31 GMT ]