DISP_STOCKPROP_FONT(),最簡單。CFontHolder、FONTDESC、PX_Font 等。CFontHolder,共用 IFontNotification。IPropertyNotifySink 介面,精確針對變更字體區域重繪。OnDraw 中呼叫 SelectStockFont(pDC) 選入字體,DrawText 輸出。CLSID_CFontPropPage、CLSID_CColorPropPage。// .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);
三組字體(上/中/下標)各自擁有 CFontHolder、FONTDESC、PX_Font、Get/Set,共用 m_xFontNotification。OnDraw 依序 SelectFontObject 並 TextOut。
為每字體建立獨立 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 中判斷具體哪組字體變更,僅重繪對應區塊,提升效能。