Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

 operator proptype {

// Здесь может быть проверка "m_owner" и "m_getter" на NULL

return (m_owner->*m_getter);

 }

 // Оператор присваивания. Реализует свойство для записи.

 void operator =(proptype data) {

// Здесь может быть проверка "m_owner" и "m_setter" на NULL

(m_owner->*m_setter)(data);

 }

 // Конструктор по умолчанию.

 property : m_owner(NULL), m_getter(NULL), m_setter(NULL) {}

 //Конструктор инициализации.

 property(propowner * const owner, getter getmethod, setter setmethod) :

m_owner(owner), m_getter(getmethod), m_setter(setmethod) {}

 // Инициализация

 void init(propowner * const owner, getter getmethod, setter setmethod) {

m_owner = owner;

m_getter = getmethod;

m_setter = setmethod;

 }

};

Теперь класс, реализующий свойство можно написать так:

class CValue {

 private:

 int m_value;

 int get_Value {

return m_value; // Или более сложная логика

 }

 void put_Value(int value) {

m_value = value; // Или более сложная логика

 }

public:

 property <int, CValue> Value;

 CValue {

Value.init(this, get_Value, put_Value);

 }

};

А вот код, использующий этот класс:

CValue val;

/*

Здесь вызывается оператор присваивания переменной-члена val.Value, и, следовательно, функция val.put_Value

*/

val.Value = 50;

/*

Здесь вызывается оператор приведения типа переменной-члена val.Value, и, следовательно, функция val.get_Value

*/

int z = va.Value;

Как можно видеть, получились "настоящие" свойства средствами только стандартного синтаксиса C++. Однако, описанный метод не лишен недостатков:

• При каждом обращении к "свойству" происходит два вызова функции.

• Использование таких "свойств" требует дополнительных затрат памяти из-за того, что на каждое "свойство" требуется 3 дополнительных указателя, что составляет 12 байт накладных расходов.

• Использование шаблонов приводит к увеличению размеров исполняемого кода, поскольку компилятор будет генерировать отдельный класс для каждой пары "proptype" и "propowner".

• Для каждого "свойства" необходимо не забыть произвести инициализацию в конструкторе класса-владельца. 

ВОПРОС-ОТВЕТ 
Как научить программу реагировать на изменение содержимого буфера обмена?
Автор: Александр Шаргин Версия текста: 1.0 Программа-пример CbView Программа-пример MfcCbView

В Windows существует понятие наблюдателя за буфером обмена (clipboard viewer), которым может стать любое окно. Наблюдатель получает от системы уведомления об изменении содержимого буфера обмена в виде сообщения WM_DRAWCLIPBOARD. Соответственно, в ответ на это сообщение программа может загрузить содержимое буфера обмена и выполнить с ним нужные операции (типичный пример – отобразить содержимое буфера обмена в окне).

Интересен способ взаимодействия системы с несколькими наблюдателями за буфером обмена. Дело в том, что с точки зрения Windows наблюдатель всегда один (он называется текущим), и только ему посылаются уведомления. Передача этих уведомлений дальше по цепочке наблюдаетей – задача приложения. Для этого каждая программа, регистрирующая наблюдателя за буфером обмена, получает и сохраняет в переменной HWND предыдущего наблюдателя, а затем передаёт ему сообщения с помощью одной из функций SendMessage, PostMessage и т.п. "Недобросовестная" программа, которая не передаёт уведомления дальше по цепочке, может нарушить работу других приложений и даже других экземпляров самой себя, поэтому писать такие программы настоятельно не рекомендуется.

Рассмотрим процесс работы программы-наблюдателя более подробно. Первое, что ей необходимо сделать – это зарегистрировать своё окно при помощи функции SetClipboardViewer, которая возвращает хэндл текущего наблюдателя и делает текущим наше окно. Как уже говорилось, переданный нам хэндл окна следует сохранить в переменной для дальнейшего использования. Например:

BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {

 …

 static HWND hNextViewer;

  • Читать дальше
  • 1
  • ...
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: