Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое обертка для класса. 
:(
    Опции темы
Гость_Виталий
Дата 28.10.2005, 09:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть задание создать обертку для HDC объекта, но что такое обертка до меня так и не доходит.
  Вверх
Plamenk
Дата 28.10.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




В GDI есть ряд функций, которые принимают в качестве параметра HDC.

А тебе надо реализовать класс, который будет содержать HDC, как внутреннюю переменную и реализовывать функции аналогичные GDI (просто делегировать вызовы, а в качестве HDC подставлять внут. переменную), только в качестве параметра будет подставляться эта переменная.

Наприме: В MFC СWnd обертка над HWND.
PM MAIL   Вверх
SeregaLBN
Дата 28.10.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

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



Есть тьма API ф-ций, использующих в качестве обычно первого параметра тип HDC.
Так вот, обёртка для HDC - это обычный С++ клаcc, где HDC является внутренней приватной переменной.
А нужные тебе API ф-ции для работы с HDC описываются как одноимённые методы твоего класса, только уже без входящего параметра HDC. Вместо него ты должен использовать свою приватную переменную.
Например, наверняка знакомая ф-ция:
Код

BOOL LineTo(
  HDC hdc,    // device context handle
  int nXEnd,  // x-coordinate of ending point
  int nYEnd   // y-coordinate of ending point
);

Так вот в твоём классе она будет реализована примерно так:
Код

BOOL CDC_My::LineTo(
  int nXEnd,  // x-coordinate of ending point
  int nYEnd   // y-coordinate of ending point
) {
   return ::LineTo(m_hDC, nXEnd, nYEnd);
}

Все остальные API ф-ции, где параметр HDC является входящим, реализуются аналогично.
Исключения будут только для методов твоего класса которые создают/уничножают твой внутренний(приватный) HDC.
Гдето всё вместе это будет выглядить примерно так:
Код

class CDC_My {
private:
   HDC m_hDC;
   HWND m_hWnd;

   BOOL FreeDC(HWND hWnd = NULL) {
      return m_hDC ? (m_hWnd ? ReleaseDC(hWnd ? hWnd : m_hWnd) : DeleteDC()) : FALSE;
   }
public:
  ~CDC_My() { FreeDC(); }
   CDC_My()             : m_hDC(NULL), m_hWnd(NULL) {}
   CDC_My(HDC  hDC )    : m_hDC(NULL), m_hWnd(NULL) { CreateCompatibleDC(hDC); }
   CDC_My(HWND hWnd)    : m_hDC(NULL), m_hWnd(NULL) { CreateFromHWND(hWnd); }

   /* Device Context Functions */
   BOOL CreateCompatibleDC(HDC hDC) {
      FreeDC();
      m_hDC = ::CreateCompatibleDC(hDC);
      return !!m_hDC;
   }
   BOOL CreateFromHWND(HWND hWnd) {
      FreeDC();
      m_hDC = ::GetDC(m_hWnd = hWnd);
      return !!m_hDC;
   }
   BOOL DeleteDC() {
      BOOL bRes = m_hDC ? ::DeleteDC(m_hDC) : FALSE;
      m_hDC = NULL;
      return bRes;
   }
   COLORREF GetDCPenColor() {
      return ::GetDCPenColor(m_hDC);
   }
   static BOOL isDC(HDC hDC) {
      return (::GetObjectType(hDC) == OBJ_DC);
   }
   int ReleaseDC(
      HWND hWnd = NULL  // handle to window
   ) {
      return ::ReleaseDC(hWnd ? hWnd : m_hWnd, m_hDC);
   }
   HDC ResetDC(
      CONST DEVMODE *lpInitData  // DC information
   ) {
      return ::ResetDC(m_hDC, lpInitData);
   }
   HGDIOBJ SelectObject(
      HGDIOBJ hgdiobj   // handle to object
   ) {
      return ::SelectObject(m_hDC, hgdiobj);
   }
   COLORREF SetDCBrushColor(
      COLORREF crColor  // new brush color
   ) {
      return ::SetDCBrushColor(m_hDC, crColor);
   }
   COLORREF SetDCPenColor(
      COLORREF crColor  // new pen color
   ) {
      return ::SetDCPenColor(m_hDC, crColor);
   }

   COLORREF GetPixel(
      int nXPos,  // x-coordinate of pixel
      int nYPos   // y-coordinate of pixel
   ) {
      return ::GetPixel(m_hDC, nXPos, nYPos);
   }
   COLORREF SetPixel(
      int X,             // x-coordinate of pixel
      int Y,             // y-coordinate of pixel
      COLORREF crColor   // pixel color
   ) {
      return ::SetPixel(m_hDC, X, Y, crColor);
   }
   //Ellipse
   //FillRect
   //FrameRect
   //Polygon
   //PolyPolygon
   //Rectangle
   //RoundRect

   //DrawText
   //DrawTextEx
   //ExtTextOut
   //SetTextAlign
   //SetTextColor
   //TextOut

   //Arc
   //ArcTo
   BOOL LineTo(
     int nXEnd,  // x-coordinate of ending point
     int nYEnd   // y-coordinate of ending point
   ) {
      return ::LineTo(m_hDC, nXEnd, nYEnd);
   }
   //MoveToEx 
   //Polyline
   //PolylineTo
};


Кстати, обёрткой в MFC для HDC является класс CDC.
Можешь посмотреть его реализацию...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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