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


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

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

Данный раздел содержит следующие подразделы.

  • Использование свойства шрифта ticker

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

Использование свойства шрифта ticker

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

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

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

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

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

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

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

  4. В контекстном меню выберите Добавить а затем нажмите кнопку Добавить свойство.

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

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

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

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

DISP_STOCKPROP_FONT()

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

[id(DISPID_FONT)] IFontDisp*Font;

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

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

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

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

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

  4. В контекстном меню выберите Добавить а затем нажмите кнопку Добавить свойство.

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

  5. В окне Имя свойства, нажмите кнопку подпись.

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

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

DISP_STOCKPROP_CAPTION()

Изменяя функцию OnDraw

Реализация по умолчанию OnDraw использует системный шрифт окон для всего текста, отображаемого в элементе управления.Это означает, что необходимо изменить код 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 была изменена для использования объекта шрифта, любой текст в элементе управления отображается с характеристиками из стандартных свойства шрифта элемента управления.

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

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

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

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

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

ay7tx1x6.collapse_all(ru-ru,VS.110).gifРеализация свойства пользовательского шрифта

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

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

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

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

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

  4. В контекстном меню выберите Добавить а затем нажмите кнопку Добавить свойство.

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

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

  6. Для Тип реализации, нажмите кнопку Методы Get и Set.

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

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

Мастер добавления свойства создает код для добавления настраиваемого свойства HeadingFont к классу CSampleCtrl и файл SAMPLE.IDL.Поскольку HeadingFont тип свойства get и имеет мастера добавления свойства изменяет сопоставление диспетчера типа 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;

ay7tx1x6.collapse_all(ru-ru,VS.110).gifИзменения в код элемента управления

Теперь, когда вы добавили свойство 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 элемента управления, чтобы выбрать предыдущую составе шрифта назад в контекст устройства, добавив следующий линия после того как шрифт будет использоваться.

    pdc->SelectObject(pOldHeadingFont);
    

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

PROPPAGEID(CLSID_CFontPropPage)

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

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

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

ay7tx1x6.collapse_all(ru-ru,VS.110).gifОбработка уведомления шрифта

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

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

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

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

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

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

ay7tx1x6.collapse_all(ru-ru,VS.110).gifРеализация новый интерфейс уведомления шрифта

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

ay7tx1x6.collapse_all(ru-ru,VS.110).gifДобавление к файлу заголовка

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

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

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

ay7tx1x6.collapse_all(ru-ru,VS.110).gifДобавление к файлу реализации

В коде, который инициализирует шрифт заголовка (в конструкторе элемента управления) измените &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