2011-09-13 58 views
0

我有這樣一段HTML源:如何從一段HTML源代碼獲取字體顏色?

<FONT color=#5a6571>Beverly Mitchell</FONT> <FONT color=#5a6571>Shawnee Smith</FONT> <FONT color=#5a6571>Glenn Plummer</FONT> <NOBR>more &gt;&gt;</NOBR> 

我試圖找回「色」的價值,像這樣:

MSHTML::IHTMLDocument2Ptr htmDoc1 = NULL; 
SAFEARRAY *psaStrings1 = SafeArrayCreateVector(VT_VARIANT, 0, 1); 
CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (void**) &htmDoc1); 

VARIANT *param1 = NULL; 
HRESULT hr = SafeArrayAccessData(psaStrings1, (LPVOID*)&param1); 
param1->vt = VT_BSTR; 
param1->bstrVal = SysAllocString(varSrc1.bstrVal); 

hr = SafeArrayUnaccessData(psaStrings1); 
hr = htmDoc1->write(psaStrings1); 

MSHTML::IHTMLElementPtr pElemBody1 = NULL; 
MSHTML::IHTMLDOMNodePtr pHTMLBodyDOMNode1 =NULL; 

hr = htmDoc1->get_body(&pElemBody1); 
if(SUCCEEDED(hr)) 
{ 
    hr = pElemBody1->QueryInterface(IID_IHTMLDOMNode,(void**)&pHTMLBodyDOMNode1); 
    if(SUCCEEDED(hr)) 
    { 
     ProcessDomNodeSmartWrapper(pHTMLBodyDOMNode1, ProcTgtTagStrVec); 
    } 
}  

long lLength = 0; 
MSHTML::IHTMLElementCollectionPtr pElemColl1 = NULL; 
MSHTML::IHTMLElementPtr pChElem1 = NULL; 
MSHTML::IHTMLStylePtr pStyle1 = NULL; 
IDispatchPtr ppvdisp1 = NULL; 

hr = htmDoc1->get_all(&pElemColl1); 
hr = pElemColl1->get_length(&lLength); 
for(long i = 0; i < lLength; i++) 
{ 
    _variant_t name(i); 
    _variant_t index(i); 

    ppvdisp1 = pElemColl1->item(name, index); 
    if(ppvdisp1 && SUCCEEDED(hr)) 
    { 
     hr = ppvdisp1->QueryInterface(IID_IHTMLElement, (void **)&pChElem1); 

     if(pChElem1 && SUCCEEDED(hr)) 
     { 
      BSTR bstrTagName = NULL; 

      pChElem1->get_tagName(&bstrTagName); 
      hr = pChElem1->get_style(&pStyle1); 
      if(pStyle1 && SUCCEEDED(hr)) 
      { 
       _variant_t varFtCol; 

       hr = pStyle1->get_color(&varFtCol); 
       if(hr = S_OK && varFtCol) 
       { 
        hmStyles1[wstring(varFtCol.bstrVal)] = L"FontColor"; 
       } 
      } 
      if(bstrTagName) 
       SysFreeString(bstrTagName); 
     } // if pStyle && SUCCEEDED(hr) 
    }//if ppvdisp && SUCCEEDED(hr) 
}//for 

但我從來沒有得到過「色」的價值 - 當我調試程序時,varFtCol.bstrVal是一個糟糕的指針。這是varFtCol表明,當我調試程序:

 
-  varFtCol {???} _variant_t 
-  tagVARIANT BSTR = 0x00000000 tagVARIANT 
     vt 8 unsigned short 
-  BSTR 0x00000000  wchar_t * 
      CXX0030: Error: expression cannot be evaluated 

#5a6571是一個十六進制顏色代表的(90101113)RGB值。

我怎樣才能得到這個顏色信息?

回答

1

您不應該在pChElem1上獲得樣式,因爲顏色不屬於您的案例中樣式的一部分。顏色是Font元素的一部分。

相反,你必須調用pChElem1->的getAttribute( 「顏色」。)

這將返回#5a6571

下面的代碼是在MFC中。但是,如果您不使用MFC,則可以輕鬆地將其轉換爲常規Win32。

COLORREF GetColorFromHexString(CString szColor) 
{ 
    TCHAR *szScan; 
    CString strTemp; 
    CString strColor = szColor; 
    long lRR = 0,lGG = 0,lBB = 0; 

    //first we will remove # characters which come from XML document 
    strColor.TrimLeft(_T('#')); 
    strColor.TrimRight(_T('#')); 

    //it should be of the form RRGGBB 
    if (strColor.GetLength() == 6) { 
     //get red color, from the hexadecimal string 
     strTemp = strColor.Left(2); 
     lRR = _tcstol(LPCTSTR(strTemp),&szScan,16); 

     //get green color 
     strTemp = strColor.Mid(2,2); 
     lGG = _tcstol(LPCTSTR(strTemp),&szScan,16); 

     //get blue color 
     strTemp = strColor.Right(2); 
     lBB = _tcstol(LPCTSTR(strTemp),&szScan,16); 
    } 


    return RGB(lRR,lGG,lBB); 
} 
+0

我認爲顏色是IHTMLStyle的一部分,所以我從「字體」中獲得樣式,並且他們嘗試訪問顏色屬性。 – daiyue

+0

風格和屬性之間有什麼區別呢? – daiyue

+1

在字體標籤的情況下,您可以將顏色作爲標籤本身的一部分或作爲字體樣式的一部分。可以是。你的代碼試圖獲得style =「」,而你必須得到color =「」。 –

1

根據MSDN documentation,IHTMLStyle :: get_color可能返回變量中的BSTR或整數值。你有沒有嘗試將varFtCol分配到一個整數值並檢查結果?

const int colorValue = static_cast<int>(varFtCol); 

,推薦,與_variant_t工作時,通常最好使用內置的鑄造運營商,而不是直接進入聯盟本身的成員。

+0

問題程序跳過通過:如果(HR = S_OK && varFtCol) { hmStyles1 [wstring的(varFtCol.bstrVal)] = L 「FONTCOLOR」; }所以我不能真正得到整數值什麼那麼 – daiyue

+0

啊,那麼hr!= S_OK?我想上面的答案解釋了爲什麼可能是這種情況! –