if(m_pctrl) return m_pctrl->m_saItems.GetSize(); return 0; }
4.±àÒ룬н¨Ò»VB¹¤³Ì£¬ÔÚ VBϲâÊÔ£¬¿ÉÒÔ·¢ÏÖûÓÐÎÊÌâ
5.ÔÚActiveX Control ContainerϲâÊÔ£¬ß×£¬³öÎÊÌâÁË£¬Ã»Óз´Ó¦£¬ÎªÊ²Ã´£¿
¸ù¾Ý×îºó¸ø³öµÄ×ÊÁÏÉÏÖеÄÒâ˼£¬´óÖÂÊÇÒòΪÈÝÆ÷¾ÛºÏÁ˿ؼþµÄÔÒò£¨ºÇºÇ£¬ÀÁµÃÈ¥ÏëÁË£¬ÓÐÐËȤµÄ×Ô¼ºË¼¿¼°É£©
6.Ϊ¿Ø¼þÌí¼ÓÒ»Ö»¶ÁÊôÐÔlong CtrlPtr long CToppCtrl::GetCtrlPtr() {
// TODO: Add your property handler here return reinterpret_cast
7.±àÒ룬ÔÚClassWizardµÄAutomationÏ£¬µã»÷Add Class£¬È»ºóÑ¡ÔñFrom a type library£¬ÕÒµ½±àÒëʱΪ¿Ø¼þÉú³ÉµÄ.tlbÎļþ£¬ÕâÀïÓ¦¸ÃÊÇÔÚ\\DebugĿ¼Ï£¬Ñ¡ÔñÕâ¸ötopp.tlb£¬È»ºóֻѡÔñÆäÖеÄ_DTopp£¬µãÈ·¶¨£¬ÕâÑù½«Éú³ÉÒ»¸ö_DToppÀ࣬ºÍÎÒÃÇÉÏÒ»²½ÖеĽéÉܱȽÏһϣ¬¿ÉÒÔ·¢ÏÖ£¬Æäʵ¾ÍÊÇÅÉÉú×ÔÒ»¸öCOleDispatchDriverÀ࣬Ҳ¾ÍÊÇ˵£¬Ö»ÊÇÒ»¸ö°ïÖúÎÒÃǵ÷ÓÿؼþÊôÐԺͷ½·¨µÄÀࣨҲ¾ÍÊÇ˵£¬ÎÒÃÇÉÏÒ»²½ÖÐÆäʵÍêÈ«²»ÓÃ×Ô¼ºÀ´±à´úÂëµÄ£¬ClassWizard¿ÉÒÔΪÎÒÃÇÉú³ÉÒ»¸ö·½±ãµÄ¿É²Ù×÷µÄÀࣺ£©£©¡£
8.ÐÞ¸ÄÊôÐÔÒ³µÄGetCtrlPtrº¯ÊýÈçÏ£º CToppCtrl* CToppPropPage::GetCtrlPtr() {
ULONG ulObjects;
LPDISPATCH* lpObjectArray = GetObjectArray( &ulObjects ); ASSERT( lpObjectArray != NULL ); LPDISPATCH lpdisp = NULL;
if(ulObjects > 0){//ÔÚÕâ¸öº¯ÊýÖУ¬²¢²»Ò»¶¨Äܱ£Ö¤¾ÍÓпؼþ.
lpdisp = lpObjectArray[0];//ÕâÀïÊ¡ÊÂÁË£¬¾Í¼ÙÉèÖ»ÓÐÒ»¸ö¿Ø¼þÁË }
CToppCtrl* pctrl = NULL; if(lpdisp){
pctrl = (CToppCtrl*)CCmdTarget::FromIDispatch(lpdisp); if(!pctrl){
long ControlPointer; _DTopp control(lpdisp);
// GetObjectArray() docs state must not release pointer. control.m_bAutoRelease = FALSE; ControlPointer = control.GetCtrlPtr();
pctrl = reinterpret_cast
//ÕâÀïÆäʵ¿ÉÒÔ¼òµ¥ÓÃÈçÏµķ½·¨µ÷Óã¬Ö®ËùÒÔÓÃÉÏÃæµÄ·½·¨£¬Ö»ÊÇÓÃÀ´½éÉܶøÒÑ
/* long p;
GetPropText(\
pctrl = reinterpret_cast
return pctrl; }
9.±àÒ룬ÔÚActiveX Control ContainerÖвâÊÔ£¬OK£¡ ×¢ÊÍ£ºÕâÀïÓÃClassWizardµ¼ÈëÁËÒ»¸ö¸¨ÖúÀàÊÇÓÃÀ´°ïÖú´ÓIDispatchÖлñµÃ¿Ø¼þµÄCtrlPtrÊôÐÔÖµµÄ£¬Æäʵ²¢²»Ò»¶¨ÐèÒªÕâ¸ö¸¨ÖúÀàµÄ£¬¼ûCToppCtrl* CToppPropPage::GetCtrlPtr()º¯ÊýÖб»×¢Ê͵ôµÄ´úÂ룬֮ËùÒÔÒýÈëÕâ¸ö¸¨ÖúÀ࣬ҲÊǽéÉÜÆð¼û¡£
²Î¿¼×ÊÁÏ:
http://support.microsoft.com/kb/205670/
Ò»°ãÇé¿öÏ£¬ÎÒÃÇÔÚÉè¼Æ×´Ì¬ÏÂÉè¼Æ¿Ø¼þʱ£¬»á´ò¿ªÊôÐÔÒ³£¬È»ºóÊäÈ뼸¸öÖµ£¬À´³õʼ»¯¿Ø¼þ£¬È»ºó¹Ø±ÕÊôÐÔÒ³£¬ÕâÑùÔÚÊôÐÔÒ³ÖÐÊäÈëµÄÖµ¾Í±£´æÆðÀ´ÁË£¬È»ºóÏ´ÎÔÙ´ò¿ªÊôÐÔÒ³£¬ÕâЩֵÓÖ»á¼ÓÔØ½øÀ´£¬Õâ¸ö¹ý³ÌÓиöÊõÓï½Ð³Ö¾Ã»¯¡£
´Ó±íÃæÉÏ¿´£¬¿Ø¼þµÄ³Ö¾Ã»¯ÊÇÔÚÊôÐÔÒ³ÖÐÍê³ÉµÄÄØ£¬µ«ÊÂʵÉϿؼþµÄ³Ö¾Ã»¯ÐèÒª¸÷·½µÄÅäºÏ£¬×îÖÕÊÇÓɿؼþµÄÈÝÆ÷À´Íê³ÉÕæÕýµÄ³Ö¾Ã»¯²Ù×÷£¨±£´æ»ò¼ÓÔØµ½Ä³ÖÖ½éÖÊ£¬Èç´ÅÅÌÎļþµÈ£©¡£
ÊôÐÔÒ³ÔڿؼþµÄ³Ö¾Ã»¯Öв¢Ã»ÓÐ×ö¶àÉٵŤ×÷£¬ËüµÄÖ÷Òª¹¤×÷ÊÇ»ñµÃºÍÉèÖÿؼþµÄÊôÐÔ£¨ÓÐʱºò¿ÉÄÜ»áµ÷ÓÿؼþµÄ·½·¨µÈ£©£¬ÔÚMFCÖУ¬Ò»°ã»ù±¾ÉÏÊÇÔÚDoDataExchangeÖÐÍê³ÉµÄ£¨¼ÓÔØ¿Ø¼þµÄʱºò»áµ÷Ó㬱£´æ¿Ø¼þµÄʱºòÒ²»áµ÷Óã©£¬ÓÐʱºò£¬¿ÉÄÜ»áÔÚÆäËüµØ·½Íê³É£¬Ç°Ã漸²½ÒѾ½²ÁËÔÚÆäËüµØ·½·ÃÎʿؼþÊôÐԵķ½·¨ÁË¡£
¿Ø¼þ×öÁ˴󲿷ֵij־û¯¹¤×÷£¬ÔÚMFCÖУ¬ËüÃÇÊÇÔÚDoPropExchangeÖÐÍê³ÉµÄ¡£MFCÌṩÁËÏÂÃæµÄһЩº¯ÊýÀ´°ïÖúÍê³É³Ö¾Ã»¯¹¤×÷
BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue); BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue, short sDefault);
BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue); BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue, USHORT usDefault);
BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue); BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue, long lDefault);
BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue);
BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue, ULONG ulDefault);
BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue);
BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue, OLE_COLOR clrDefault);
BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue); BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue, BOOL bDefault);
BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue); BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue, const CString& strDefault);
BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue, LPCTSTR lpszDefault);
BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue); BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue, CY cyDefault);
BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue); BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue, float floatDefault);
BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue);
BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue,
double doubleDefault);
BOOL AFX_CDECL PX_Blob(CPropExchange* pPX, LPCTSTR pszPropName, HGLOBAL& hBlob, HGLOBAL hBlobDefault = NULL);
BOOL AFX_CDECL PX_Font(CPropExchange* pPX, LPCTSTR pszPropName, CFontHolder& font, const FONTDESC* pFontDesc = NULL, LPFONTDISP pFontDispAmbient = NULL);
BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName, CPictureHolder& pict);
BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName, CPictureHolder& pict, CPictureHolder& pictDefault);
BOOL AFX_CDECL PX_IUnknown(CPropExchange* pPX, LPCTSTR pszPropName, LPUNKNOWN& pUnk,
REFIID iid, LPUNKNOWN pUnkDefault = NULL);
BOOL AFX_CDECL PX_VBXFontConvert(CPropExchange* pPX, CFontHolder& font); BOOL AFX_CDECL PX_DataPath(CPropExchange* pPX, LPCTSTR pszPropName, CDataPathProperty& dataPathProp, LPCTSTR pszDefault = NULL);
BOOL AFX_CDECL PX_DataPath(CPropExchange* pPX, LPCTSTR pszPropName, CDataPathProperty& dataPathProp, const CString& strDefault);
¿´ÆðÀ´ºÜ¶à£¬Æäʵ×îÖÕ¶¼Êǵ÷Óõ½ÁËCPropExchangeµÄ¼¸¸öº¯Êý
virtual BOOL ExchangeVersion(DWORD& dwVersionLoaded, DWORD dwVersionDefault, BOOL bConvert);
virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp, void* pvProp, const void* pvDefault = NULL) = 0;
virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, HGLOBAL* phBlob, HGLOBAL hBlobDefault = NULL) = 0;
virtual BOOL ExchangeFontProp(LPCTSTR pszPropName, CFontHolder& font, const FONTDESC* pFontDesc,
LPFONTDISP pFontDispAmbient) = 0;
virtual BOOL ExchangePersistentProp(LPCTSTR pszPropName,
LPUNKNOWN* ppUnk, REFIID iid, LPUNKNOWN pUnkDefault) = 0;
»òÕ߸üÈ·ÇÐЩ˵£¬Ö»ÓÐÈý¸ö±È½ÏÖØÒªµÄ£¬ÆäËüµÄÒ²¶¼ÊǼòµ¥µÄµ÷ÓÃÏÂÃæÈý¸öº¯ÊýµÄ ExchangeProp£¬ExchangeBlobProp£¬ExchangePersistentProp
ºÃÏóÓеã˵ԶÁË£¬»Øµ½Ö÷Ì⣺һ°ãµÄÊôÐԳ־û¯£¬¾Í²»¶à˵ÁË£¬ÕâÀïҪ˵µÄÊÇÎÞ·¨ÓÃÆÕͨÊôÐԵķ½·¨À´³Ö¾Ã»¯µÄ¿Ø¼þÖеÄÐÅÏ¢£¬¸ÃÈçºÎ³Ö¾Ã»¯ÄØ¡£
ÎÒÃÇÀ´¿´ÉÏÒ»²½ÖеÄÀý×Ótopp£¬ÎÒÏë³Ö¾Ã»¯ÀïÃæµÄ×Ö·û´®Êý×飬Ôõô°ìÄØ£¿
°ì·¨ÊÇÓеģ¬ÓÃPX_Blob£¬¿ÉÒÔ˵£¬PX_Blob¼¸ºõÄܳ־û¯ÈκÎÄãÏëÒª³Ö¾Ã»¯µÄÐÅÏ¢¡£ Ê×ÏÈ£¬ÎªÁËÄÜ¿´µ½³Ö¾Ã»¯ºóµÄЧ¹û£¬ÎÒÃÇÀ´ÉÔ΢µ÷ÕûһϿؼþ
1.Ìí¼ÓOnDraw´úÂ룬ÒÔÏÔʾһ¸öÒÔColorÊôÐÔΪµ×É«µÄ±³¾°£¬È»ºóÒ»ÐÐÒ»ÐÐÏÔʾËùÓеÄ×Ö·û´®£¬Óм¸¸ö×Ö·û´®¾ÍÏÔʾ¼¸ÐÐ void CToppCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
// TODO: Replace the following code with your own drawing code.
/* pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->Ellipse(rcBounds);*/
pdc->FillRect(&rcBounds, &CBrush(TranslateColor(m_color))); int nhei = 18; int y = 2;
for(int i=0; i CRect rect(rcBounds.left + 4, y+2, rcBounds.right - 4, y + nhei); pdc->FillRect(&rect, &CBrush(RGB(255, 255, 255))); pdc->TextOut(rcBounds.left + 4, y + 2, m_saItems); } } 2.µ÷Õû¼¸¸ö¿Ø¼þµÄÊôÐÔ´úÂ룬ÒÔ±ã¸ü¸ÄÊôÐÔʱ£¬ÄÜ·´Ó¦µ½½çÃæÉÏÀ´£¬Ëµ°×ÁË£¬¾ÍÊǼӼ¸¸öInvaldiateControl() void CToppCtrl::OnColorChanged() { // TODO: Add notification handler code InvalidateControl();