首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

ActiveX 控件中字體屬性的完整實作指南

     編輯:關於VC++

四大應用場景

  1. 庫存字體:直接使用 DISP_STOCKPROP_FONT(),最簡單。
  2. 自訂字體:需自行宣告 CFontHolder、FONTDESC、PX_Font 等。
  3. 多字體:每組字體對應一組 CFontHolder,共用 IFontNotification。
  4. 優化通知:為每字體建立獨立 IPropertyNotifySink 介面,精確針對變更字體區域重繪。

庫存字體:Label.ocx 範例

  • ClassWizard 加入 Font、Caption、ForeColor、BackColor 庫存屬性。
  • OnDraw 中呼叫 SelectStockFont(pDC) 選入字體,DrawText 輸出。
  • 屬性頁加入 CLSID_CFontPropPage、CLSID_CColorPropPage。

自訂字體:Label1.ocx 範例

// .h
protected: CFontHolder m_fontCaption;
// .cpp 建構式
CLabel1Ctrl::CLabel1Ctrl() : m_fontCaption(&m_xFontNotification) {}
// FONTDESC 預設值
static const FONTDESC _fontdescCaption = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE(12), FW_BOLD, ANSI_CHARSET, FALSE, FALSE, FALSE };
// DoPropExchange
PX_Font(pPX, _T("CaptionFont"), m_fontCaption, &_fontdescCaption);
// Get/Set
LPFONTDISP GetCaptionFont() { return m_fontCaption.GetFontDispatch(); }
void SetCaptionFont(LPFONTDISP v) { m_fontCaption.InitializeFont(&_fontdescCaption, v); OnFontChanged(); SetModifiedFlag(); }
// OnDraw
CFont* pOld = SelectFontObject(pDC, m_fontCaption); // 使用自訂字體
// ... DrawText
pDC->SelectObject(pOld);

多字體:LabelEx0.ocx

三組字體(上/中/下標)各自擁有 CFontHolder、FONTDESC、PX_Font、Get/Set,共用 m_xFontNotification。OnDraw 依序 SelectFontObject 並 TextOut。

優化通知:LabelEx.ocx

為每字體建立獨立 IPropertyNotifySink 實作:

// .h
BEGIN_INTERFACE_PART(FontUpNotify, IPropertyNotifySink)
    STDMETHOD(OnChanged)(DISPID); STDMETHOD(OnRequestEdit)(DISPID);
END_INTERFACE_PART(FontUpNotify)
// .cpp
BEGIN_INTERFACE_MAP(CLabelExCtrl, COleControl)
    INTERFACE_PART(CLabelExCtrl, IID_IPropertyNotifySink, FontUpNotify)
    // ... Middle, Down 同理
END_INTERFACE_MAP()
// 實作 OnChanged 呼叫 InvalidateControl()
// 建構式改用獨立通知介面
m_fontUp(&m_xFontUpNotify), m_fontMiddle(&m_xFontMiddleNotify), m_fontDown(&m_xFontDownNotify)

如此可在 OnChanged 中判斷具體哪組字體變更,僅重繪對應區塊,提升效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved