⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sthtmldialog.cpp

📁 Windows Mobile,ppc,wince下的chm格式文件阅读器源代码
💻 CPP
字号:
// STHtmlDialog.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "STHtmlDialog.h"
#include <Htmlctrl.h>
#include "VOImage.h"
#include "CHMFile.h"

#define LPINLINEIMAGEINFO (INLINEIMAGEINFO*)

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSTHtmlDialog dialog

HINSTANCE CSTHtmlDialog::m_HtmlViewInstance = 0;

CSTHtmlDialog::CSTHtmlDialog(UINT nIDTemplate, CWnd* pParentWnd)
	: CDialog(nIDTemplate, pParentWnd)
{
	//{{AFX_DATA_INIT(CSTHtmlDialog)
	//}}AFX_DATA_INIT
	m_pCHMFile=NULL;
}


BEGIN_MESSAGE_MAP(CSTHtmlDialog, CDialog)
	//{{AFX_MSG_MAP(CSTHtmlDialog)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSTHtmlDialog message handlers


void CSTHtmlDialog::SetCHMFile(CCHMFile *pCHMFile)
{
	m_pCHMFile=pCHMFile;
}

BOOL CSTHtmlDialog::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CreateHtmlWindow();
	
	return TRUE;
}

void CSTHtmlDialog::CreateHtmlWindow()
{
	CWaitCursor Wait;
	if (m_HtmlViewInstance == 0) {
		m_HtmlViewInstance = ::LoadLibrary(L"htmlview.dll");
	}

	VERIFY(InitHTMLControl(AfxGetInstanceHandle()));
	
	DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;

	RECT rect;
	GetClientRect(&rect);	
	rect.top+=17;
	rect.bottom-=17;
	m_hwndHtml = ::CreateWindow (DISPLAYCLASS, 
                                 NULL,
                                 dwStyle,
                                 rect.left, 
                                 rect.top, 
                                 rect.right, 
                                 rect.bottom,
                                 m_hWnd, 
                                 0, 
                                 m_HtmlViewInstance, 
                                 NULL);

	::SetWindowLong(m_hwndHtml, GWL_ID, 12321);
	::SetFocus (m_hwndHtml);
	::SendMessage(m_hwndHtml, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)_T("")); 
}

void CSTHtmlDialog::SetHtml(const CString &strHtml)
{
	CWaitCursor Wait;
	::SendMessage(m_hwndHtml, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)_T(""));
	::SendMessage(m_hwndHtml, DTM_ADDTEXTW, FALSE, (LPARAM)(LPCTSTR)strHtml);
	::SendMessage(m_hwndHtml, DTM_ENDOFSOURCE, 0, 0);
}

LRESULT CSTHtmlDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	switch(message)
	{	
	case WM_NOTIFY:
			NM_HTMLVIEW * pnmHTML = (NM_HTMLVIEW *) lParam;
			LPNMHDR pnmh = (LPNMHDR) &(pnmHTML->hdr);
			CString strReg = _T("register");

			switch(pnmh->code)
      
			{
			case NM_HOTSPOT:
				OnLink(pnmHTML->szTarget);
				return 1;
				break;

			case NM_INLINE_IMAGE:
				{
					CWaitCursor Wait;					
					CVOImage imgToLoad;
					CDC* pDC = GetDC();
					CStringEx FN(pnmHTML->szTarget);					
					CCHMFile ExternalCHM;

					BYTE *pImage=NULL;									
					CCHMFile *pCHMFile=m_pCHMFile;
					
					CCHMFileInfo *pInfo=m_pCHMFile->CheckFileExists(FN);
					DWORD ImageSize=0;
					if (pInfo==NULL)
					{
						CSplitPath Split(m_CHMFileName,_T('/'));
						CString Name;						
						Name=Split.GetPath()+FN;						
						pInfo=m_pCHMFile->CheckFileExists(Name);
					}
					if ((pInfo==NULL) && (FN.FindNoCase(_T("MS-ITS:"))==0))
					{
						CString ExternalCHMName;				
						int idx=FN.Find(_T("::"));
						ExternalCHMName=FN.Mid(7,idx-7);

						CStringEx Text;			
						int idx2=FN.ReverseFind(_T('/'));
						Text=FN.Right(FN.GetLength()-idx2-1);

						// Get file from external source.						
						if (ExternalCHM.Open(m_pCHMFile->GetSplit().GetPath()+ExternalCHMName))
						{	
							pInfo=ExternalCHM.CheckFileExists(Text);
							pCHMFile=&ExternalCHM;
						}		
					}

					if (pInfo==NULL)
						return 0;
					pImage=pCHMFile->GetFile(pInfo);
					ImageSize=pInfo->m_Length;

					if(imgToLoad.Load(pDC->GetSafeHdc(), pImage, ImageSize))
					{
						INLINEIMAGEINFO	imgInfo;
						imgInfo.dwCookie = pnmHTML->dwCookie;
						imgInfo.iOrigHeight = imgToLoad.GetHeight();
						imgInfo.iOrigWidth = imgToLoad.GetWidth();
						imgInfo.hbm = (HBITMAP)imgToLoad;
						imgInfo.bOwnBitmap = true;
						::SendMessage(m_hwndHtml, DTM_SETIMAGE, 0, (LPARAM)&imgInfo);						
					}
					else
					{
						TRACE(_T("Failed to load %s \n"),FN);
						::SendMessage(m_hwndHtml, DTM_IMAGEFAIL, 0, pnmHTML->dwCookie);
					}

					if (pImage) delete pImage; pImage=NULL;
					return 1;
				}
				break;
			}
	}
	
	return CDialog::WindowProc(message, wParam, lParam);
}

void CSTHtmlDialog::RegisterHtmlImage(int nResourceId, const CString &strHtmlImageName)
{
	CBitmap* pBitmap = new CBitmap();
	pBitmap->LoadBitmap(nResourceId);
	m_imagesCache.SetAt(strHtmlImageName, (CObject*)pBitmap);
}

void CSTHtmlDialog::RegisterHtmlImage(CBitmap *pBitmap, const CString &strHtmlImageName)
{
	m_imagesCache.SetAt(strHtmlImageName, (CObject*)pBitmap);
}

void CSTHtmlDialog::DeleteHtmlImages()
{
	CWaitCursor Wait;
	POSITION pos = m_imagesCache.GetStartPosition();
	CString key;
	CBitmap* bmp;
	while (pos != NULL) 
	{
		m_imagesCache.GetNextAssoc(pos, key, (CObject*&)bmp);
		delete bmp;
		m_imagesCache.RemoveKey(key);
	}
}


void CSTHtmlDialog::SetCHMFileName(CString CHMFileName)
{
	m_CHMFileName=CHMFileName;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -