Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > скопировать HPEN


Автор: mrgloom 16.9.2013, 16:16
есть 
Код

HPEN    Pen;


инициализируется так
Код

Pen= (HPEN)::GetStockObject(WHITE_PEN)


удаляется как 
Код

::DeleteObject(Pen);


а как правильно скопировать? просто присвоение это не то.

Автор: Amp 16.9.2013, 16:29
Создать новый HPEN (CreatePen) и установить параметры оригинального объекта HPEN.

Автор: mrgloom 16.9.2013, 16:39
Ну так то да, я думал может есть какая то функция.

похоже что CPen тоже просто так не присваивается
Код

1>c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(312) : error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
1>        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(562) : see declaration of 'CObject::operator ='
1>        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(532) : see declaration of 'CObject'
1>        This diagnostic occurred in the compiler generated function 'CGdiObject &CGdiObject::operator =(const CGdiObject &)'


вообщем вроде так
Код

LOGPEN logpen;
CPen   cMyPen;

// Get the LOGPEN of an existing pen.
penExisting.GetLogPen(&logpen);

// Change the color to red and the width to 2.
logpen.lopnWidth.x = 2;
logpen.lopnColor = RGB(255, 0, 0);

// Create my pen using the new settings.
cMyPen.CreatePenIndirect(&logpen);

Автор: mrgloom 17.9.2013, 10:01
а как выцепить настройки из HPEN не имея CPen?

Автор: Amp 17.9.2013, 17:23
GetObject?

Автор: Earnest 25.9.2013, 10:30
MFC-объекты не имеют семантики копирования, что очень неудобно.
Я себя сделала такие вот обертки для перьев (и аналогично для кистей). Смысл в том, что копирующие операторы копируют только параметры, а объект создается on-demand, поэтому оператор приведения не константный.
Для большего удобства можно добавить класс-обертку для контекста, для работы в связке - чтобы избежать всей этой мутоты со своевременным удалением gdi-объектов.
Код

class CGdiPen: private CPen
{
public:
   CGdiPen(COLORREF=0,UINT=PS_SOLID,LONG=0);
   CGdiPen(const CGdiPen&);
   operator HGDIOBJ();
   operator HGDIOBJ() const { return m_hObject; }
   CGdiPen& operator = (const CGdiPen&);
   bool operator == (const CGdiPen&) const;
   bool operator != (const CGdiPen&) const;
   
   COLORREF Color() const { return m_Brush.lbColor; }
   int      Style() const { return m_nStyle;   }
   int      Width() const { return m_nWidth;   }

   void Color(COLORREF);
   void Style(UINT);
   void Width(LONG);

private:
   void CreatePen();
   
private:
   LOGBRUSH m_Brush;
   int      m_nWidth;
   int      m_nStyle;
};

inline CGdiPen::CGdiPen(const CGdiPen& A):
   m_Brush(A.m_Brush),
   m_nStyle(A.m_nStyle),
   m_nWidth(A.m_nWidth)
{
}
inline CGdiPen& CGdiPen::operator = (const CGdiPen& A)
{
   if (*this != A)
   {
      DeleteObject();
      m_Brush  = A.m_Brush;
      m_nStyle = A.m_nStyle;
      m_nWidth = A.m_nWidth;
   }
   return *this;   
}
inline CGdiPen::operator HGDIOBJ()
{
   if (!m_hObject) CreatePen();
   return m_hObject;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)