2011-09-13 3 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 {???} _variant_t 
-  tagVARIANT BSTR = 0x00000000 tagVARIANT 
     vt 8 unsigned short 
-  BSTR 0x00000000  wchar_t * 
      CXX0030: Error: expression cannot be evaluated 

#5a6571이 진수 색상 (90,101,113)의 RGB 값으로 나타낸다입니다 :이 varFtCol 내가 프로그램을 디버깅 할 때 보여 것입니다.

어떻게 색 정보를 얻을 수 있습니까?

답변

1

색상이 귀하의 경우 스타일의 일부가 아니기 때문에 pChElem1에 스타일이 표시되지 않아야합니다. 색상은 Font 요소의 일부입니다.

대신 당신은 ("색상"...)>의 getAttribute pChElem1-를 호출해야합니다

이 다음 코드는 MFC에 # 5a6571

반환합니다. 그러나 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의 일부라고 생각한다. 그래서 "Font"에서 스타일을 얻고 색상 속성에 액세스하려고했다. – daiyue

+0

스타일과 속성의 차이점은 무엇입니까? – daiyue

+1

글꼴 태그의 경우 태그 자체의 일부로 또는 글꼴 스타일의 일부로 색상을 지정할 수 있습니다. 또는 . 귀하의 코드는 style = ""을 얻으려고하지만 color = ""을 가져와야합니다. –

1

MSDN documentation에 따르면 IHTMLStyle :: get_color는 변형에서 BSTR 또는 정수 값을 반환 할 수 있습니다. varFtCol을 정수 값에 할당하고 그 결과를 검사 해 보셨습니까? _variant_t 작업을 할 때 추천으로

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

가, 그것은 사용하는 것이 가장 좋습니다 내장 된 노동 조합 자체의 회원 직접 액세스보다는 연산자를 캐스팅.

+0

문제는 프로그램을 통해 이동한다 : (HR = S_OK && varFtCol)이 { 가 hmStyles1 [wstring의은 (는 varFtCol.bstrVal)]을 L = "FONTCOLOR"경우; } 그래서 나는 정말로 정수 값을 얻을 수 없다. – daiyue

+0

아, 그래서 hr 이었어! = S_OK? 위의 대답은 왜 그런 경우일지도 모른다고 설명합니다! –

관련 문제