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; }
|
|