Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ActiveX, свойство *IFontDisp, не работает Set(), Не вызывается обработчик ....Set() 
:(
    Опции темы
Dreamer_0x01
Дата 4.4.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Здравствуйте. Проблема в следующем.
Пишу ActiveX компонент, у которого есть свойство Font1. Объявлено оно вот так:

Код

/*в idl - файле:*/
//----------------------------------------
            [id(1), helpstring("property Font1"), helpcontext(1), bindable, defaultbind, displaybind, immediatebind] IFontDisp*Font1;/*это сгенерировано студией*/

/*в h - файле:*/
//------------------------------------------

/*Это сгенерировано студией*/
enum {
        dispidFont1 = 1
    };
    IFontDisp* GetFont1(void);
    void SetFont1(IFontDisp* pVal);

/*эта переменная объявлена мною самостоятельно:*/
    CFontHolder m_Font1;


Соответственно, в cpp-файле есть строки, сгенерированные студией:
Код

BEGIN_DISPATCH_MAP(CAFontCtrl, COleControl)
    DISP_PROPERTY_EX_ID(CAFontCtrl, "Font1", dispidFont1, GetFont1, SetFont1, VT_FONT)
END_DISPATCH_MAP()




и строки, добавленные мной:
Код

// CAFontCtrl::CAFontCtrl - Constructor
CAFontCtrl::CAFontCtrl():
    m_Font1(&m_xFontNotification)
{
    InitializeIIDs(&IID_DAFont, &IID_DAFontEvents);
}


// Массив шрифотов по умолчанию
static const FONTDESC _fontdescHeadingDef[] = {
    
    { sizeof(FONTDESC), OLESTR("Arial"), 
      FONTSIZE(8), FW_NORMAL, ANSI_CHARSET, FALSE, FALSE, FALSE },

    { sizeof(FONTDESC), OLESTR("Impact"),
      FONTSIZE(10), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE },
};

// CAFontCtrl::DoPropExchange - Persistence support

void CAFontCtrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);

    // TODO: Call PX_ functions for each persistent custom property.
    PX_Font(pPX,  _T("Font1"),        m_Font1,              &_fontdescHeadingDef[0]);
}


В функции OnDraw() использую данное свойство для рисования текста, рисуется все нормально.

Добавляем компонент в другой проект, в диалог, открываем свойства объекта - там видим свойство Font1. Изменяем его на какой-нибудь другой шрифт - изменения отображаются в компоненте.
Но что интересно - при этов не вызывается функция свойства Set(). Чтобы это проверить, я поставил в  эту функцию MessageBox() - он никогда не всплывает. (В функции Set свойств других типов сообщение всплывает при изменении свойства в дизайнере). 

Что у меня сделано не правильно, почему не вызывается функция Set? Вот код функции:
Код

void CAFontCtrl::SetFont1(IFontDisp* pVal)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    m_Font1.InitializeFont(&_fontdescHeadingDef[0], pVal);
    OnFontChanged();
    SetModifiedFlag();
    InvalidateControl();
    AfxMessageBox(_T("Font1 Set!"));
}


В аттаче я прикрепил этот тестовый проектик.
Спасибо за внимание!

 


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 4.4.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



file:


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  AFontExample.rar 14,81 Kb


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 7.4.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Немного поэксперементировал. Выяснилось. что обработчик Set все-таки вызывается, если во внешнем коде, использующем данный ActiveX,  принудительно вызвать метод SetFont1();
Однако, если задать шрифт в дизайнере диалога, на котором располагается наш компонент - визуально свойство меняется (объект перериствывается в соответствии с выбранными параметрами шрифта), но ожидаемого MessageBox мы все равно не получаем. 


Странно...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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