Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > ActiveX, свойство *IFontDisp, не работает Set()


Автор: Dreamer_0x01 4.4.2008, 15:17
Здравствуйте. Проблема в следующем.
Пишу 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!"));
}


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

 

Автор: Dreamer_0x01 4.4.2008, 15:32
file:

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


Странно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)