На главную Наши проекты:
Журнал   ·   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
  
> Правильное рисование
    Как правильно создавать и удалять объекты, с помощью которых рисуется что либо
    Например
    //Создаем объект карандаш.
    CPen cCurrentPen;
    cCurrentPen.CreatePen(0,2,COLOR);
    DC.SelectObject(cCurrentPen);
    //Тут рисуем что-то
    ......
    //Тут рисуем что-то
    //Удаляем карандаш

    DC.DeleteDC(cCurrentPen);//можно так
    DeleteObject(cCurrentPen);// а можно и так
    cCurrentPen.DeleteObject();// или так

    Какое из этих трех способов правильное и наиболее предпочтительнее или может еще что есть
      Можно по-разному, но лучше в основном полагаться на деструкторы, т.е вообще ничего не писать для удаления. Есть, правда, нюансы. Один из них: не осталяй объекты выбранными в контекст устройства
        2Z@:
        DeleteObject(SelectObject(cCurrentPen));

        Именно это и сказал "мастер кода" ;D

        2Александр:
        Не злись за обзывательство!
          2SUnteXx: Не так я сказал. Прочитай ещё раз!

          Вот примеры корректного кода:

          void CPopupIndicator::OnPaint()
          {
               CPaintDC dc(this); // device context for painting
               
               CBrush brBack(RGB(200, 200, 200));
               CBrush* pBrOld = dc.SelectObject(&brBack);
               dc.SelectStockObject(NULL_PEN);

               CRect rc;
               GetClientRect(&rc);

               dc.Rectangle(rc.left,rc.top,rc.right+1,rc.bottom+1);

               if(m_hIcon)
               {
                     DrawIconEx(dc.GetSafeHdc(), 1, 1, m_hIcon, GetSystemMetrics(SM_CXSMICON),
                           GetSystemMetrics(SM_CYSMICON), 0, 0, DI_NORMAL);
               }
               else
               {
                     HICON hIcon = ((CLCDlg*)(AfxGetApp()->GetMainWnd()))
                     ->CreateLangCorrespondingSystrayIcon();

                     DrawIconEx(dc.GetSafeHdc(), 1, 1, hIcon, GetSystemMetrics(SM_CXSMICON),
                           GetSystemMetrics(SM_CYSMICON), 0, 0, DI_NORMAL);
                     DestroyIcon(hIcon);
               }

               dc.SelectObject(pBrOld);
          }


          void CReplaceTip::OnPaint()
          {
               CPaintDC dc(this); // device context for painting

               CBrush brBack;
               brBack.CreateSolidBrush(GetSysColor(COLOR_INFOBK));

               CRect rc;
               GetClientRect(&rc);

               CString strText;
               GetWindowText(strText);

               dc.SelectStockObject(DEFAULT_GUI_FONT);
               dc.SetBkMode(TRANSPARENT);
               dc.SetTextColor(GetSysColor(COLOR_INFOTEXT));

               dc.FillRect(&rc, &brBack);

               rc.OffsetRect(2, 0);
               
               dc.DrawText(strText, -1, &rc, DT_LEFT);

               // Do not call CWnd::OnPaint() for painting messages
          }
          Сообщение отредактировано: Codemaster -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0327 ]   [ 16 queries used ]   [ Generated: 28.04.24, 05:51 GMT ]