Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скопировать HPEN 
:(
    Опции темы
mrgloom
Дата 16.9.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



есть 
Код

HPEN    Pen;


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

Pen= (HPEN)::GetStockObject(WHITE_PEN)


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

::DeleteObject(Pen);


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

Это сообщение отредактировал(а) mrgloom - 16.9.2013, 16:17
PM MAIL   Вверх
Amp
Дата 16.9.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Создать новый HPEN (CreatePen) и установить параметры оригинального объекта HPEN.
PM MAIL   Вверх
mrgloom
Дата 16.9.2013, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Ну так то да, я думал может есть какая то функция.

похоже что 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);

PM MAIL   Вверх
mrgloom
Дата 17.9.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



а как выцепить настройки из HPEN не имея CPen?
PM MAIL   Вверх
Amp
Дата 17.9.2013, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



GetObject?
PM MAIL   Вверх
Earnest
Дата 25.9.2013, 10:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.