WNDCLASS и дескриптор окна в отдельном классе или в том же классе? - PullRequest
1 голос
/ 08 марта 2012

Хорошо, серьезная дилемма.Я пытаюсь обернуть Windows API.и самая большая проблема дизайна, с которой я столкнулся (на данный момент), - это какой класс подходит для упаковки?Так как я создавал оболочку Windows API три раза раньше, всегда сталкиваясь с проблемой проектирования, на этот раз я намерен внимательно изучить все запутанные детали перед их реализацией.

Должны ли WNDCLASS и основные окна, созданные CreateWindow, быть заключены в один класс или отдельные классы?Должен ли я создать синглтон для хранения WNDCLASS?

Кроме того, если кто-нибудь может дать мне блок-схему или общую идею о том, как абстрагировать Windows API в классы, несколько хороших советов по дизайну?

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Для хорошего источника вдохновения, посмотрите на .Net Framework - нет концепции WNDCLASS! Вы можете сделать так, чтобы ваша библиотека создала WNDCLASS, которая используется всеми вашими окнами. Вам не нужны синглтоны (uurrgghhh), так как класс может использоваться строкой. Если вы хотите изменить некоторые характеристики, которые WNDCLASS определяет для конкретного окна, я думаю, вы можете использовать функцию SetWindowLongPtr.

Что нужно учитывать:

  1. Нужно ли иметь несколько экземпляров WNDCLASS?
  2. Хотите ли вы, чтобы клиенты обращались к данным WNDCLASS?
  3. Есть ли отношение один к одному между окнами и WNDCLASS или это один ко многим?
1 голос
/ 09 марта 2012

Они должны быть отдельными классами по той простой причине, что несколько окон могут наследоваться от одного и того же класса.

То, как я делал это раньше, ваш класс CWindow запрашивает статический метод класса CWindowClass для созданиякласс окна с определенными параметрами.Затем CWindowClass либо регистрирует новый класс окна, обернутый в CWindowClass для возврата вызывающей стороне, либо перерабатывает существующую для возврата вызывающей, кэшируя предыдущие успешные классы.

Ваш класс CWindow может затем установить околосоздавая дескриптор окна, используя базовое имя зарегистрированного класса, и когда CWindow располагается, он может уменьшить счетчик ссылок на CWindowClass - при последнем разыменовании которого класс будет освобожден должным образом.

1 голос
/ 08 марта 2012

По какой причине вы не используете ATL?

См. ATL CWindow в качестве облегченной обертки вокруг окон:

class CMyWindow : public CWindowImpl<CMyWindow>, ...
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS("MyName") 
              // If this macro is not specified in your
              // class, ATL will generate a class name
   ...

   BEGIN_MSG_MAP(CMyWindow)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()

   LRESULT OnPaint(UINT nMsg, WPARAM wParam, 
                   LPARAM lParam, BOOL& bHandled)
   {
      // Do some painting code
      return 0;
   }
};

Идите так же тяжело или легкос весом ATL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...