📄 urlftree.cpp
字号:
// 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 + -