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

📄 urlftree.cpp

📁 大量windows shell编程例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Render HTML content into a tree-based view

#include "stdhdr.h"
#include "htmltree.h"
#include "resource.h"

extern HINSTANCE g_hInstance;

// callbacks
static CHtmlTree *g_pHtmlTree=NULL;
BOOL CALLBACK MyLinkProc( IHTMLAnchorElement *pLink, DWORD dwData );
BOOL CALLBACK MyImageProc( IHTMLImgElement *pImage, DWORD dwData );
BOOL CALLBACK MyObjectProc( IHTMLElement *pObject, DWORD dwData );
BOOL CALLBACK MyScriptProc( IHTMLElement *pScript, DWORD dwData );
BOOL CALLBACK MyAppletProc( IHTMLElement *pApplet, DWORD dwData );

LRESULT CALLBACK Source_DlgProc( HWND, UINT, WPARAM, LPARAM );
BOOL GetObjectDescription( LPCTSTR szClsId, LPTSTR szDesc, DWORD );

// macros
#define SHIFT_STRING(s,n)  	lstrcpy(s, ((LPSTR) s) + n)






/*-------------------------------------------------------------------*/
// Procedure....: CHtmlTree()
// Description..: Constructor of the class
/*-------------------------------------------------------------------*/
CHtmlTree::CHtmlTree( HWND hwndTree, IShellBrowser *psb ) 
{
	g_pHtmlTree = this;

	m_szFile[0] = 0; 
	m_nodeFile = NULL;
	m_nodeContents = NULL;
	m_nodeScripts = NULL;
	m_nodeLinks = NULL;
	m_nodeObjects = NULL;
	m_nodeApplets = NULL;
	m_nodeImages = NULL;
	m_hwndTree = hwndTree;
	m_pSB = psb;
	m_pHtml = new CDynHtml;

	// create an imagelist and link to the treeview
	m_ImageList = ImageList_LoadBitmap( g_hInstance, 
		MAKEINTRESOURCE(IDB_BITMAP), HTML_TREE_BMPSIZE, 0, CLR_NONE );
	TreeView_SetImageList( m_hwndTree, m_ImageList, TVSIL_NORMAL );
}



/*-------------------------------------------------------------------*/
// Procedure....: ~CHtmlTree()
// Description..: Destructor of the class
/*-------------------------------------------------------------------*/
CHtmlTree::~CHtmlTree()
{
	m_hwndTree = NULL;
	TreeView_SetImageList( m_hwndTree, NULL, TVSIL_NORMAL );
	ImageList_Destroy( m_ImageList );

	m_pHtml->Close();
	delete m_pHtml;
}



/*-------------------------------------------------------------------*/
// Procedure....: Load()
// Description..: Fill the treeview with the HTML content
/*-------------------------------------------------------------------*/
UINT CHtmlTree::Load( LPCSTR szFile ) 
{
	OLECHAR wszBuf[100];

	lstrcpyn( m_szFile, szFile, MAX_PATH ); 
	
	// FILE node
	SYSTEMFILEINFO sfi;
	m_nodeFile = AddTreeItem( NULL, "File Information", ID_ITEM_FILE );
	if( GetFileInfo( &sfi ) )
	{
		AddTreeItem( NODE_FILE, sfi.szNameExt, ID_ITEM_INFO );
		AddTreeItem( NODE_FILE, sfi.szLocation, ID_ITEM_INFO );
		AddTreeItem( NODE_FILE, sfi.szTitle, ID_ITEM_INFO );	
		AddTreeItem( NODE_FILE, sfi.szMsDosName, ID_ITEM_INFO );
		AddTreeItem( NODE_FILE, sfi.szAttrib, ID_ITEM_INFO );
		AddTreeItem( NODE_FILE, sfi.szSize, ID_ITEM_INFO );
		AddTreeItem( NODE_FILE, sfi.szCreated, ID_ITEM_INFO );
		AddTreeItem( NODE_FILE, sfi.szModified, ID_ITEM_INFO );
	}


	// tell the user that work's in progress...
	STRING_TO_BSTR( "Loading document. Please, wait...", wszBuf, 100 );
	m_pSB->SetStatusTextSB( wszBuf );


	// instantiate a Dynamic HTML class
	m_pHtml->Init();
	m_pHtml->Load( m_szFile );


	// CONTENTS node
	// Now add the static items representing the 
	// category of the information plus some general data.
	// (i.e. Contents node and document title or Links node
	// and the total number of references found).
	TCHAR szBuf[MAX_PATH], szTitle[120];
	LONG n;

	// document title
	m_nodeContents = AddTreeItem( -1, "HTML Contents", ID_ITEM_CONTENTS );
		m_pHtml->GetTitle( szTitle, 120 );
		wsprintf( szBuf, "Document Title is  '%s'", szTitle );
		AddTreeItem( NODE_CONTENTS, szBuf, ID_ITEM_ELEMENT );

	// number of links found
	m_nodeLinks = AddTreeItem( NODE_CONTENTS, "Links", ID_ITEM_LINKS );
		m_pHtml->GetNumOf( ELEM_LINK, &n );
		if( n >0 )
			wsprintf( szBuf, "%d link(s) found", n );
		else
			lstrcpy( szBuf, "There are no links" );
		AddTreeItem( NODE_LINKS, szBuf, -1 ); 
	
	// number of applets found		
	m_nodeApplets = AddTreeItem( NODE_CONTENTS, "Applets", ID_ITEM_APPLETS );
		m_pHtml->GetNumOf( ELEM_APPLET, &n );
		if( n >0 )
			wsprintf( szBuf, "%d applet(s) found", n );
		else
			lstrcpy( szBuf, "There are no applets" );
		AddTreeItem( NODE_APPLETS, szBuf, -1 ); 
	
	// number of scripts found				
	m_nodeScripts = AddTreeItem( NODE_CONTENTS, "Scripts", ID_ITEM_SCRIPTS );
		m_pHtml->GetNumOf( ELEM_SCRIPT, &n );
		if( n >0 )
			wsprintf( szBuf, "%d script(s) found", n );
		else
			lstrcpy( szBuf, "There are no scripts" );
		AddTreeItem( NODE_SCRIPTS, szBuf, -1 ); 
		
	// number of objects found				
	m_nodeObjects = AddTreeItem( NODE_CONTENTS, "Objects", ID_ITEM_OBJECTS );
		m_pHtml->GetNumOf( ELEM_OBJECT, &n );
		if( n >0 )
			wsprintf( szBuf, "%d object(s) found", n );
		else
			lstrcpy( szBuf, "There are no objects" );
		AddTreeItem( NODE_OBJECTS, szBuf, -1 ); 

	// number of images found						
	m_nodeImages = AddTreeItem( NODE_CONTENTS, "Images", ID_ITEM_IMAGES );
		m_pHtml->GetNumOf( ELEM_IMAGE, &n );
		if( n >0 )
			wsprintf( szBuf, "%d image(s) found", n );
		else
			lstrcpy( szBuf, "There are no images" );
		AddTreeItem( NODE_IMAGES, szBuf, -1 ); 



	// Now add specific information for each category.
	// This is done enumerating the various collections
	// in the DHTML file. 
	// A callback function will do the job of inserting
	// in the treeview. The global variable passed in is 
	// a pointer to the CHtmlTree class.
	// A callback function cannot be member of any class,
	// thus you need a little trick to have it work on
	// the public members of a class.
	m_pHtml->EnumLinks( MyLinkProc, (DWORD)g_pHtmlTree );
	m_pHtml->EnumImages( MyImageProc, (DWORD)g_pHtmlTree );
	m_pHtml->EnumObjects( MyObjectProc, (DWORD)g_pHtmlTree );
	m_pHtml->EnumScripts( MyScriptProc, (DWORD)g_pHtmlTree );
	m_pHtml->EnumApplets( MyAppletProc, (DWORD)g_pHtmlTree );


	// tell the user that work's been done
	STRING_TO_BSTR( "Done.", wszBuf, 100 );
	m_pSB->SetStatusTextSB( wszBuf );
	return 1;
}



/*-------------------------------------------------------------------*/
// Procedure....: Unload()
// Description..: Clear the treeview
/*-------------------------------------------------------------------*/
VOID CHtmlTree::Unload() 
{
	m_szFile[0] = 0;
	m_nodeFile = NULL;
	m_nodeContents = NULL;
	m_nodeScripts = NULL;
	m_nodeLinks = NULL;
	m_nodeObjects = NULL;
	m_nodeApplets = NULL;
	m_nodeImages = NULL;
	TreeView_DeleteAllItems( m_hwndTree );
}




/*-------------------------------------------------------------------*/
// Procedure....: GetFileInfo()
// Description..: Returns some information on the file
/*-------------------------------------------------------------------*/
BOOL CHtmlTree::GetFileInfo( LPSYSTEMFILEINFO lpsfi )
{
	HANDLE hFile;
	BY_HANDLE_FILE_INFORMATION bhfi;
	if( lpsfi==NULL )  return FALSE;

	hFile = CreateFile( m_szFile, GENERIC_READ, FILE_SHARE_READ, NULL,
		OPEN_EXISTING, 0, NULL );
	if( hFile==NULL ) return FALSE;

	if( !GetFileInformationByHandle( hFile, &bhfi ) )
	{
		CloseHandle( hFile );
		return FALSE;
	}

	// all the data turn to strings
	CHAR szBuf[MAX_PATH];
	ZeroMemory( lpsfi, sizeof(SYSTEMFILEINFO) );
	

	// location and name
	CHAR drive[_MAX_DRIVE], dir[_MAX_DIR], file[_MAX_FNAME], ext[_MAX_EXT];
	_splitpath( m_szFile, drive, dir, file, ext );
	wsprintf( lpsfi->szLocation, "Location is  %s%s", drive, dir );
	wsprintf( lpsfi->szNameExt, "%s%s", file, ext );
	
	// short name 
	GetShortPathName( lpsfi->szNameExt, lpsfi->szMsDosName, 50 );
	wsprintf( szBuf, "Short Name is  %s", lpsfi->szMsDosName );
	lstrcpyn( lpsfi->szMsDosName, szBuf, 50 );

	// file type
	SHFILEINFO shfi;
	SHGetFileInfo( m_szFile, 0, &shfi, sizeof(SHFILEINFO), SHGFI_TYPENAME );
	wsprintf( szBuf, "Type is  '%s'", shfi.szTypeName );
	lstrcpyn( lpsfi->szTitle, szBuf, MAX_PATH );
	
	// size
	wsprintf( szBuf, "%ld bytes", bhfi.nFileSizeLow );
	lstrcpyn( lpsfi->szSize, szBuf, 30 );

	// dates
	SYSTEMTIME st;
	FileTimeToSystemTime( &bhfi.ftCreationTime, &st );
	wsprintf( szBuf, "Created on %02d/%02d/%04d", st.wMonth, st.wDay, st.wYear );
	lstrcpyn( lpsfi->szCreated, szBuf, 50 );
	FileTimeToSystemTime( &bhfi.ftLastWriteTime, &st );
	wsprintf( szBuf, "Modified on %02d/%02d/%04d", st.wMonth, st.wDay, st.wYear );
	lstrcpyn( lpsfi->szModified, szBuf, 50 );

	// attributes
	szBuf[0] = 0;
	if( bhfi.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE )
		lstrcat( szBuf, "Archive, " );
	if( bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY )
		lstrcat( szBuf, "Readonly, " );
	if( bhfi.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN )
		lstrcat( szBuf, "Hidden  " );
	if( lstrlen(szBuf) )
		szBuf[lstrlen(szBuf)-2] = 0;
	lstrcpyn( lpsfi->szAttrib, szBuf, 50 );

	CloseHandle( hFile );
	return TRUE;
}





/*-------------------------------------------------------------------*/
// Procedure....: ::ViewSource()
// Description..: Returns the source code of a HTML file
/*-------------------------------------------------------------------*/
VOID CHtmlTree::ViewSource( HWND hwndParent )
{
	TCHAR s[2048];
	m_pHtml->GetSource( s, 2048 );
	DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_VIEWSOURCE), 
		hwndParent, (DLGPROC)Source_DlgProc, (LPARAM) s );
}





⌨️ 快捷键说明

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