Поделиться через


Элементы управления ActiveX в MFC. Использование шрифтов

Если в элемент управления ActiveX отображает текст, можно разрешить пользователю элемента управления, чтобы изменить внешний вид текста, изменив свойство шрифта. Свойства шрифта реализуются как объекты шрифтов и может быть одним из 2 типов: биржевая или пользовательский. Свойств font preimplemented свойства шрифта, которые можно добавить с помощью мастера добавления свойства. Свойства пользовательского preimplemented шрифта и разработчик элемента управления определяет расширение функциональности и потребление свойства.

Этот раздел охватывает следующее:

  • С помощью свойства font

  • Использование пользовательского свойства шрифта в элементе управления

С помощью свойства font

Свойств font preimplemented классом COleControl. Кроме того, страница стандартных свойств font доступна также, что пользователю изменять различные атрибуты объекта шрифта, такие как имя, размер и стиль.

Чтобы получить объект шрифта посредством GetFont, SetFont и функцию InternalGetFontCOleControl. Пользователь элемента управления к объекту через шрифта GetFont и функции SetFont точно так же, как и любой другой получает или задает свойство. Если доступ к объекту требуется шрифта из элемента управления, используйте функцию InternalGetFont.

Как описано в разделе Элементы управления ActiveX MFC. Свойства, чтобы добавить стандартные свойства делать с Мастер добавления свойства. Выбрано свойство шрифта и мастера добавления свойства автоматически вставляет запись font в схему подготовки к отправке элемента управления.

Добавление свойства font с помощью мастера добавления свойства.

  1. Загрузите проект элемента управления.

  2. В представлении классов разверните узел библиотеки элемента управления.

  3. Щелкните правой кнопкой мыши узел интерфейса для элемента управления (второго узла узла библиотеки), чтобы открыть контекстное меню.

  4. В контекстном меню щелкните Добавить, а затем щелкните Добавить свойство.

    Это будет открыт мастер добавления свойства.

  5. В поле Имя свойства, нажмите Шрифт.

  6. Нажмите кнопку Готово.

Мастера добавления свойства добавляет в следующей линия со схемой подготовки к отправке элемента управления, находящуюся в файле реализации класса элемента управления.

DISP_STOCKPROP_FONT()

Кроме того, мастер добавления свойства добавляет в следующей линию в файл элемента управления .IDL:

[id(DISPID_FONT)] IFontDisp*Font;

Свойство заголовка пример биржевой свойства текста, можно создать с помощью данных свойств font. Добавление свойства заголовка биржевой к элементу управления с помощью шагов аналогично, используемым для свойств font.

Добавление свойства заголовка хранения с помощью мастера добавления свойства.

  1. Загрузите проект элемента управления.

  2. В представлении классов разверните узел библиотеки элемента управления.

  3. Щелкните правой кнопкой мыши узел интерфейса для элемента управления (второго узла узла библиотеки), чтобы открыть контекстное меню.

  4. В контекстном меню щелкните Добавить, а затем щелкните Добавить свойство.

    Это будет открыт мастер добавления свойства.

  5. В поле Имя свойства, нажмите Заголовок.

  6. Нажмите кнопку Готово.

Мастера добавления свойства добавляет в следующей линия со схемой подготовки к отправке элемента управления, находящуюся в файле реализации класса элемента управления.

DISP_STOCKPROP_CAPTION()

Изменить функции OnDraw

Реализация по умолчанию OnDraw используется системный шрифт Windows для всего текста, отображаемого в элементе управления. Это означает, что необходимо изменить код OnDraw, выбрав объект шрифта в контексте устройства. Для этого необходимо вызвать метод COleControl::SelectStockFont и передает контекст устройства элемента управления, как показано в следующем примере:

CFont* pOldFont;
TEXTMETRIC tm;
const CString& strCaption = InternalGetText();

pOldFont = SelectStockFont(pdc);
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH )GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
pdc->GetTextMetrics(&tm);
pdc->SetTextAlign(TA_CENTER | TA_TOP);
pdc->ExtTextOut((rcBounds.left + rcBounds.right) / 2, 
   (rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
   ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(), NULL);

pdc->SelectObject(pOldFont);

После того как функция OnDraw была изменена для использования объекта шрифта, любой текст в элементе управления отображается с характеристиками из свойств font элемента управления.

Использование пользовательского свойства шрифта в элементе управления

Помимо свойств font, элемент управления ActiveX может иметь свойства пользовательского шрифта. Добавление пользовательского свойства шрифта необходимо:

  • Использование мастера добавления свойства для реализации пользовательского свойства шрифта.

  • Обрабатывать уведомления шрифта.

  • Реализация новый интерфейс уведомления шрифта.

Реализация пользовательского свойства шрифта

Для реализации пользовательского свойства шрифта используется мастер добавления свойства для добавления свойств и затем внести некоторые изменения в код. В следующих разделах описывается, как добавить пользовательское свойство HeadingFont в элемент управления примера.

Добавление пользовательского свойства шрифта с помощью мастера добавления свойства.

  1. Загрузите проект элемента управления.

  2. В представлении классов разверните узел библиотеки элемента управления.

  3. Щелкните правой кнопкой мыши узел интерфейса для элемента управления (второго узла узла библиотеки), чтобы открыть контекстное меню.

  4. В контекстном меню щелкните Добавить, а затем щелкните Добавить свойство.

    Это будет открыт мастер добавления свойства.

  5. В поле Имя свойства введите имя для свойства. В данном примере используйте HeadingFont.

  6. В поле Тип реализации, щелкните Get/set методы.

  7. В поле свойство Type, выберите IDispatch* для типа свойства.

  8. Нажмите кнопку Готово.

Мастера добавления свойства создает код для добавления пользовательского свойства HeadingFont в класс CSampleCtrl и файл SAMPLE.IDL. Поскольку HeadingFont тип свойства get и set, мастера добавления свойства изменяет схему подготовки к отправке класса CSampleCtrl, чтобы включить запись макроса DISP_PROPERTY_EX_IDDISP_PROPERTY_EX:

DISP_PROPERTY_EX_ID(CMyAxFontCtrl, "HeadingFont", dispidHeadingFont, 
   GetHeadingFont, SetHeadingFont, VT_DISPATCH)

Макрос DISP_PROPERTY_EX сопоставляет имя свойства HeadingFont с соответствующим классом CSampleCtrl методы get и set, GetHeadingFont и SetHeadingFont. Тип значения свойств также определен; в данном случае VT_FONT.

Мастера добавления свойства также добавляет объявление в файле заголовка элемента управления (. H) для функций GetHeadingFont и SetHeadingFont и добавляет их шаблоны функции в файле реализации элемента управления (CPP).

IDispatch* CWizardGenCtrl::GetHeadingFont(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here 

   return NULL;
}

void CWizardGenCtrl::SetHeadingFont(IDispatch* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Наконец, мастера добавления свойства изменяет файл элемента управления .IDL путем добавления запись для свойства HeadingFont:

[id(1)] IDispatch* HeadingFont;

Изменения в код элемента управления

После добавления свойства HeadingFont к элементу управления, необходимо внести некоторые изменения в качестве заголовка и файлы реализации элемента управления для полной поддержки новое свойство.

В файле заголовка элемента управления (. H) добавьте следующее объявление защищенного переменной-члена:

protected:
   CFontHolder m_fontHeading;

В файле реализации элемента управления (CPP), выполните следующие действия:

  • Инициализация m_fontHeading в конструкторе элемента управления.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
        InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Объявите статическую структуры FONTDESC, содержащими атрибуты по умолчанию шрифта.

    static const FONTDESC _fontdescHeading =
      { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_BOLD, 
        ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • В функции-члене DoPropExchange элемента управления добавьте вызов функции PX_Font. Это обеспечивает инициализацию и сохранение для пользовательского свойства шрифта.

    void CMyAxFontCtrl::DoPropExchange(CPropExchange* pPX)
    {
        ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
        COleControl::DoPropExchange(pPX);
    
       // [...other PX_ function calls...]
       PX_Font(pPX, _T("HeadingFont"), m_fontHeading, &_fontdescHeading);
    }
    
  • Завершение реализации функции-члена GetHeadingFont элемента управления.

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Завершение реализации функции-члена SetHeadingFont элемента управления.

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Измените функцию-член OnDraw элемента управления, чтобы определить переменную для хранения ранее выбранный шрифт.

    CFont* pOldHeadingFont;
    
  • Измените функцию-член OnDraw элемента управления, чтобы выделить шрифт в пользовательский контекст устройства, добавив в следующей линия везде, где шрифт будет использоваться.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Измените функцию-член OnDraw элемента управления, чтобы выбрать предыдущую back шрифта в контексте устройства, добавив в следующей линия после того, как шрифт использовался.

    pdc->SelectObject(pOldHeadingFont);
    

После того как свойство пользовательского было реализовано шрифтов, страница стандартных свойств font должна быть реализована, что пользователи элемента управления, чтобы изменить шрифт текущего элемента управления. Чтобы добавить идентификатор страницы свойств для страницы свойств стандартного шрифта, добавьте следующую линии после макроса BEGIN_PROPPAGEIDS:

PROPPAGEID(CLSID_CFontPropPage)

Также необходимо увеличить значение параметра числа выполнения макроса BEGIN_PROPPAGEIDS одним. Это показано в следующей линия:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

После того, как эти изменения были внесены следует перестроить весь проект включение дополнительную функциональность.

Обрабатывать уведомления шрифта

В большинстве случаев элемент управления должен знать, когда были изменены характеристики объекта шрифта. Каждый объект шрифта поддерживает предоставление уведомлений при изменении путем вызова функции-члены интерфейса IFontNotification, реализованный COleControl.

Если элемент управления использует свойство font, его уведомления обрабатываются функцией-членом OnFontChangedCOleControl. При добавлении пользовательского свойства шрифта, можно получить их использовать одну и ту же реализацию. В примере выше, это выполнялось путем передачи &m_xFontNotification при инициализации переменную-член m_fontHeading.

Реализация несколько интерфейсов объекта шрифта

Реализация интерфейсов нескольких объектов шрифта

В приведенном выше рисунке сплошные линии показывают, что оба объекта шрифта используют одну и ту же реализацию IFontNotification. Это может вызвать проблемы при необходимости различаются, шрифт был изменен.

Один из способов различать уведомлениями объекта шрифта элемента управления создать отдельный реализация интерфейса IFontNotification для каждого объекта шрифта в элементе управления. Этот метод позволяет получить оптимизировать код рисования, обновление только строку или строки, которые используют измененный недавно шрифт. Следующие разделы описывают шаги, которые ввод отдельно интерфейсы уведомлений второго свойства шрифта. Предполагается, что будет второе свойство шрифта свойством HeadingFont, который был добавлен в предыдущем разделе.

Реализация новый интерфейс уведомления шрифта

Для различения уведомлениями двух или нескольких шрифтов новый интерфейс уведомления должен быть реализован для каждого шрифта, используемого в элементе управления. В следующих разделах описано, как реализовать новый интерфейс уведомления шрифта, изменив заголовок и файлами реализации элемента управления.

Добавления в файл заголовка

В файле заголовка элемента управления (. H) добавьте следующие линии в объявление класса:

protected:
   BEGIN_INTERFACE_PART(HeadingFontNotify, IPropertyNotifySink)
   INIT_INTERFACE_PART(CMyAxFontCtrl, HeadingFontNotify)
      STDMETHOD(OnRequestEdit)(DISPID);
      STDMETHOD(OnChanged)(DISPID);
   END_INTERFACE_PART(HeadingFontNotify)

Это создает для него реализация интерфейса IPropertyNotifySinkHeadingFontNotify. Этот новый интерфейс содержит метод с именем OnChanged.

Дополнения к файлу реализации

В коде, который инициализирует шрифт заголовка (в конструкторе элемента управления) измените &m_xFontNotification в &m_xHeadingFontNotify. Затем добавьте следующий код:

STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::AddRef()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   return 1;
}
STDMETHODIMP_(ULONG) CMyAxFontCtrl::XHeadingFontNotify::Release()
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   return 0;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::QueryInterface(REFIID iid, LPVOID FAR* ppvObj)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   if( IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IPropertyNotifySink))
   {
      *ppvObj= this;
      AddRef();
      return NOERROR;
   }
   return ResultFromScode(E_NOINTERFACE);
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnChanged(DISPID)
{
   METHOD_MANAGE_STATE(CMyAxFontCtrl, HeadingFontNotify)
   pThis->InvalidateControl();
   return NOERROR;
}

STDMETHODIMP CMyAxFontCtrl::XHeadingFontNotify::OnRequestEdit(DISPID)
{
   return NOERROR;
}

Методы AddRef и Release в интерфейсе IPropertyNotifySink отслеживают счетчик ссылок для объекта элемента управления ActiveX. Если элемент управления получает доступ к указателю интерфейса, элемент управления вызывает AddRef увеличивающий счетчик ссылок. Когда элемент управления завершил работу с указателем, он вызывает Release, во многом аналогично тому, как GlobalFree можно вызывать для освобождения глобальный блок памяти. Когда число ссылок для данного интерфейса перейдите к нулю, реализацию интерфейса можно освободить. В этом примере функция QueryInterface возвращает указатель на интерфейс IPropertyNotifySink в указанном объекте. Эта функция позволяет элемент управления ActiveX для запроса к объекту задать интерфейсы, которые она поддерживает.

После того как были внесены следующие изменения в проект, перестройте проект и использовать тестовый контейнер для выполнения интерфейс. Сведения о доступе к тестовому контейнеру см. в разделе Тестирование свойств и событий при помощи тестового контейнера.

См. также

Ссылки

Элементы управления ActiveX в MFC. Использование изображений в элементе управления ActiveX

Элементы управления ActiveX в MFC. Использование стандартных страниц свойств

Основные понятия

Элементы управления ActiveX MFC