본문 바로가기
IT-개발,DB

[VC++] IWebBrowser 스크롤 막대 및 테두리 제거

by SB리치퍼슨 2011. 1. 13.
쌈꼬쪼려 소백촌닭

출처 : http://support.microsoft.com/kb/324419/ko

 아래 내용은 더 이상 마이크로소프트사에서 지원하지 않는 내용으로 언제 제거가 될지 몰라 복사하여 나름대로 정리하였습니다.

 기술 자료: 324419 - 마지막 검토: 2003년 5월 12일 월요일 - 수정: 2.0
BUG: 사용자가 BeforeNavigate에서 다시 탐색할 때 스크롤 막대 및 테두리의 프레임셋 나타난다


스크롤 막대 제거
테두리 제거

 

[현상]

 

다음 조건에 해당하는 경우 빈 스크롤 막대 및 경우에 따라 테두리가 나타납니다. 프레임셋을 WebBrowser 컨트롤을 호스팅하는 응용 프로그램...다음 조건에 해당하는 경우 빈 스크롤 막대 및 경우에 따라 테두리가 나타납니다.

- 프레임셋을 WebBrowser 컨트롤을 호스팅하는 응용 프로그램을 표시합니다. - 및 -

- BeforeNavigate 또는 BeforeNavigate2 이벤트 처리기 내의 다른 곳에서 프레임셋의 프레임에 이동합니다.

이러한 항목은 프레임에서 나타나지 않아야 합니다.


[해결 방법]

스크롤 막대 사용하여 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.

- 프레임 페이지의 HTML 원본을 수동으로 "자동" 또는 "아니요" 값...스크롤 막대 사용하여 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.
프레임 페이지의 HTML 원본을 수동으로 "자동" 또는 "아니요" 값을 <body>태그 스크롤 특성을 추가하십시오.
- 스크롤 특성을 동적으로 통해 동적 HTML(DHTML) 추가하십시오.
- 사용자 정의 메시지 게시 및 사용자 정의 메시지 처리기 탐색을 수행하는 탐색을 지연하십시오.

테두리가 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.

- 사용자 정의 메시지, 게시 후 탐색 사용자 정의 메시지 처리기에서 수행하십시오.
- IDocHostUIHandler 인터페이스를 구현하고 DOCHOSTUIFLAG_NO3DBORDER GetHostInfo 메서드를 반환하십시오
.

자세한 내용은 이 문서의 "추가 정보" 절을 참조하십시오.


[현재 상태]

Microsoft는 이 문서의 시작 부분에 나열한 제품에서 문제를 확인했습니다.Microsoft는 이 문서의 시작 부분에 나열한 제품에서 문제를 확인했습니다.


[추가 정보]

Windows Mobile 기반 스마트폰에 GPRS 연결이 구성되어 있는지 확인합니다참고: 이 단계는 Microsoft Visual C++ 6....Windows Mobile 기반 스마트폰에 GPRS 연결이 구성되어 있는지 확인합니다
참고: 이 단계는 Microsoft Visual C++ 6.0 기록됩니다.

 

1. 프레임셋 페이지의 만들려면 다음 코드를 사용하고 페이지 frameset.htm 이름:
------------------------------------------------------------------------------------------
<HTML>
 <FRAMESET rows="100%" cols="33%,33%,34%">
  <FRAME src="http://aplus.pe.kr/zbxe/framesetChild.htm" frameborder="0" scrolling="0">
  </FRAME>
  <FRAME src="http://aplus.pe.kr/zbxe/framesetChild.htm" frameborder="0" scrolling="0">
  </FRAME>
  <FRAME src="http://aplus.pe.kr/zbxe/framesetChild.htm" frameborder="0" scrolling="0">
  </FRAME>
 </FRAMESET>
</HTML>

------------------------------------------------------------------------------------------     

2. frameset.htm 웹 서버에 복사하십시오.
3. 다음 코드를 사용하여 프레임 페이지 만들기 및 페이지 framesetChild.htm 이름:
------------------------------------------------------------------------------------------
<HTML>
 <body>
  This is a frame<br>
 </body>
</HTML>
------------------------------------------------------------------------------------------

4. framesetChild.htm 웹 서버에 복사하십시오.
5. 기본 Microsoft Foundation 클래스 (MFC) 대화 상자 기반 응용 프로그램을 만듭니다.
6. 대화 상자를 마우스 오른쪽 단추로 클릭한 다음 ActiveX 컨트롤 삽입 을 클릭하십시오. Microsoft 웹 브라우저 컨트롤 을 클릭하십시오.
7. WebBrowser 컨트롤의 컨트롤의 데이터 구성원을 추가하려면 다음과 같이 하십시오.

 a. 클래스 마법사를 열고 멤버 변수 탭을 클릭하십시오.
 b. 대화 상자 클래스에 클래스 이름 목록에서 선택되어 있는지 확인하십시오.
 c. WebBrowser 컨트롤의 기본 ID가 되는 IDC_EXPLORER1 를 클릭한 다음 변수 추가 클릭하십시오.
 d. 컨트롤 프로젝트에 삽입되지 않는 것을 알리는 메시지가 나타납니다. 컨트롤을 프로젝트에 추가하고 확인 클릭하십시오. CWebBrowser2 클래스의 클래스 확인 대화 상자에서 기본값을 다시 확인 을 클릭하십시오.
 e. 사용자의 멤버 변수 m_webBrowser, 이름을 지정한 다음 확인 을 누릅니다.
 f. 클래스 마법사를 닫습니다.

8. BeforeNavigate2 이벤트 처리기를 추가하려면 다음과 같이 하십시오.

 a. 클래스 마법사를 열고 메시지 맵 탭을 클릭하십시오.
 b. 대화 상자 클래스에 클래스 이름 목록에서 선택되어 있는지 확인하십시오.
 c. IDC_EXPLORER1개체 ID 목록에서 클릭한 다음 메시지 목록에서 BeforeNavigate2 를 클릭하십시오.
 d. 처리기를 추가하려면 함수 추가 클릭하십시오.
 
9. 다음 코드를 추가하여:
------------------------------------------------------------------------------------------
void CMFCReproDlg::OnBeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
{
 static int nCount = 0;

 nCount++;
 if (nCount == 2) // this should be the navigate for the first frame in frameset
 {
  IWebBrowser* pWB = NULL;
  HRESULT hr = pDisp->QueryInterface(IID_IWebBrowser, (void**)&pWB);
  COleVariant ve((long)0);
  pWB->Navigate(::SysAllocString(L"
http://myserver/mydirectory/framesetChild.htm"), &ve, &ve, &ve, &ve);
  *Cancel = VARIANT_TRUE;
 }
}
     
------------------------------------------------------------------------------------------

10. OnInitDialog 함수의 끝에 있는 프레임 페이지를 탐색하려면 다음 코드를 추가합니다.
------------------------------------------------------------------------------------------
BOOL CMFCReproDlg::OnInitDialog()
{
 ...
 m_webBrowser.Navigate("
http://myserver/mydirectory/frameset.htm", NULL, NULL, NULL, NULL);
  
   
------------------------------------------------------------------------------------------

11. 응용 프로그램을 빌드하고 이를 실행하십시오. 첫 번째 프레임 스크롤 막대 및 테두리를 오른쪽에 연관되어 있습니다.

 

스크롤 막대 제거

스크롤 막대를 제거하려면 다음 방법 중 하나를 사용하십시오.

- 스크롤 특성 값이 "자동" 또는 "아니요" framesetChild.htm 페이지에 다음과 같은 추가:
------------------------------------------------------------------------------------------
<HTML>
 <body scroll="auto">
  This is a frame<br>
 </body>
</HTML>
------------------------------------------------------------------------------------------

- 동적으로 스크롤 특성 값이 "자동" 또는 "아니요" DHTML 통해 코드에서 다음과 같은 추가:

------------------------------------------------------------------------------------------
#include <mshtml.h>
// For brevity, this code adds the attribute to all documents.
void CMFCReproDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
{
 HRESULT hr = S_OK;
 IWebBrowser2* pWB = NULL;

 hr = pDisp->QueryInterface(IID_IWebBrowser2, reinterpret_cast<void**>(&pWB));
 
 IDispatch* pDocDisp = NULL;
 hr = pWB->get_Document(&pDocDisp);
 
 if (pDocDisp)
 {
  VARIANT v;
  VariantInit(&v);

  IHTMLDocument2* pDoc = NULL;
  hr = pDocDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void **>(&pDoc));

  IHTMLElement* pElement = NULL;
  hr = pDoc->get_body(&pElement);

  IHTMLBodyElement* pBodyElement = NULL;
  hr = pElement->QueryInterface(IID_IHTMLBodyElement, (void**)&pBodyElement);

  if (pBodyElement)
  {
   pBodyElement->put_scroll(::SysAllocString(L"auto"));  // "no"
   pBodyElement->Release();
  }
  pElement->Release();
  pDoc->Release();
  pDocDisp->Release();
 }
 pWB->Release();
}

------------------------------------------------------------------------------------------ 

참고: 이 처음 두 옵션 경우에만 스크롤 막대를 제거합니다. 테두리 여전히 지속될 수 있습니다.

- 사용자 정의 메시지, 게시 후 탐색 탐색 지연시킬 수 있는 사용자 정의 메시지 처리기가 수행하십시오.


헤더 파일에 다음 코드를 추가하여:
------------------------------------------------------------------------------------------
class CMFCReproDlg : public CDialog
{
...
 afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
};
      
------------------------------------------------------------------------------------------

구현 파일에 다음 코드를 추가합니다:
------------------------------------------------------------------------------------------
#define WM_MYMESSAGE (WM_USER + 1)
BEGIN_MESSAGE_MAP(CMFCReproDlg, CDialog)
 //{{AFX_MSG_MAP(CMFCReproDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 //}}AFX_MSG_MAP
 ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

struct CMyData
{
 IWebBrowser2* m_pWB;
 BSTR m_pUrl;
};

void CMFCReproDlg::OnBeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
{
 static int nCount = 0;

 nCount++;
 if (nCount == 2) // this should be the navigate for the first frame in frameset
 {
        *Cancel = VARIANT_TRUE;
        CMyData *data = new CMyData;
  HRESULT hr = pDisp->QueryInterface(IID_IWebBrowser2, (void**)(&data->m_pWB));
        data->m_pUrl = ::SysAllocString(L"
http://myserver/mydirectory/framesetChild.htm");
  PostMessage(WM_MYMESSAGE, (WPARAM)data, 0);
 }
}
LRESULT CMFCReproDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
    CMyData *data = (CMyData*)wParam;
    COleVariant ve((long)0);
    data->m_pWB->Navigate(data->m_pUrl, &ve, &ve, &ve, &ve);
    delete data;
 return 1;
}
     

------------------------------------------------------------------------------------------

 

테두리 제거


테두리를 제거하려면 다음 방법 중 하나를 사용하십시오.

 - 사용자 정의 메시지, 게시 후 탐색 사용자 정의 메시지 처리기에서 수행하십시오.

 - Microsoft 기술 자료 문서 Q196835 IDocHostUIHandler 인터페이스를 추가할 수 사용자 지정 컨트롤을 사이트를 제공할 수 있는 단계를 수행하십시오. 자세한 내용은 아래 문서 번호를 눌러 Microsoft 기술 자료에 있는 문서를 클릭하십시오.
 196835  (http://support.microsoft.com/kb/196835/EN-US/ ) HOWTO: MFC 기본 컨트롤 포함 무시

모든 함수를 구현하는 후 DOCHOSTUIFLAG_NO3DBORDER DOCHOSTUIINFO stucture GetHostInfo 메서드에 대한 dwFlags 필드에서 추가해야 합니다. IDocHostUIHandler 구현하는 단계를 제공하기 위해 이 문서에서는 다루지 않습니다.
참고: ATL 클래스 CAxHostWindow, IDocHostUIHandler 인터페이스를 구현하므로 ATL (액티브 템플릿 라이브러리) 컨테이너에서 테두리 문제가 나타나지 않습니다. 기본적으로 이 플래그는 CAxHostWindow 사용할 수 있습니다.


--------------------------------------------------------------------------------

본 문서의 정보는 다음의 제품에 적용됩니다.

Microsoft Internet Explorer 5.5

키워드:   kbmt kbbug kbpending KB324419 KbMtko

더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항

이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

 

 

반응형

댓글