Bagikan melalui


Kontrol ActiveX MFC: Menggunakan Font

Jika kontrol ActiveX menampilkan teks, Anda dapat mengizinkan pengguna kontrol untuk mengubah tampilan teks dengan mengubah properti font. Properti font diimplementasikan sebagai objek font dan bisa menjadi salah satu dari dua jenis: stok atau kustom. Properti Font Stok adalah properti font yang telah diisi sebelumnya yang bisa Anda tambahkan menggunakan Panduan Tambahkan Properti. Properti Font Kustom tidak diisi sebelumnya dan pengembang kontrol menentukan perilaku dan penggunaan properti.

Artikel ini membahas topik berikut ini:

Menggunakan Properti Font Stok

Properti Font Stok telah diisi sebelumnya oleh kelas COleControl. Selain itu, halaman properti Font standar juga tersedia, memungkinkan pengguna untuk mengubah berbagai atribut objek font, seperti nama, ukuran, dan gayanya.

Akses objek font melalui fungsi GetFont, SetFont, dan InternalGetFont dari COleControl. Pengguna kontrol akan mengakses objek font melalui GetFont fungsi dan SetFont dengan cara yang sama seperti properti Get/Set lainnya. Saat akses ke objek font diperlukan dari dalam kontrol, gunakan InternalGetFont fungsi .

Seperti yang dibahas dalam Kontrol ActiveX MFC: Properti, menambahkan properti stok mudah dengan Wizard Tambahkan Properti. Anda memilih properti Font, dan Wizard Tambahkan Properti secara otomatis menyisipkan entri Font stok ke dalam peta pengiriman kontrol.

Untuk menambahkan properti Font stok menggunakan Wizard Tambahkan Properti

  1. Muat proyek kontrol Anda.

  2. Di Tampilan Kelas, perluas node pustaka kontrol Anda.

  3. Klik kanan node antarmuka untuk kontrol Anda (node kedua dari node pustaka) untuk membuka menu pintasan.

  4. Dari menu pintasan, klik Tambahkan lalu klik Tambahkan Properti.

    Langkah ini akan membuka Wizard Tambahkan Properti.

  5. Dalam kotak Nama Properti, klik Font.

  6. Klik Selesai.

Wizard Tambahkan Properti menambahkan baris berikut ke peta pengiriman kontrol, yang terletak di file implementasi kelas kontrol:

DISP_STOCKPROP_FONT()

Selain itu, Wizard Tambahkan Properti menambahkan baris berikut ke kontrol . File IDL:

[id(DISPID_FONT)] IFontDisp* Font;

Properti Keterangan stok adalah contoh properti teks yang dapat digambar menggunakan informasi properti Font stok. Menambahkan properti Keterangan stok ke kontrol menggunakan langkah-langkah yang mirip dengan yang digunakan untuk properti Font stok.

Untuk menambahkan properti Keterangan stok menggunakan Wizard Tambahkan Properti

  1. Muat proyek kontrol Anda.

  2. Di Tampilan Kelas, perluas node pustaka kontrol Anda.

  3. Klik kanan node antarmuka untuk kontrol Anda (node kedua dari node pustaka) untuk membuka menu pintasan.

  4. Dari menu pintasan, klik Tambahkan lalu klik Tambahkan Properti.

    Langkah ini akan membuka Wizard Tambahkan Properti.

  5. Dalam kotak Nama Properti, klik Keterangan.

  6. Klik Selesai.

Wizard Tambahkan Properti menambahkan baris berikut ke peta pengiriman kontrol, yang terletak di file implementasi kelas kontrol:

DISP_STOCKPROP_CAPTION()

Memodifikasi Fungsi OnDraw

Implementasi OnDraw default menggunakan font sistem Windows untuk semua teks yang ditampilkan dalam kontrol. Ini berarti Anda harus mengubah OnDraw kode dengan memilih objek font ke dalam konteks perangkat. Untuk melakukan ini, panggil COleControl::SelectStockFont dan berikan konteks perangkat kontrol, seperti yang ditunjukkan dalam contoh berikut:

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 Setelah fungsi dimodifikasi untuk menggunakan objek font, teks apa pun dalam kontrol ditampilkan dengan karakteristik dari properti Font saham kontrol.

Menggunakan Properti Font Kustom di Kontrol Anda

Selain properti Font stok, kontrol ActiveX dapat memiliki properti Font kustom. Untuk menambahkan properti font kustom, Anda harus:

Menerapkan Properti Font Kustom

Untuk menerapkan properti Font kustom, Anda menggunakan Wizard Tambahkan Properti untuk menambahkan properti lalu membuat beberapa modifikasi ke kode. Bagian berikut ini menjelaskan cara menambahkan properti kustom HeadingFont ke kontrol Sampel.

Untuk menambahkan properti Font kustom menggunakan Panduan Tambahkan Properti
  1. Muat proyek kontrol Anda.

  2. Di Tampilan Kelas, perluas node pustaka kontrol Anda.

  3. Klik kanan node antarmuka untuk kontrol Anda (node kedua dari node pustaka) untuk membuka menu pintasan.

  4. Dari menu pintasan, klik Tambahkan lalu klik Tambahkan Properti.

    Langkah ini akan membuka Wizard Tambahkan Properti.

  5. Dalam kotak Nama Properti, ketik nama untuk properti tersebut. Untuk contoh ini, gunakan HeadingFont.

  6. Untuk Jenis Implementasi, klik Dapatkan/Atur Metode.

  7. Dalam kotak Jenis Properti, pilih IDispatch* untuk jenis properti.

  8. Klik Selesai.

Wizard Tambahkan Properti membuat kode untuk menambahkan HeadingFont properti kustom ke CSampleCtrl kelas dan SAMPEL. File IDL. Karena HeadingFont merupakan jenis properti Get/Set, Wizard Tambahkan Properti memodifikasi CSampleCtrl peta pengiriman kelas untuk menyertakan entri makro DISP_PROPERTY_EX_IDDISP_PROPERTY_EX :

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

Makro DISP_PROPERTY_EX mengaitkan HeadingFont nama properti dengan metode Dapatkan dan Atur kelas yang CSampleCtrl sesuai, GetHeadingFont dan SetHeadingFont. Jenis nilai properti juga ditentukan; dalam hal ini, VT_FONT.

Wizard Tambahkan Properti juga menambahkan deklarasi dalam file header kontrol (. H) untuk GetHeadingFont fungsi dan SetHeadingFont dan menambahkan templat fungsinya dalam file implementasi kontrol (. 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();
}

Terakhir, Wizard Tambahkan Properti memodifikasi kontrol . File IDL dengan menambahkan entri untuk HeadingFont properti :

[id(1)] IDispatch* HeadingFont;

Modifikasi pada Kode Kontrol

Sekarang setelah Anda menambahkan properti ke HeadingFont kontrol, Anda harus membuat beberapa perubahan pada header kontrol dan file implementasi untuk sepenuhnya mendukung properti baru.

Dalam file header kontrol (. H), tambahkan deklarasi berikut dari variabel anggota yang dilindungi:

protected:
   CFontHolder m_fontHeading;

Dalam file implementasi kontrol (. CPP), lakukan hal berikut:

  • Inisialisasi m_fontHeading di konstruktor kontrol.

    CMyAxFontCtrl::CMyAxFontCtrl()
       : m_fontHeading(&m_xFontNotification)
    {
       InitializeIIDs(&IID_DNVC_MFC_AxFont, &IID_DNVC_MFC_AxFontEvents);
    }
    
  • Deklarasikan struktur FONTDESC statis yang berisi atribut default font.

    static const FONTDESC _fontdescHeading =
    { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE(12), FW_BOLD,
      ANSI_CHARSET, FALSE, FALSE, FALSE };
    
  • Dalam fungsi anggota kontrol DoPropExchange , tambahkan panggilan ke PX_Font fungsi . Ini menyediakan inisialisasi dan persistensi untuk properti Font kustom Anda.

    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);
    }
    
  • Selesaikan penerapan fungsi anggota kontrol GetHeadingFont .

    IDispatch* CMyAxFontCtrl::GetHeadingFont(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       return m_fontHeading.GetFontDispatch();
    }
    
  • Selesaikan penerapan fungsi anggota kontrol SetHeadingFont .

    void CMyAxFontCtrl::SetHeadingFont(IDispatch* pVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       m_fontHeading.InitializeFont(&_fontdescHeading, pVal);
       OnFontChanged();    //notify any changes
       SetModifiedFlag();
    }
    
  • Ubah fungsi anggota kontrol OnDraw untuk menentukan variabel untuk menahan font yang dipilih sebelumnya.

    CFont* pOldHeadingFont;
    
  • Ubah fungsi anggota kontrol OnDraw untuk memilih font kustom ke dalam konteks perangkat dengan menambahkan baris berikut di mana pun font akan digunakan.

    pOldHeadingFont = SelectFontObject(pdc, m_fontHeading);
    
  • Ubah fungsi anggota kontrol OnDraw untuk memilih font sebelumnya kembali ke konteks perangkat dengan menambahkan baris berikut setelah font digunakan.

    pdc->SelectObject(pOldHeadingFont);
    

Setelah properti Font kustom diimplementasikan, halaman properti Font standar harus diimplementasikan, memungkinkan pengguna kontrol untuk mengubah font kontrol saat ini. Untuk menambahkan ID halaman properti untuk halaman properti Font standar, sisipkan baris berikut setelah makro BEGIN_PROPPAGEIDS:

PROPPAGEID(CLSID_CFontPropPage)

Anda juga harus menaikkan parameter hitungan makro BEGIN_PROPPAGEIDS Anda satu per satu. Baris berikut mengilustrasikan hal ini:

BEGIN_PROPPAGEIDS(CMyAxFontCtrl, 2)

Setelah perubahan ini dilakukan, bangun kembali seluruh proyek untuk menggabungkan fungsionalitas tambahan.

Memproses Pemberitahuan Font

Dalam kebanyakan kasus, kontrol perlu mengetahui kapan karakteristik objek font telah dimodifikasi. Setiap objek font mampu memberikan pemberitahuan ketika berubah dengan memanggil fungsi IFontNotification anggota antarmuka, yang diimplementasikan oleh COleControl.

Jika kontrol menggunakan properti Font stok, pemberitahuannya ditangani oleh OnFontChanged fungsi anggota .COleControl Saat menambahkan properti font kustom, Anda dapat membuatnya menggunakan implementasi yang sama. Dalam contoh di bagian sebelumnya, ini dicapai dengan meneruskan &m_xFontNotification saat menginisialisasi variabel anggota m_fontHeading .

Implementing multiple font object interfaces.
Menerapkan Beberapa Antarmuka Objek Font

Garis padat pada gambar di atas menunjukkan bahwa kedua objek font menggunakan implementasi yang sama dari IFontNotification. Ini dapat menyebabkan masalah jika Anda ingin membedakan font mana yang berubah.

Salah satu cara untuk membedakan antara pemberitahuan objek font kontrol adalah dengan membuat implementasi terpisah dari IFontNotification antarmuka untuk setiap objek font dalam kontrol. Teknik ini memungkinkan Anda untuk mengoptimalkan kode gambar Anda dengan memperbarui hanya string, atau string, yang menggunakan font yang baru saja dimodifikasi. Bagian berikut menunjukkan langkah-langkah yang diperlukan untuk menerapkan antarmuka pemberitahuan terpisah untuk properti Font kedua. Properti font kedua diasumsikan sebagai HeadingFont properti yang ditambahkan di bagian sebelumnya.

Menerapkan Antarmuka Pemberitahuan Font Baru

Untuk membedakan antara pemberitahuan dua font atau lebih, antarmuka pemberitahuan baru harus diimplementasikan untuk setiap font yang digunakan dalam kontrol. Bagian berikut menjelaskan cara menerapkan antarmuka pemberitahuan font baru dengan memodifikasi header kontrol dan file implementasi.

Penambahan ke File Header

Dalam file header kontrol (. H), tambahkan baris berikut ke deklarasi kelas:

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

Ini menciptakan implementasi antarmuka yang IPropertyNotifySink disebut HeadingFontNotify. Antarmuka baru ini berisi metode yang disebut OnChanged.

Penambahan ke File Implementasi

Dalam kode yang menginisialisasi font judul (di konstruktor kontrol), ubah &m_xFontNotification ke &m_xHeadingFontNotify. Tambahkan kode berikut:

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;
}

Metode AddRef dan Release dalam IPropertyNotifySink antarmuka melacak jumlah referensi untuk objek kontrol ActiveX. Saat kontrol mendapatkan akses ke penunjuk antarmuka, kontrol memanggil AddRef untuk menaikkan jumlah referensi. Ketika kontrol selesai dengan pointer, kontrol memanggil Release, dengan cara yang sama yang GlobalFree mungkin dipanggil untuk membebaskan blok memori global. Ketika jumlah referensi untuk antarmuka ini masuk ke nol, implementasi antarmuka dapat dibebaskan. Dalam contoh ini, QueryInterface fungsi mengembalikan penunjuk ke IPropertyNotifySink antarmuka pada objek tertentu. Fungsi ini memungkinkan kontrol ActiveX untuk mengkueri objek untuk menentukan antarmuka apa yang didukungnya.

Setelah perubahan ini dilakukan pada proyek Anda, bangun kembali proyek dan gunakan Kontainer Uji untuk menguji antarmuka. Lihat Menguji Properti dan Peristiwa dengan Kontainer Pengujian untuk informasi tentang cara mengakses kontainer pengujian.

Baca juga

Kontrol ActiveX MFC
Kontrol ActiveX MFC: Menggunakan Gambar dalam Kontrol ActiveX
Kontrol ActiveX MFC: Menggunakan Halaman Properti Stok