📄 chtm.h
字号:
// CHTM.h : Declaration of the CCHTM
#ifndef __CHTM_H_
#define __CHTM_H_
#define MIN_SIZE_X 100
#define MIN_SIZE_Y 100
#include "resource.h" // main symbols
#include <atlctl.h>
#include <shlguid.h>
#include <shlobj.h>
#include <comdef.h>
#include <comutil.h>
/////////////////////////////////////////////////////////////////////////////
// CCHTM
class ATL_NO_VTABLE CCHTM :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<ICHTM, &IID_ICHTM, &LIBID_BANDLib>,
public IDispatchImpl<ICHTMUI, &IID_ICHTMUI, &LIBID_BANDLib>,
public CWindowImpl<CCHTM>,
public IPersistStreamInitImpl<CCHTM>,
public IObjectWithSiteImpl<CCHTM>,
public IDeskBand,
public CComCoClass<CCHTM, &CLSID_CHTM>
{
public:
CCHTM()
{
_hwndParent = NULL;
m_dwBandID = NULL;
m_dwViewMode = NULL;
m_bRequiresSave = FALSE;
s_pFrameWB = NULL;
_pSite = NULL;
}
DECLARE_REGISTRY_RESOURCEID(IDR_CHTM)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CCHTM)
COM_INTERFACE_ENTRY(ICHTM)
COM_INTERFACE_ENTRY(ICHTMUI)
COM_INTERFACE_ENTRY2(IDispatch, ICHTMUI)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY_IID(IID_IDeskBand,IDeskBand)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
END_COM_MAP()
BEGIN_PROP_MAP(CCHTM)
END_PROP_MAP()
BEGIN_MSG_MAP(CCHTM)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// IViewObjectEx
// ICHTM
public:
// ICHTMUI
public:
STDMETHOD(OnNav)(IDispatch* pDisp, VARIANT varLnk);
// Example method called by the HTML to change the <BODY> background color
STDMETHOD(OnClick)(IDispatch* pdispBody, VARIANT varColor)
{
CComQIPtr<IHTMLBodyElement> spBody(pdispBody);
if (spBody != NULL)
spBody->put_bgColor(varColor);
return S_OK;
}
STDMETHOD(OnNag)(IDispatch* pdisp, BSTR varLnk)
{
CComVariant vtEmpty;
HRESULT h = m_spBrowser->Navigate(varLnk,&vtEmpty,&vtEmpty,&vtEmpty,&vtEmpty);
/* This is the case when you want to display your contents inside main window.
CComQIPtr<IHTMLAnchorElement> spBody(pdisp);
if (spBody != NULL)
{
s_pFrameWB->Navigate(varLnk,&vtEmpty,&vtEmpty,&vtEmpty,&vtEmpty);
}
*/
return S_OK;
}
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CAxWindow wnd(m_hWnd);
HRESULT hr = wnd.CreateControl(IDH_CHTM);
if (SUCCEEDED(hr))
{
hr = wnd.SetExternalDispatch(static_cast<ICHTMUI*>(this));
long dwStyle = wnd.GetWindowLong(GWL_STYLE);
wnd.SetWindowLong(GWL_STYLE,dwStyle | WS_HSCROLL | WS_VSCROLL);
}
if (SUCCEEDED(hr))
hr = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);
return SUCCEEDED(hr) ? 0 : -1;
}
LRESULT OnHScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
int nInc;
UINT nPos=HIWORD(wParam);
nInc = ::GetScrollPos(m_hWnd, SB_HORZ) - 10 ;
::ScrollWindow(m_hWnd,10, 0, NULL, NULL);
::SetScrollPos(m_hWnd, SB_HORZ, nInc , TRUE);
::UpdateWindow(m_hWnd);
::MessageBox(NULL,LPCTSTR("Scrollbar" ),"Title",MB_OK);
/* switch (LOWORD(wParam))
{
case SB_TOP: nInc = -m_nHscrollPos; break;
case SB_BOTTOM: nInc = m_nHscrollMax-m_nHscrollPos; break;
case SB_LINEUP: nInc = -1; break;
case SB_LINEDOWN: nInc = 1; break;
case SB_PAGEUP: nInc = -HORZ_PTS; break;
case SB_PAGEDOWN: nInc = HORZ_PTS; break;
case SB_THUMBTRACK: nInc = nPos - m_nHscrollPos; break;
default: nInc = 0;
}
nInc = max(-m_nHscrollPos, min(nInc, m_nHscrollMax - m_nHscrollPos));
if (nInc)
{
m_nHscrollPos += nInc;
int iMove = -HORZ_PTS * nInc;
::ScrollWindow(m_hWnd,iMove, 0, NULL, NULL);
::SetScrollPos(m_hWnd,SB_HORZ, m_nHscrollPos, TRUE);
::UpdateWindow(m_hWnd);
}
return 0;
}
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (!m_bInitialized)
return -1;
::ScrollWindow(m_hWnd,m_nHscrollPos*HORZ_PTS, 0, NULL, NULL);
::ScrollWindow(m_hWnd,0, m_nVscrollPos*VERT_PTS, NULL, NULL);
m_nHscrollPos = 0;
m_nVscrollPos = 0;
::SetScrollPos(m_hWnd,SB_HORZ, m_nHscrollPos, TRUE);
::SetScrollPos(m_hWnd,SB_VERT, m_nVscrollPos, TRUE);
CRect tempRect;
::GetClientRect(m_hWnd,&tempRect);
// Calculate how many scrolling increments for the client area
m_nHorzInc = (m_ClientRect.Width() - tempRect.Width())/HORZ_PTS;
m_nVertInc = (m_ClientRect.Height() - tempRect.Height())/VERT_PTS;
// Set the vertical and horizontal scrolling info
m_nHscrollMax = max(0, m_nHorzInc);
m_nHscrollPos = min (m_nHscrollPos, m_nHscrollMax);
::SetScrollRange(m_hWnd,SB_HORZ, 0, m_nHscrollMax, FALSE);
::SetScrollPos(m_hWnd,SB_HORZ, m_nHscrollPos, TRUE);
m_nVscrollMax = max(0, m_nVertInc);
m_nVscrollPos = min(m_nVscrollPos, m_nVscrollMax);
// MessageBox("The Size handler");
::SetScrollRange(m_hWnd,SB_VERT, 0, m_nVscrollMax, FALSE);
::SetScrollPos(m_hWnd,SB_VERT, m_nVscrollPos, TRUE);
*/
return 0;
}
LRESULT OnVScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int nInc;
UINT nPos=HIWORD(wParam);
::MessageBox(NULL,LPCTSTR("Scrollbar" ),"Title",MB_OK);
/* switch (LOWORD(wParam))
{
case SB_TOP: nInc = -m_nVscrollPos; break;
case SB_BOTTOM: nInc = m_nVscrollMax-m_nVscrollPos; break;
case SB_LINEUP: nInc = -1; break;
case SB_LINEDOWN: nInc = 1; break;
case SB_PAGEUP: nInc = min(-1, -m_nVertInc); break;
case SB_PAGEDOWN: nInc = max(1, m_nVertInc); break;
case SB_THUMBTRACK: nInc = nPos - m_nVscrollPos; break;
default: nInc = 0;
}
nInc = max(-m_nVscrollPos, min(nInc, m_nVscrollMax - m_nVscrollPos));
if (nInc)
{
m_nVscrollPos += nInc;
int iMove = -VERT_PTS * nInc;
::ScrollWindow(m_hWnd,0, iMove, NULL, NULL);
::SetScrollPos(m_hWnd,SB_VERT, m_nVscrollPos, TRUE);
}*/
return 0;
}
STDMETHODIMP SetSite(IUnknown* pUnkSite);
STDMETHODIMP GetSite(REFIID riid, void **ppvSite);
CComPtr<IWebBrowser2> m_spBrowser;
STDMETHODIMP GetWindow(HWND* phwnd)
{
*phwnd = m_hWnd;
return S_OK;
}
STDMETHODIMP ContextSensitiveHelp(BOOL)
{
return E_NOTIMPL;
}
STDMETHODIMP ShowDW(BOOL fShow)
{
if(m_hWnd)
{
if(fShow)
{
::ShowWindow(m_hWnd,SW_SHOW);
}
else
{
::ShowWindow(m_hWnd,SW_HIDE);
}
}
return S_OK;
}
STDMETHODIMP CloseDW(unsigned long dwReserved)
{
ShowDW(FALSE);
if(::IsWindow(m_hWnd))
::DestroyWindow(m_hWnd);
m_hWnd = NULL;
return S_OK;
}
STDMETHODIMP ResizeBorderDW(const RECT* prcBorder,
IUnknown* punkToolbarSite,
BOOL fReserved)
{
return E_NOTIMPL;
}
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode,DESKBANDINFO* pdbi);
BOOL m_bRequiresSave;
int m_nHscrollPos ;
int m_nVscrollPos ;
BOOL m_bInitialized ;
private:
IWebBrowser2 *s_pFrameWB;
HWND _hwndParent;
IInputObjectSite* _pSite;
DWORD m_dwBandID;
DWORD m_dwViewMode;
};
#endif //__CHTM_H_
/*
LRESULT OnCreate(UINT , WPARAM , LPARAM , BOOL& )
{
CAxWindow wnd(m_hWnd);
HRESULT hr = wnd.CreateControl(IDH_BROWSER);
long dwStyle=wnd.GetWindowLong(GWL_STYLE);
wnd.SetWindowLong(GWL_STYLE,dwStyle | WS_HSCROLL | WS_VSCROLL);
if (SUCCEEDED(hr))
hr = wnd.SetExternalDispatch(static_cast(this));
if (SUCCEEDED(hr)) {
hr = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);
_bstr_t path("www.yahoo.com");
m_spBrowser->put_StatusBar(true);
m_spBrowser->Navigate(path,NULL,NULL,NULL,NULL);
}
m_nHscrollPos = 0;
m_nVscrollPos = 0;
// Get the initial dimensions of the dialog
::GetClientRect(m_hWnd,&m_ClientRect);
m_bInitialized = TRUE;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -