m_hMyWnd = pwnd->Create();
//½¨Á¢¹¤×÷Ïß³Ì DWORD dwID;
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)MyThread, this, NULL, &dwID); }
6.¶¨ÒåTrigger·½·¨
void CTFireCtrl::Trigger(LPCTSTR strParam) {
// TODO: Add your dispatch handler code here m_strParam = strParam; if(m_hEvent){
SetEvent(m_hEvent); } }
7.¶¨ÒåEnd·½·¨ void CTFireCtrl::End() {
// TODO: Add your dispatch handler code here m_bEnd = TRUE; Sleep(100);
CloseHandle(m_hEvent); m_hEvent = NULL;
::DestroyWindow(m_hMyWnd); }
8.Ó¦¸ÃÊÇ¿ÉÒÔÁË£¬±àÒëһϣ¬¿ªÊ¼VB¹¤³Ì
ÔÚVBµÄForm1ÖмÓÒ»¿Ø¼þTFire1£¬Ò»°´Å¥Command1 ´úÂëÈçÏ£º
Private Sub Command1_Click() TFire1.Trigger \End Sub
Private Sub Form_Load() TFire1.Start End Sub
Private Sub Form_Unload(Cancel As Integer) TFire1.End End Sub
Private Sub TFire1_ThreadEvent(ByVal strEvent As String) MsgBox strEvent End Sub
µ÷ÊÔÔËÐУ¬¾Í¿ÉÒÔÁË
¹ØÓÚÊôÐÔÒ³£¬ÕâÀïÏÈ·ÒëmsdnÉÏÒ»¶Î¹ØÓÚÊôÐÔÒ³µÄ½éÉÜ¡£ Óû§Í¨¹ýÊôÐÔÒ³À´²Ù×÷¿Ø¼þµÄÊôÐÔ£¬Óû§¿ÉÒÔÉèÖÃÒ»¸ö»ò¶à¸öÊôÐÔÒ³£¬Ã¿¸öÊôÐÔÒ³ÉÏ¿ÉÒÔÏÔʾ¿Ø¼þµÄijЩÊôÐÔ¡£ÕâЩÊôÐԼȿÉÒÔÀ´×ÔÒ»¸ö¿Ø¼þ£¬Ò²¿ÉÒÔÀ´×Ô¶à¸ö¿Ø¼þ£¬Ò²¾ÍÊÇ˵һ¸öÊôÐÔÒ³ÉÏ¿ÉÒÔÏÔʾ¶à¸ö¿Ø¼þµÄÊôÐÔ¡£
ÿ¸öActiveX ¿Ø¼þÊôÐÔÒ³¶¼ÊÇÒ»¸ö½ø³ÌÄÚ¶ÔÏó£¬ÓµÓÐËü×Ô¼ºµÄCLSID£¬Ã¿¸öÊôÐÔÒ³¾ùʵÏÖÁËIPropertyPage½Ó¿Ú¡£ IPropertyPage::SetObjectsÊÇÓÃÀ´½«¿Ø¼þ¶ÔÏóµÄ½Ó¿ÚÖ¸Õë(IUnknown)´«µÝ¸øÊôÐÔÒ³µÄ¡£
MFCµÄ COlePropertyPageҲʵÏÖÁËIPropertyPage½Ó¿Ú£¬Ëü½«¿Ø¼þ¶ÔÏóÖ¸ÕëµÄ±£´æÔÚÒ»¸öIDispatch½Ó¿ÚÖ¸ÕëµÄÊý×éÖС£¸ÃÊý×é¿ÉÒÔͨ¹ýCOlePropertyPage::GetObjectArray()·ÃÎÊ£¬ÕâÑù¾Í¿ÉÒÔͨ¹ýIDispatch½Ó¿ÚÀ´·ÃÎʿؼþµÄÊôÐÔÁË£¬ÁîÈËÍ·ÌÛµÄÊÇͨ¹ýIDispatchÀ´·ÃÎʿؼþÊôÐÔ£¬ÊµÔÚÓй»Âé·³£¬MFCÌṩÁËCOleDispatchDriverÀ´°ïÖú·ÃÎÊ£¬¿Éϧ£¬Ò²½ö½öÊÇÄÜÉÔ΢¼ò»¯Ò»Ð©²Ù×÷¶øÒÑ¡£Æäʵ£¬MFCΪÁË×Ô¼º·½±ã£¬ÔÚCOlePropertyPage»¹ÌṩÁËÒ»×麯ÊýÀ´°ïÖú·ÃÎʿؼþµÄÊôÐÔ£¬Ö»²»¹ýÕâ×麯Êýû¹«²¼ÔÚmsdnÖаÕÁË£¬ÏÂÃæÊÇÕâ×麯ÊýµÄÉùÃ÷£º // DDP_ property get/set helper routines
BOOL SetPropText(LPCTSTR pszPropName, BYTE &Value); BOOL GetPropText(LPCTSTR pszPropName, BYTE* pValue); BOOL SetPropText(LPCTSTR pszPropName, short &Value); BOOL GetPropText(LPCTSTR pszPropName, short* pValue); BOOL SetPropText(LPCTSTR pszPropName, int &Value); BOOL GetPropText(LPCTSTR pszPropName, int* pValue); BOOL SetPropText(LPCTSTR pszPropName, UINT &Value); BOOL GetPropText(LPCTSTR pszPropName, UINT* pValue); BOOL SetPropText(LPCTSTR pszPropName, long &Value); BOOL GetPropText(LPCTSTR pszPropName, long* pValue); BOOL SetPropText(LPCTSTR pszPropName, DWORD &Value); BOOL GetPropText(LPCTSTR pszPropName, DWORD* pValue); BOOL SetPropText(LPCTSTR pszPropName, CString &Value); BOOL GetPropText(LPCTSTR pszPropName, CString* pValue); BOOL SetPropText(LPCTSTR pszPropName, float &Value); BOOL GetPropText(LPCTSTR pszPropName, float* pValue); BOOL SetPropText(LPCTSTR pszPropName, double &Value); BOOL GetPropText(LPCTSTR pszPropName, double* pValue); BOOL SetPropCheck(LPCTSTR pszPropName, int Value); BOOL GetPropCheck(LPCTSTR pszPropName, int* pValue); BOOL SetPropRadio(LPCTSTR pszPropName, int Value); BOOL GetPropRadio(LPCTSTR pszPropName, int* pValue); BOOL SetPropIndex(LPCTSTR pszPropName, int Value); BOOL GetPropIndex(LPCTSTR pszPropName, int* pValue);
ÔÚÒ»°ãÇé¿öÏ£¬ÎÒÃDz¢²»ÓÃÖ±½Ó·ÃÎʿؼþµÄÊôÐÔ£¬Ò»Çж¼ÓÉ¿ò¼Ü°ïÖú×öÁË£¨¿ò¼ÜÀûÓÃÁËDoDateExchange£¬DoDataExchange ÓÖÓÃÁËÉÏÃæµÄSetPropText/GetPropTextº¯Êý×飩¡£
µ«ÊÇ£¬ÓÐʱºò£¬ÎÒÃÇÏ£ÍûÄÜÔڿؼþÖÐÖ±½Ó·ÃÎʿؼþµÄÊôÐԺͷ½·¨¡£¶ÔÓÚÆÕͨÊôÐÔ£¬Ê¹ÓÃÉÏÃæµÄGetPropTextºÍSetPropText×ãÒÔÂú×ãÐèÒª£¬µ«ÊǶÔÓÚ´ø²ÎÊýµÄÊôÐԺͷ½·¨£¬¾ÍÖ»ºÃÀÏÀÏʵʵµÄÓà COleDispatchDriverÀ´InvokeHelperÁË¡£ ÏÂÃæÊÇÔÚÊôÐÔÒ³ÖзÃÎʿؼþÊôÐԺͷ½·¨µÄÀý×Ótoop.
1.¿Ø¼þÖÐÉèÖÃÁËÒ»¸ö×Ö·û´®Êý×éCStringArray m_saItems£¬ÌṩÁË·½·¨long Add(LPCTSTR strItem)ºÍget/set methodÊôÐÔBSTR Item(long lItem)À´·ÃÎÊÊý×éÖеÄijÏî×Ö·û´®£¬ÁíÍ⻹ÓÐÒ»¸öÖ»¶ÁÊôÐÔlong Count£¨ÔÚÌí¼ÓÊôÐÔµÄÏòµ¼ÖУ¬ÉèÖÃΪget/set methodsÀàÐ͵ÄÊôÐÔ£¬²¢È¥µôSetCount¼´ÊÇÉèÖÃΪֻ¶ÁÊôÐÔÁË£©
2.¿Ø¼þÁíÍâÉèÖÃÁËÒ»member variableÊôÐÔOLE_COLOR Color
3.ÊôÐԺͷ½·¨µÄʵÏÖÈçÏ£º
void CToppCtrl::OnColorChanged() {
// TODO: Add notification handler code SetModifiedFlag(); }
long CToppCtrl::Add(LPCTSTR strItem) {
// TODO: Add your dispatch handler code here return m_saItems.Add(strItem); return 0; }
BSTR CToppCtrl::GetItem(long nItem) {
CString strResult;
// TODO: Add your property handler here
if(nItem >= 0 && nItem < m_saItems.GetSize()){ strResult = m_saItems[nItem]; }
return strResult.AllocSysString(); }
void CToppCtrl::SetItem(long nItem, LPCTSTR lpszNewValue) {
// TODO: Add your property handler here
if(nItem >= 0 && nItem < m_saItems.GetSize()){ m_saItems[nItem] = lpszNewValue; }
SetModifiedFlag(); }
long CToppCtrl::GetCount() {
// TODO: Add your property handler here return m_saItems.GetSize(); return 0; }
¿Ø¼þ±àÍêºó£¬¾ÍÊÇÊôÐÔÒ³Õâ¸öÖØÍ·Ï·ÁË£º
1.½çÃæ£¬¶ÔÓڿؼþÖÐ×Ö·û´®Êý×飬Ìí¼ÓÁËÒ»±à¼¿òºÍÒ»°´Å¥(\Ìí¼ÓÏîÄ¿\À´µ÷ÓÿؼþµÄAdd·½·¨£»Ìí¼ÓÁËÒ»Áбí¿òÀ´µ÷ÓÿؼþµÄItemÊôÐÔÌî³äÁбí¿ò¡£
2.½çÃæ£¬¶ÔÓڿؼþµÄColorÊôÐÔ£¬Ìí¼ÓÁËÒ»°´Å¥(\ÉèÖÃÑÕÉ«\ºÍÒ»¾²Ì¬Îı¾¿ò (CaptionΪ\¿´¿´ÎÒµÄÑÕÉ«°É\£¬IDΪIDC_STATIC_COLOR)À´ÉèÖÃÑÕÉ«ºÍ»ñµÃÑÕÉ«ÊôÐÔ£¬Îı¾¿òµÄÎı¾±³¾°ÑÕÉ«¼´Îª»ñµÃµÄÑÕÉ«¡£
3. Ìí¼Ó³ÉÔ±º¯ÊýBOOL AddItem(LPCTSTR lpszItem)ÓÃÀ´µ÷ÓÿؼþµÄAdd·½·¨Ìí¼Ó×Ö·û´®£¬Ìí¼ÓCString GetItem(long lItem)º¯ÊýÀ´»ñµÃ×Ö·û´®Êý×éÖеÄlItemÏî¶ÔÓ¦µÄ×Ö·û´®£¬Ìí¼Ólong GetCount()À´»ñµÃÊý×éÖÐ×Ö·û´®µÄÊýÄ¿£»Ìí¼ÓCOLORREF GetColor()º¯ÊýÀ´»ñµÃ¿Ø¼þµÄColorÊôÐÔ£¬Ìí¼ÓSetColor()º¯ÊýÀ´ÉèÖÿؼþµÄColorÊôÐÔ£¬ÕâЩº¯ÊýµÄʵÏÖÈçÏ£º
BOOL CToppPropPage::AddItem(LPCTSTR lpszItem) {
USES_CONVERSION;
COleDispatchDriver PropDispDriver; BOOL bResult = FALSE; ULONG nObjects = 0;
LPDISPATCH* ppDisp = GetObjectArray(&nObjects); for (ULONG i = 0; i < nObjects; i++) {
DISPID dwDispID;
LPCOLESTR lpOleStr = T2COLE(\
if (SUCCEEDED(ppDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpOleStr, 1, 0, &dwDispID))) {
PropDispDriver.AttachDispatch(ppDisp, FALSE); BYTE rgbParams[] = VTS_BSTR; long lret = 0;
PropDispDriver.InvokeHelper(dwDispID, DISPATCH_METHOD, VT_I4, &lret, rgbParams, lpszItem);
PropDispDriver.DetachDispatch(); bResult = TRUE; } }
return bResult; }
CString CToppPropPage::GetItem(long lItem) {
CString str = _T(\ USES_CONVERSION;
COleDispatchDriver PropDispDriver; ULONG nObjects = 0;