2011-09-13 1 views
0

J'ai un morceau de code source HTML comme ceci:Comment puis-je obtenir la couleur de la police à partir d'un code source HTML?

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

J'ai essayé de récupérer la valeur « couleur », comme ceci:

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 

Mais je ne peux jamais obtenir la valeur « couleur » - varFtCol.bstrVal est un mauvais pointeur lorsque je débogue le programme. C'est ce que varFtCol a montré quand je déboguer le programme:

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

#5a6571 est une couleur hexadécimal représente pour la valeur RVB de (90.101.113).

Comment puis-je obtenir cette info couleur?

Répondre

1

Vous ne devriez pas avoir de style sur pChElem1 car la couleur ne fait pas partie du style dans votre cas. La couleur fait partie de l'élément Police.

Au lieu de cela, vous devez appeler pChElem1-> getAttribute ("couleur"...)

Ceci renvoie # 5a6571

Le code suivant est dans MFC. Mais vous pouvez facilement convertir en Win32 standard si vous n'utilisez pas MFC.

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

Je pense que la couleur fait partie de IHTMLStyle, donc je reçois le style de "Font", et ils ont essayé d'accéder à la propriété de couleur. – daiyue

+0

quelles sont alors les différences entre les styles et les attributs? – daiyue

+1

Dans le cas d'un tag de police, vous pouvez avoir des couleurs dans le tag lui-même ou dans le style de police. Soit soit . Votre code essaie d'obtenir style = "" alors que vous devez obtenir la couleur = "". –

1

Selon le MSDN documentation, IHTMLStyle :: get_color peut renvoyer un BSTR ou une valeur entière dans la variante. Avez-vous essayé d'affecter varFtCol à une valeur entière et d'examiner ce résultat?

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

En guise de recommandation, lorsque vous travaillez avec _variant_t, il est généralement préférable d'utiliser les opérateurs de coulée intégré que d'un accès direct aux membres du syndicat lui-même.

+0

le problème est le programme à sauter par: if (hr = S_OK && varFtCol) { hmStyles1 [wstring (varFtCol.bstrVal)] = L "FontColor"; } donc je ne peux pas vraiment obtenir la valeur entière quoi que ce soit – daiyue

+0

Ah, alors c'était hr! = S_OK? Je pense que la réponse ci-dessus explique pourquoi cela peut être le cas! –

Questions connexes