http://download.csdn.net/source/2062491
本作品主旨:
方便的管理网页资料,直接从网页中复制内容,并且可进行简单编辑,可根据需要去掉广告等信息。
主要实现了网页文件的所见即所得与源码2种模式的编辑,以及vc与js通讯。(功能部分主要以JS实现);浏览器基本功能。
自动完成:
-
-
设置标题。
-
设置原始链接。
-
设置相关文件。
-
自动在但前分类目录下创建以标题命名的目录,其下层又创建以标题命名的htm文件、image文件夹、file文件夹。
-
网页中的图片自动下载到image目录。
-
图片的链接替换为本地图片链接,并添加命令使得双击图片可以打开原始图片链接。
-
其他功能:
- 可以通过右键菜单直接管理资料文件。
- "编辑"时自动导入原文件并填写标题、链接等内容。
- 编辑时“原始链接”随输入实时更新。
- 主页面实现了手动分割窗口、拖动边框调整窗口时动态调整布局,以及最大化、最小化、还原时窗口的动态调整。
- 遍历文件到树中显示,并根据需要设置不同图标。
- 当目录发生变化时(复制、剪切、删除、添加等),可以部分重新遍历,提高效率。
- 对文件操作(复制、剪切、删除)等实现函数封装。
- 对网页中js调用实现函数封装。
WebVampire开发全纪录
(保留了初期测试时的代码,请根据需要删除或修改)
1.基于对话框的mfc,命名WebVampire。
主对话框属性,样式,边框,选“调整大小”,最小化最大化框。
调整对话框大小。
2.添加控件:静态文本IDC_STATIC_web、树IDC_TREE_list。
添加树,添加控制类变量,m_tree_ctrl。
树样式:有按钮,有线条,根部的线。
5.建立类向导,Class Info选项卡,Message filter选windows。
添加消息WM_GETMINMAXINFO消息函数,添加代码
//-------------------------------------------------------
lpMMI-> ptMinTrackSize.x = 400 ; //设置窗口最小值
lpMMI-> ptMinTrackSize.y = 400 ;
// lpMMI-> ptMaxTrackSize.x = 500 ; //设置窗口最大值
// lpMMI-> ptMaxTrackSize.y = 500 ;
//----------------------------------------------------------------------
3.WebVampireDlg.h添加变量。
//----------------------------
BOOL b_lbtdown;//鼠标左键是否按下。
BOOL b_spliter;//鼠标是否处于分界线上。
CRect rect_treelist;//树控件矩形。
CRect rect_static_web;//静态文本矩形(静态文本框供web控件用)。
CWnd *pstatic;//静态文本指针。
CRect rect_maindlg;//主窗口矩形
//----------------------------
4.OnInitDialog()添加
//-------------------------------------------------------
b_lbtdown=FALSE;
b_spliter=FALSE;
pstatic=GetDlgItem(IDC_STATIC_web);
GetClientRect(rect_maindlg);
m_tree_ctrl.GetClientRect(&rect_treelist); //取得控件的全屏坐标
pstatic->GetClientRect(rect_static_web);
rect_treelist.left=0;
rect_treelist.top=5;
rect_treelist.right=200;
rect_static_web.top=5;
rect_treelist.bottom=rect_maindlg.bottom-0;
rect_static_web.bottom=rect_maindlg.bottom-0;
rect_static_web.right=rect_maindlg.right-0;
rect_static_web.left=rect_treelist.right+6;
m_tree_ctrl.MoveWindow(rect_treelist);
(*pstatic).MoveWindow(rect_static_web);
//----------------------------------------------------------------
WM_SIZING
//----------------------------------------------------
CRect rect(pRect);
m_tree_ctrl.GetWindowRect(&rect_treelist); //取得控件的全屏坐标
pstatic->GetWindowRect(rect_static_web);
rect_static_web.right=rect.right-5;
rect_static_web.bottom=rect.bottom-10;
rect_treelist.bottom=rect.bottom-10;
this->ScreenToClient(&rect_treelist);
m_tree_ctrl.MoveWindow(rect_treelist);
this->ScreenToClient(&rect_static_web);
(*pstatic).MoveWindow(rect_static_web);
// m_page.MoveWindow(rect_static_web);
// CString str,str2;
// str.Format("x1:%d,y1:%d,x2:%d,y2:%d",rect.top,rect.left,rect.right,rect.bottom);
// str2.Format("x1:%d,y1:%d,x2:%d,y2:%d",rect_treelist.top,rect_treelist.left,rect_treelist.right,rect_treelist.bottom);
// AfxMessageBox(str);
// SetDlgItemText(IDC_STATIC_web,str+"/n"+str2);
//-----------------------------------------------------
WM_MOUSEMOVE
//--------------------------------------------
POINT pt;
GetCursorPos(&pt);//取得当前鼠标坐标。
//ClientToScreen(&pt);
//ScreenToClient(&pt);//换算到窗口坐标。
m_tree_ctrl.GetWindowRect(&rect_treelist); //取得控件的全屏坐标。
pstatic->GetWindowRect(rect_static_web);
//this->ScreenToClient(&rect_treelist);
//m_tree_ctrl.GetClientRect(rect_treelist);
if((pt.x > rect_treelist.right) && (pt.x < rect_treelist.right+6))//当鼠标处于IDC_STATIC_web和IDC_TREE_list中间时。
{
SetCursor(LoadCursor(NULL,IDC_SIZEWE));//设置鼠标样式,左右箭头样式IDC_SIZEWE。
b_spliter=TRUE; //鼠标在分界线上,可以拖动,也就是可以调节分界线位置。
}
else
{
b_spliter=FALSE;//鼠标不在分界线上,不可以拖动。
}
if(b_lbtdown&&(pt.x > rect_treelist.left+10)&&(pt.x < rect_static_web.right-10 ))//当鼠标左键按下时调节分割条,并且不能超出树跟静态框的边界。
{
rect_treelist.right=pt.x-3;//调节树控件IDC_TREE_list的最右边保持鼠标坐标-3的位置。
this->ScreenToClient(&rect_treelist); //换算到屏幕坐标。
m_tree_ctrl.MoveWindow(rect_treelist);//
rect_static_web.left=pt.x+3;
this->ScreenToClient(&rect_static_web);
(*pstatic).MoveWindow(rect_static_web);
Invalidate(FALSE);
}
//-------------------------------------------
WM_LBUTTONDOWN
//---------------------------------------
if(b_spliter) b_lbtdown=TRUE;//当鼠标处于分割条位置时点击鼠标左键。
SetCapture();//捕获鼠标。
//---------------------------------------
WM_LBUTTONUP
//----------------------------------------------------------
b_lbtdown=FALSE;
ReleaseCapture();//释放鼠标。
//----------------------------------------------------------
----基本界面完成----///
///
WebVampireDlg.h加
//---------------------------------------------------
void BrowseDir(CString strDir,HTREEITEM parent);//遍历文件显示到树里。
//----------------------------------------------------
全局变量
//--------------------------------------
CImageList m_iImageList;
//-------------------------------------
添加图标资源。
file.ico文件IDI_ICON_file
fileopen.ico文件打开IDI_ICON_fileopen
dir.ico目录IDI_ICON_dir
diropen.ico目录打开IDI_ICON_diropen
WebVampireDlg.cpp加
//-----------------------------------------------------------------
void CWebVampireDlg::BrowseDir( CString strDir, HTREEITEM parent )
{
CFileFind ff;
CString szDir = strDir;
HTREEITEM hSubItem;
if(szDir.Right(1) != "//")
szDir += "//";
szDir += "*.*";
BOOL res = ff.FindFile(szDir);
while( res )
{
res = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())
{
CString strPath = ff.GetFilePath();
CString strTitle = ff.GetFileTitle();
hSubItem = m_tree.InsertItem( strTitle, parent );
// SetIcon()
m_tree.SetItemImage(hSubItem,2,3);
BrowseDir( strPath, hSubItem );
}
else if(!ff.IsDirectory() && !ff.IsDots())
{
CString strTitle = ff.GetFileName();//GetFileTitle();
hSubItem =m_tree.InsertItem( strTitle, parent );
m_tree.SetItemImage(hSubItem,0,1);
}
}
ff.Close();
}
//----------------------------------------------------------------------------------
添加按钮“遍历”。对应函数Onbtdirtree() 。
//-----------------------------------------------------------------------------------------
m_iImageList.Create(20, 20, TRUE|ILC_COLOR32,1, 0);
HICON hIconfile = (HICON)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_file), IMAGE_ICON, 24, 24, 0);
HICON hIconfileopen = (HICON)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_fileopen), IMAGE_ICON, 24, 24, 0);
HICON hIcondir = (HICON)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_dir), IMAGE_ICON, 24, 24, 0);
HICON hIcondiropen = (HICON)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_diropen), IMAGE_ICON, 24, 24, 0);
m_iImageList.Add(hIconfile);
m_iImageList.Add(hIconfileopen);
m_iImageList.Add(hIcondir);
m_iImageList.Add(hIcondiropen);
m_tree_ctrl.SetImageList (&m_iImageList,TVSIL_NORMAL );
m_tree_ctrl.DeleteAllItems();
m_tree_ctrl.InsertItem("数据库",0,0,NULL );
CFont cfont;
cfont.CreateFont(16, //这个数字就是字体大小了
0,0,0,FW_NORMAL,
FALSE,FALSE,
0,
GB2312_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, "楷体");
GetDlgItem(IDC_TREE_list)->SetFont(&cfont);
cfont.Detach();
m_tree_ctrl.SetTextColor(RGB(235,115,0));
m_tree_ctrl.SetItemImage(m_tree_ctrl.GetRootItem(),2,3);
//参数:节点、没选中时图标标号、选中时图标标号
BrowseDir("数据库", m_tree_ctrl.GetRootItem());
m_tree_ctrl.Expand(m_tree_ctrl.GetRootItem(),TVE_EXPAND);
//--------------------------------------------------------------------------------------------------
解决图标失真:http://hi.baidu.com/wujizhangzz/blog/item/bfe753fbd4675017a9d311ad.html
将
//------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
<v3:security>
<v3:requestedPrivileges>
<!-- level can be "asInvoker", "highestAvailable", or "requireAdministrator" -->
<v3:requestedExecutionLevel level="requireAdministrator" />
</v3:requestedPrivileges>
</v3:security>
</v3:trustInfo>
</assembly>
//-----------------------------------------------------------------
保存为a.manifest,然后在.rc文件中加入
//-------------------------------------------------------
1 24 "a.manifest"
//-----------------------------------------------------------
编译即可,在vista,win7下面就会看到小盾牌。
添加按钮“打开选中文件夹”,函数Onbtdiropen() 。
//--------------------------------------------------------------------------------------
CString name;
name=m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem());
HTREEITEM tmp=m_tree_ctrl.GetSelectedItem();
while(HTREEITEM tmp2=m_tree_ctrl.GetParentItem(tmp))
{
name=m_tree_ctrl.GetItemText(tmp2)+"//"+name;
tmp=tmp2;
}
AfxMessageBox(name);
WinExec("explorer.exe "+name, SW_SHOWNORMAL); //速度快
//---------------------------------------------------------------------------------------
右键菜单:
新建菜单,IDC_TREEMENU,添加选项
添加树右键单击响应函数OnRclickTREElist,代码:
//-------------------------------------------------------------------------------
CMenu menu ,* pSubMenu;//定义下面要用到的cmenu对象
menu.LoadMenu(IDC_TREEMENU);//装载自定义的右键菜单
pSubMenu = menu.GetSubMenu(0);//获取第一个弹出菜单,所以第一个菜单必须有子菜单
CPoint oPoint;//定义一个用于确定光标位置的位置
GetCursorPos(&oPoint);//获取当前光标的位置,以便使得菜单可以跟随光标
pSubMenu->TrackPopupMenu (TPM_LEFTALIGN, oPoint.x, oPoint.y, this); //在指定位置显示弹出菜单
//---------------------------------------------------------------------------------------------------
各菜单函数:
//----------------------------------------------------------------------------------------------
void CWebVampireDlg::OnMAdd()
{
// TODO: Add your command handler code here
CString stradd;
GetDlgItemText(IDC_EDIT_add,stradd);
AfxMessageBox(stradd);
if(stradd=="")return;
CString strItem=stradd;
HTREEITEM hItem=m_tree_ctrl.GetSelectedItem();
m_tree_ctrl.InsertItem(strItem,hItem);
m_tree_ctrl.Expand(hItem,TVE_EXPAND);
AfxMessageBox("添加!");
}
BOOL DocumentManagement(LPCTSTR lpszFromPath,LPCTSTR lpszToPath,INT method);
CString cpcutdir;
BOOL iscut=FALSE;
void CWebVampireDlg::OnMCp()
{
// TODO: Add your command handler code here
cpcutdir=GetFullname();
AfxMessageBox("复制:"+GetFullname());
}
void CWebVampireDlg::OnMCut()
{
// TODO: Add your command handler code here
cpcutdir=GetFullname();
iscut=TRUE;
AfxMessageBox("剪切:"+GetFullname());
}
void CWebVampireDlg::OnMDel()
{
// TODO: Add your command handler code here
AfxMessageBox("删除:"+GetFullname());
/*
WinExec("cmd.exe /c rd /s /q /""+GetFullname()+"/"",SW_SHOWNORMAL);
WinExec("cmd.exe /c del /q /""+GetFullname()+"/"",SW_SHOWNORMAL);
*/
DocumentManagement(GetFullname(),"",FO_DELETE);
HTREEITEM hItem=m_tree_ctrl.GetSelectedItem();
m_tree_ctrl.DeleteItem(hItem);
m_tree_ctrl.Expand(hItem,TVE_EXPAND);
}
void CWebVampireDlg::OnMEdit()
{
// TODO: Add your command handler code here
}
void CWebVampireDlg::OnMRname()
{
// TODO: Add your command handler code here
}
void CWebVampireDlg::OnMP()
{
// TODO: Add your command handler code here
//system("cmd.exe xcopy /e d://addfile c://");
//WinExec("cmd.exe /c xcopy //e d://addfile c://", SW_SHOWNORMAL);//必须加参数/c
int nPos = cpcutdir.ReverseFind('//');
CString cpcutname=cpcutdir.Mid(nPos+1,cpcutdir.GetLength()-nPos);
AfxMessageBox("节点名:"+cpcutname);
/*调用dos没法等待其结束,剪切时没剪切完就删掉了
WinExec("xcopy /e/y/i /""+cpcutdir+"/" /""+GetFullname()+"//"+cpcutname+"/"",SW_SHOWNORMAL);//SW_HIDE);
if(iscut)
{
WinExec("cmd.exe /c rd /s /q /""+cpcutdir+"/"",SW_SHOWNORMAL);
WinExec("cmd.exe /c del /q /""+cpcutdir+"/"",SW_SHOWNORMAL);
iscut=FALSE;
}
*/
if(iscut)
{
DocumentManagement(cpcutdir,GetFullname(),FO_MOVE);
iscut=FALSE;
}
else
{
DocumentManagement(cpcutdir,GetFullname(),FO_COPY);
}
HTREEITEM hItemsel=m_tree_ctrl.GetSelectedItem();
CString hItemseltext = m_tree_ctrl.GetItemText(hItemsel);
CString hItemfullname=GetFullname();
HTREEITEM hItemselparent=m_tree_ctrl.GetParentItem(hItemsel);
m_tree_ctrl.DeleteItem(hItemsel);
HTREEITEM hItemselparent22=m_tree_ctrl.InsertItem(hItemseltext,hItemselparent);
m_tree_ctrl.SetItemImage(hItemselparent22,2,3);
BrowseDir(hItemfullname, hItemselparent22);//只刷新修改部分,提高效率
m_tree_ctrl.Expand(hItemselparent22,TVE_EXPAND);
}
CString CWebVampireDlg::GetFullname()
{
CString dirfullnametmp=m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem());
HTREEITEM tmp=m_tree_ctrl.GetSelectedItem();
while(HTREEITEM tmp2=m_tree_ctrl.GetParentItem(tmp))
{
dirfullnametmp=m_tree_ctrl.GetItemText(tmp2)+"//"+dirfullnametmp;
tmp=tmp2;
}
//AfxMessageBox(dirfullnametmp);
return dirfullnametmp;
}
BOOL DocumentManagement(LPCTSTR lpszFromPath,LPCTSTR lpszToPath,INT method)
{
int nLengthFrm = strlen(lpszFromPath);
char *NewPathFrm = new char[nLengthFrm+2];
strcpy(NewPathFrm,lpszFromPath);
NewPathFrm[nLengthFrm] = '/0';
NewPathFrm[nLengthFrm+1] = '/0';
SHFILEOPSTRUCT FileOp;
ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
FileOp.fFlags = FOF_NOCONFIRMATION ;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = NewPathFrm;
FileOp.pTo = lpszToPath;
FileOp.wFunc = method;//FO_COPY; FO_DELETE;FO_MOVE; FO_RENAME;
return SHFileOperation(&FileOp) == 0;
}
//-----------------------------------------------------------------------------------------------
优化函数
//-----------------------------------------------------------------------------
void CWebVampireDlg::Onbtdiropen()
{
WinExec("explorer.exe "+GetFullname(), SW_SHOWNORMAL); //速度快
}
//-------------------------------------------------------------------------------
改目录结构,只操作文件夹,跟文件对应的文件夹显示为文件。
D:/WEBVAMPIRE(改目录结构,改文件操作函数)/数据库
├─HTML--JS
├─vc++
│ ├─VC中动态改变控件和对话框字体(大小)_成功只有一个:按照自己的方式,去度过一生~~~
│ │ │ VC中动态改变控件和对话框字体(大小)_成功只有一个:按照自己的方式,去度过一生~~~.htm
│ │ │
│ │ ├─file
│ │ │ Icon_4.ico
│ │ │ Icon_5.ico
│ │ │
│ │ └─image
│ │ hhhh.png
│ │
│ └─预览(成功)
│ │ 预览(成功).htm
│ │
│ ├─file
│ │
│ └─image
│
├─单片机
└─电脑基础
//--------------------------------------------------------------------------------------------------
void CWebVampireDlg::BrowseDir(CString strDir,HTREEITEM parent)
{
CFileFind ff;
CString szDir = strDir;
HTREEITEM hSubItem;
if(szDir.Right(1) != "//")
szDir += "//";
szDir += "*.*";
BOOL res = ff.FindFile(szDir);
while( res )
{
res = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())
{
CString strPath = ff.GetFilePath();
CString strTitle = ff.GetFileTitle();
if(strTitle!="image"&&strTitle!="file") //不处理资源目录"image"和"file"
{
hSubItem = m_tree_ctrl.InsertItem(strTitle, parent);
m_tree_ctrl.SetItemImage(hSubItem,2,3);
BrowseDir( strPath, hSubItem );
}
else
{
m_tree_ctrl.SetItemImage(parent,0,1);//底层目录显示为文件图标。
}
}
/*不再处理文件
else if(!ff.IsDirectory() && !ff.IsDots())
{
CString strTitle = ff.GetFileName();//GetFileTitle();
hSubItem =m_tree_ctrl.InsertItem( strTitle, parent );
m_tree_ctrl.SetItemImage(hSubItem,0,1);
}
*/
}
ff.Close();
}
//------------------------------------------------------------------------------------------------
复制HtmlCtrl.h和HtmlCtrl.cpp到工程目录。添加到工程(“工程”-“增加到工程”-“文件”)。
在StdAfx.h最后“#endif”之前添加
//--------------------------
#include <afxhtml.h>
//---------------------------
在edithtmlDlg.h添加。
//--------------------------------------------------------------------
#include "HtmlCtrl.h"
//--------------------------------------------------------------------
//--------------------------------------------------------------------
protected:
CHtmlCtrl m_page;
//---------------------------------------------------------------
在OnInitDialog()添加:
//--------------------------------------------------------------------
VERIFY(m_page.CreateFromStatic(IDC_STATIC_web, this));
//-----------------------------------------------------------------------
每次选中树时显示网页。
TVN_SELCHANGED
/-----------------------------------------------------------------------------------
void CWebVampireDlg::OnSelchangedTREElist(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(!m_tree_ctrl.GetChildItem(m_tree_ctrl.GetSelectedItem()))
{
//WinExec("explorer.exe "+GetFullname()+"//"+m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem())+".htm", SW_SHOWNORMAL); //速度快
//m_page.Navigate2("/""+GetFullname()+"//"+m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem())+".htm/"");
//m_page.Navigate2("D://WebVampire(改目录结构,改文件操作函数)//数据库//vc++//预览(成功)//预览(成功).htm");
/*获得路径第一种方法。
char buf[255];
GetCurrentDirectory(sizeof(buf),buf);
//path=path+"//数据库//vc++//预览(成功)//预览(成功).htm";
CString aaa=buf;
aaa+="//"+GetFullname()+"//"+m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem())+".htm";
AfxMessageBox(aaa);
m_page.Navigate2(aaa);
*/
CString path;
GetCurrentDirectory(MAX_PATH,path.GetBuffer(MAX_PATH));
path.ReleaseBuffer();
path+="//"+GetFullname()+"//"+m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem())+".htm";
AfxMessageBox(path);
m_page.Navigate2(path);
}
*pResult = 0;
}
//---------------------------------------------------------------------------------------------------
最大化、最小化、还原
WM_SIZE
//--------------------------------------------------------------------------------------------------
void CWebVampireDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType == SIZE_RESTORED) //还原
{
m_tree_ctrl.GetWindowRect(&rect_treelist);
this->ScreenToClient(&rect_treelist);
rect_treelist.bottom=cy;
m_tree_ctrl.MoveWindow(rect_treelist);
m_page.GetWindowRect(rect_static_web);
this->ScreenToClient(&rect_static_web);
rect_static_web.right=cx;
rect_static_web.bottom=cy;
m_page.MoveWindow(rect_static_web);
}
if(nType == SIZE_MAXIMIZED) //最大化
{
m_tree_ctrl.GetWindowRect(&rect_treelist);
pstatic->GetWindowRect(rect_static_web);
this->ScreenToClient(&rect_treelist);
this->ScreenToClient(&rect_static_web);
rect_static_web.right=cx-5;
rect_static_web.bottom=cy-5;
rect_treelist.bottom=cy-5;
m_tree_ctrl.MoveWindow(rect_treelist);
(*pstatic).MoveWindow(rect_static_web);
}
}
//--------------------------------------------------------------------------------------------------
/-----显示部分完成-----/
添加编辑对话框
IDD_ANLINHTMLEDIT_DIALOG
修改树右键菜单函数
//----------------------------------------------
void CWebVampireDlg::OnMAdd()
{
// TODO: Add your command handler code here
/*
CString stradd;
GetDlgItemText(IDC_EDIT_add,stradd);
AfxMessageBox(stradd);
if(stradd=="")return;
CString strItem=stradd;
HTREEITEM hItem=m_tree_ctrl.GetSelectedItem();
m_tree_ctrl.InsertItem(strItem,hItem);
m_tree_ctrl.Expand(hItem,TVE_EXPAND);
AfxMessageBox("添加!");
*/
CanlinHtmlEditDlg adddlg;
adddlg.DoModal();
}
//----------------------------------------------
测试可以弹出。
为对话框IDD_ANLINHTMLEDIT_DIALOG添加类CanlinHtmlEditDlg,基类CDialog,文件名anlinHtmlEditDlg.h。
添加资源
//-------------------------------------------------------------------------------------------
ANLINHTMLEDIT.HTM HTML DISCARDABLE "res//anlinHtmlEdit//anlinHtmlEdit.htm"
CUT.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Cut.gif"
COPY.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Copy.gif"
PASTE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Paste.gif"
UNDO.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Undo.gif"
REDO.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Redo.gif"
TX.GIF HTML DISCARDABLE "res//anlinHtmlEdit//TX.gif"
A4.GIF HTML DISCARDABLE "res//anlinHtmlEdit//a4.gif"
A5.GIF HTML DISCARDABLE "res//anlinHtmlEdit//a5.gif"
A16.GIF HTML DISCARDABLE "res//anlinHtmlEdit//a16.gif"
A17.GIF HTML DISCARDABLE "res//anlinHtmlEdit//a17.gif"
BOLD.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Bold.gif"
ITALIC.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Italic.gif"
UNDERLINE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Underline.gif"
DELLINE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//DelLine.gif"
LEFT.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Left.gif"
CENTER.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Center.gif"
RIGHT.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Right.gif"
NUMBERLIST.GIF HTML DISCARDABLE "res//anlinHtmlEdit//NumberList.gif"
LIST.GIF HTML DISCARDABLE "res//anlinHtmlEdit//List.gif"
OUTDENT.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Outdent.gif"
INDENT.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Indent.gif"
ALINE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//aline.gif"
LINK.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Link.gif"
UNLINK.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Unlink.gif"
LINE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Line.gif"
IMG.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Img.gif"
TABLE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Table.gif"
CODE.GIF HTML DISCARDABLE "res//anlinHtmlEdit//Code.gif"
//---------------------------------------------------------------------------------------
给CanlinHtmlEditDlg类添加
//**********************
#include "HtmlCtrl.h"
//***********************
//****************************
CHtmlCtrl m_anlinedithtmlpage;
//******************************
OnInitDialog()
//----------------------------------------------------------------------
VERIFY(m_anlinedithtmlpage.CreateFromStatic(IDC_HTMLVIEW, this));
m_anlinedithtmlpage.LoadFromResource(_T("ANLINHTMLEDIT.HTM"));
//-----------------------------------------------------------------
解决CHtmlView中载入的网页采用iframe编辑模式无法输入回车
在HtmlCtrl.h中添加
//------------------------------------------------------------------------
virtual BOOL PreTranslateMessage(MSG* pMsg) ;
//------------------------------------------------------------------------
在HtmlCtrl.cpp中添加
//----------------------------------------------------------------------------------
BOOL CHtmlCtrl::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN ||pMsg->wParam == VK_ESCAPE))
{
::TranslateMessage(pMsg);
}
return CHtmlView::PreTranslateMessage(pMsg);
}
//-----------------------------------------------------------------------------------
(现在虽然iframe编辑模式下回车正常了,不过源代码模式的回车相当于2次回车了,待解决)
#include <atlbase.h>
CComModule _Module; // 由于要使用 CComDispatchDriver ATL的智能指针,
// 所以声明它是必须的
#include <mshtml.h> // 所有 IHTMLxxxx 的接口声明
#include <atlcom.h>
2种方法获得CHtmlView的IHTMLDocument2接口
/*
//---------------方法1--------------------------------
IHTMLDocument2 *m_pHtmlDoc2=NULL;
LPDISPATCH lpDispatch;
lpDispatch=m_page.GetHtmlDocument();
ASSERT(lpDispatch);
//get html document from IDispatch
HRESULT hr=lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&m_pHtmlDoc2);
if(m_pHtmlDoc2!=NULL) m_pHtmlDoc2->get_body(&pDocElem);
else AfxMessageBox("m_pHtmlDoc2==NULL");
*/
///*
//-----------------------------方法2-----------------------------------------
IHTMLDocument2 *pDoc=(IHTMLDocument2 *)(m_anlinedithtmlpage.GetHtmlDocument());
// if(pDoc!=NULL) pDoc->get_body(&pDocElem);
// else AfxMessageBox("pDoc==NULL");
//------------------------------------------------------------------------
//*/
ifarme内容.即编辑内容源码,只有body部分。
//----------------------------------------------------------------------------------
IHTMLFramesCollection2 *pFramesCollection=NULL;
pDoc->get_frames(&pFramesCollection);
VARIANT varindex,varresult;
varresult.vt=VT_DISPATCH;
varindex.vt = VT_I4;
varindex.lVal=0;
pFramesCollection->item(&varindex, &varresult);
IHTMLDocument2 *pFrameDoc=NULL;
IHTMLWindow2 *pHTMLWnd=NULL;
((LPDISPATCH)varresult.ppdispVal)->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pHTMLWnd);
pHTMLWnd->get_document(&pFrameDoc);
pFrameDoc->get_body(&pDocElem);
if(pDocElem)
{
// ASSERT(SUCCEEDED(hr));
BSTR bstrHTML;
pDocElem->get_outerHTML(&bstrHTML);
pDocElem->Release();
USES_CONVERSION;
MessageBox(OLE2T(bstrHTML),_T("源文件"));
SysFreeString(bstrHTML);
}
//---------------------------------------------------------------------------------------
2种方法执行js
//--------------------------------------------------------------------------------------------
IHTMLDocument2 *pDoc=(IHTMLDocument2 *)(m_page.GetHtmlDocument());
/*
//----------------------第一种方法------------
if (pDoc != NULL)
{
IDispatch *spDisp = NULL;
HRESULT hr = pDoc->get_Script(&spDisp);
if (spDisp)
{
// Evaluate is the name of the script function.
OLECHAR FAR* szMember = L"selectAll";
DISPID dispid;
HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);
if (SUCCEEDED(hr))
{
COleVariant vtResult;
static BYTE parms[] = VTS_BSTR;
COleDispatchDriver dispDriver(spDisp, FALSE);
dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT,
(void*)&vtResult, parms,
"5+9");
CString rest;
rest.Format("%d",vtResult.lVal);
AfxMessageBox(rest);
}
}
}
*/
//----------------------第2种方法------------
if (pDoc != NULL)
{
IDispatch *pdis = NULL;
HRESULT hr = pDoc->get_Script(&pdis);
CComVariant avarParams[5] = {"123","456","789","000"};
DISPPARAMS dispParams = {avarParams, NULL, 2, 0};
//-----------------------参数数组, ,参数个数,
UINT nArgErr = (UINT)-1; // initialize to invalid arg
CComVariant result;
EXCEPINFO excepInfo;
if(pdis)
{
DISPID tmpDispID = 0;
LPOLESTR func = L"selectAll"; // javascript 函数名
hr = pdis->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &tmpDispID);
if(S_OK == hr)
hr = pdis->Invoke(tmpDispID, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
CString rest;
//rest.Format("%d",result.lVal);
rest=result.bstrVal;
AfxMessageBox(rest);
}
}
//-------------------------------------------------------------------------------------------------
函数化调用执行js
.h
//-------------------------------------------------------------------------------------------
struct tagVARIANT * runjs(LPOLESTR func,struct tagVARIANT * avarParams,int nn);
//--------------------------------------------------------------------------------------------
.cpp
//-----------------------------------------------------------------------------------------------
struct tagVARIANT * CanlinHtmlEditDlg::runjs(LPOLESTR func,struct tagVARIANT * avarParams,int nn)
{
IHTMLDocument2 *pDoc=(IHTMLDocument2 *)(m_anlinedithtmlpage.GetHtmlDocument());
/*
//----------------------第一种方法------------
if (pDoc != NULL)
{
IDispatch *spDisp = NULL;
HRESULT hr = pDoc->get_Script(&spDisp);
if (spDisp)
{
// Evaluate is the name of the script function.
OLECHAR FAR* szMember = L"selectAll";
DISPID dispid;
HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);
if (SUCCEEDED(hr))
{
COleVariant vtResult;
static BYTE parms[] = VTS_BSTR;
COleDispatchDriver dispDriver(spDisp, FALSE);
dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT,
(void*)&vtResult, parms,
"5+9");
CString rest;
rest.Format("%d",vtResult.lVal);
AfxMessageBox(rest);
}
}
}
*/
CComVariant result;
if (pDoc != NULL)
{
IDispatch *pdis = NULL;
HRESULT hr = pDoc->get_Script(&pdis);
DISPPARAMS dispParams = {avarParams, NULL, nn, 0};
//-----------------------参数数组, ,参数个数,
UINT nArgErr = (UINT)-1; // initialize to invalid arg
EXCEPINFO excepInfo;
if(pdis)
{
DISPID tmpDispID = 0;
//LPOLESTR func = L"selectAll"; // javascript 函数名
hr = pdis->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &tmpDispID);
if(S_OK == hr)
hr = pdis->Invoke(tmpDispID, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
// CString rest;
//rest.Format("%d",result.lVal);
// rest=result.bstrVal;
// AfxMessageBox(rest);
}
}
return &result;
}
//----------------------------------------------------------------------------------------------------------
调用测试
void CanlinHtmlEditDlg::OnButton4()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"selectAll";
CComVariant Params[5] = {"123","456","789","000"};
CComVariant *result=(CComVariant *)runjs(func,Params,3);
//参数逆序,即当个数为2时,"456"为第一参数,"123"为第二参数
//当个数为3时,"789"为第一参数,"456"为第二参数,"123"为第三参数
CString rest;
//rest.Format("%d",result.lVal);
rest=result->bstrVal;
AfxMessageBox(rest);
}
保存
void CanlinHtmlEditDlg::OnButton5()
{
// TODO: Add your control notification handler code here
IHTMLDocument2 *pDoc=(IHTMLDocument2 *)(m_anlinedithtmlpage.GetHtmlDocument());
IHTMLWindow2 *pHTMLWnd=NULL;
IHTMLDocument2 *pFrameDoc=NULL;
IHTMLFramesCollection2 *pFramesCollection=NULL;
LPDISPATCH lpDispatch;
long p;
VARIANT varindex,varresult;
varresult.vt=VT_DISPATCH;
varindex.vt = VT_I4;
// pDoc->
if(pDoc!=NULL)
{
HRESULT hr=pDoc->get_frames(&pFramesCollection);
if(SUCCEEDED(hr)&&pFramesCollection!=NULL)
{
hr=pFramesCollection->get_length(&p);
if(SUCCEEDED(hr))
for(int i=0; i<p; i++)
{
varindex.lVal = i;
if(pFramesCollection->item(&varindex, &varresult) ==S_OK)
{
lpDispatch=(LPDISPATCH)varresult.ppdispVal;
if (SUCCEEDED(lpDispatch->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pHTMLWnd)))
{
if(SUCCEEDED(pHTMLWnd->get_document(&pFrameDoc)))
{
//work with the pFrameDoc...
IHTMLElement* pDocElem=NULL;
hr = pFrameDoc->get_body(&pDocElem);
if(pDocElem)
{
// ASSERT(SUCCEEDED(hr));
BSTR bstrHTML;
pDocElem->get_outerHTML(&bstrHTML);
pDocElem->Release();
USES_CONVERSION;
UpdateData();
WinExec("cmd.exe /c md /""+savehtmlfilepath+m_edit_title+"/"",SW_SHOWNORMAL);
::Sleep(100);
WinExec("cmd.exe /c md /""+savehtmlfilepath+m_edit_title+"//image/"",SW_SHOWNORMAL);
::Sleep(100);
WinExec("cmd.exe /c md /""+savehtmlfilepath+m_edit_title+"//file/"",SW_SHOWNORMAL);
::Sleep(100);
CFile mFile2(_T(savehtmlfilepath+m_edit_title+"//"+m_edit_title+".htm"), CFile::modeWrite|CFile::modeCreate);
mFile2.Write(OLE2T(bstrHTML),lstrlenW(bstrHTML));
mFile2.Flush();
mFile2.Close();
MessageBox("成功");
MessageBox(OLE2T(bstrHTML), _T("源文件"));
SysFreeString(bstrHTML);
}
pFrameDoc->Release();
}
pHTMLWnd->Release();
pHTMLWnd=NULL;
}
}
}
pFramesCollection->Release();
}
pDoc->Release();
}
}
载入
void CanlinHtmlEditDlg::OnButton6()
{
// TODO: Add your control notification handler code here
//document.getElementById("HtmlEditor").src=file2.value
LPOLESTR func = L"jseval";
CComVariant Params[5];
CString dd="document/.getElementById/(/"HtmlEditor/"/)/.src/=/"D/:00/.htm/"";
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
}
void CanlinHtmlEditDlg::OnButton6()
{
// TODO: Add your control notification handler code here
//document.getElementById("HtmlEditor").src=file2.value
LPOLESTR func = L"openfile";
CComVariant Params[5];
CString dd=savehtmlfilepath+"//"+m_edit_title+".htm";
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
}
完善“添加”
void CWebVampireDlg::OnMAdd()
{
// TODO: Add your command handler code here
CString path;
GetCurrentDirectory(MAX_PATH,path.GetBuffer(MAX_PATH));
path.ReleaseBuffer();
path+="//"+GetFullname()+"//";
AfxMessageBox(path);
CanlinHtmlEditDlg adddlg;
adddlg.savehtmlfilepath=path;
adddlg.DoModal();
HTREEITEM hItemsel=m_tree_ctrl.GetSelectedItem();
CString hItemseltext = m_tree_ctrl.GetItemText(hItemsel);
CString hItemfullname=GetFullname();
HTREEITEM hItemselparent=m_tree_ctrl.GetParentItem(hItemsel);
m_tree_ctrl.DeleteItem(hItemsel);
HTREEITEM hItemselparent22=m_tree_ctrl.InsertItem(hItemseltext,hItemselparent);
m_tree_ctrl.SetItemImage(hItemselparent22,2,3);
BrowseDir(hItemfullname, hItemselparent22);//只刷新修改部分,提高效率
m_tree_ctrl.Expand(hItemselparent22,TVE_EXPAND);
}
设置标题
void CanlinHtmlEditDlg::Ontitle()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"settitle";
CComVariant Params[5];
UpdateData();
Params[0]=CComVariant(m_edit_title);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
}
设置原始链接
void CanlinHtmlEditDlg::OnsavefromURL()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"getalink";
CComVariant Params[5];
UpdateData();
CString dd=m_edit_title;
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
}
设置相关文件
void CanlinHtmlEditDlg::Onlockfile()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"getfile";
CComVariant Params[5];
UpdateData();
CString dd=m_edit_lockfile;
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
}
由于修改标题并不能立刻看到,故放到EN_KILLFOCUS消息中
void CanlinHtmlEditDlg::OnKillfocusEDITtitle()
{
// TODO: Add your control notification handler code here
Ontitle();
}
修改原始链接和相关文件实时性高,放到EN_CHANGE中
void CanlinHtmlEditDlg::OnChangeEDITsaveformURL()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
OnsavefromURL();
}
void CanlinHtmlEditDlg::OnChangeEDITlockfile()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
Onlockfile();
}
添加“相关文件”的“浏览”按钮处理(如果是文件夹,则需在编辑框手动修改)
void CanlinHtmlEditDlg::OnBUTTONlockfile()
{
// TODO: Add your control notification handler code here
CFileDialog FDlg(TRUE , "*.*" , NULL , OFN_HIDEREADONLY , "所有文件(*.*) |*.*||" );
if(FDlg.DoModal() == IDOK)
{
m_edit_lockfile = FDlg.GetPathName();
UpdateData(false);
Onlockfile();
}
}
图片本地化处理
void CanlinHtmlEditDlg::OnButton8()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"imgsrc2";
CComVariant Params[5];
CComVariant *result=(CComVariant *)runjs(func,Params,0);
}
图片保存
void CanlinHtmlEditDlg::OnButton9()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"getIframeImgURL";
CComVariant Params[5];
CComVariant *result=(CComVariant *)runjs(func,Params,0);
CString rest,appname;
rest=result->bstrVal;
//AfxMessageBox(rest);
for(int i=0;AfxExtractSubString(appname,rest,i,' ');i++)
{
//AfxExtractSubString(appname, fullstring, i, ' '); // 取出第i个子串
if(appname!="")
downloadimg(appname);
}
}
#include <afxinet.h>
bool CanlinHtmlEditDlg::downloadimg(CString imgurl)
{
CString szFile;
//szFile="http://www.baidu.com/img/logo-yy.gif";
// UpdateData(TRUE);
szFile=imgurl;//m_fileurl;
char filebuf[512];
CInternetSession netSession;
CStdioFile *fTargFile;
fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
// 在当前目录创建新的目标文件
CFile fDestFile(savehtmlfilepath+m_edit_title+"//image//"+fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
int byteswrite; // 写入文件的字节数
while (byteswrite = fTargFile->Read(filebuf, 512)) // 读取文件
{
fDestFile.Write(filebuf, byteswrite); // 将实际数据写入文件
}
fDestFile.Close();
// AfxMessageBox("下载完成");
return true;
}
删除确认
void CWebVampireDlg::OnMDel()
{
// TODO: Add your command handler code here
// AfxMessageBox("删除:"+GetFullname());
/*
WinExec("cmd.exe /c rd /s /q /""+GetFullname()+"/"",SW_SHOWNORMAL);
WinExec("cmd.exe /c del /q /""+GetFullname()+"/"",SW_SHOWNORMAL);
*/
if(IDYES == MessageBox("确认删除?","确认删除",MB_YESNO))
{
// AfxMessageBox("111");
DocumentManagement(GetFullname(),"",FO_DELETE);
HTREEITEM hItem=m_tree_ctrl.GetSelectedItem();
m_tree_ctrl.DeleteItem(hItem);
m_tree_ctrl.Expand(hItem,TVE_EXPAND);
}
}
创建目录
#include <direct.h>
void CWebVampireDlg::OnButton2()
{
// TODO: Add your control notification handler code here
int aa=mkdir("c://000000");//0成功,-1已存在
CString rest;
rest.Format("%d",aa);
AfxMessageBox(rest);
}
改进“js保存”
#include <direct.h>
void CanlinHtmlEditDlg::Onsave()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"jseval";
CComVariant Params[5];
CString dd="window/.frames/[/"HtmlEditor/"/]/.document/.getElementsByTagName/(/"html/"/)/[0/].innerHTML/;";
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
CString rest;
//rest.Format("%d",result.lVal);
rest=result->bstrVal;
AfxMessageBox(rest);
/*
UpdateData();
WinExec("cmd.exe /c md /""+savehtmlfilepath+m_edit_title+"/"",SW_SHOWNORMAL);
::Sleep(100);
WinExec("cmd.exe /c md /""+savehtmlfilepath+m_edit_title+"//image/"",SW_SHOWNORMAL);
::Sleep(100);
WinExec("cmd.exe /c md /""+savehtmlfilepath+m_edit_title+"//file/"",SW_SHOWNORMAL);
::Sleep(100);
*/
mkdir(savehtmlfilepath+m_edit_title);//0成功,-1已存在
mkdir(savehtmlfilepath+m_edit_title+"//image");//0成功,-1已存在
mkdir(savehtmlfilepath+m_edit_title+"//file");//0成功,-1已存在
CFile mFile2(_T(savehtmlfilepath+m_edit_title+"//"+m_edit_title+".htm"), CFile::modeWrite|CFile::modeCreate);
mFile2.Write(rest,rest.GetLength());
mFile2.Flush();
mFile2.Close();
MessageBox("保存完成");
}
修正“编辑”路径
void CWebVampireDlg::OnMEdit()
{
// TODO: Add your command handler code here
CString path;
GetCurrentDirectory(MAX_PATH,path.GetBuffer(MAX_PATH));
path.ReleaseBuffer();
CString fullname=GetFullname();
int intpoint = fullname.ReverseFind('//');
path+="//"+fullname.Left(intpoint)+"//";
// AfxMessageBox(path);
CanlinHtmlEditDlg adddlg;
adddlg.savehtmlfilepath=path;
adddlg.m_edit_lockfile="file";
adddlg.isedit=TRUE;
adddlg.m_edit_title=m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem());
adddlg.DoModal();
GetCurrentDirectory(MAX_PATH,path.GetBuffer(MAX_PATH));
path.ReleaseBuffer();
path+="//"+GetFullname()+"//"+m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem())+".htm";
// AfxMessageBox(path);
m_page.Navigate2(path);
}
void CanlinHtmlEditDlg::OnButton6()
{
// TODO: Add your control notification handler code here
//document.getElementById("HtmlEditor").src=file2.value
LPOLESTR func = L"openfile";
CComVariant Params[5];
CString dd=savehtmlfilepath+"//"+m_edit_title+"//"+m_edit_title+".htm";
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
}
“编辑”提取原始链接
void CanlinHtmlEditDlg::OnButton10()
{
// TODO: Add your control notification handler code here
LPOLESTR func = L"jseval";
CComVariant Params[5];
CString dd="window/.frames/[/"HtmlEditor/"/]/.document/.getElementById/(/"原始链接/"/)/.href/;";
// CString dd="window/.frames/[/"HtmlEditor/"/]/.document/.getElementsByTagName/(/"html/"/)/[0/].innerHTML/;";
Params[0]=CComVariant(dd);
CComVariant *result=(CComVariant *)runjs(func,Params,1);
CString rest;
//rest.Format("%d",result.lVal);
rest=result->bstrVal;
m_edit_saveformURL=rest;
UpdateData(false);
}
“编辑”初始化
OnInitDialog()添加
SetTimer(1,100,NULL);
定时器
void CanlinHtmlEditDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{
OnButton6();
SetTimer(2,100,NULL);
KillTimer(1);
}
else
{
OnButton10();
KillTimer(2);
}
CDialog::OnTimer(nIDEvent);
}
完成处理
void CanlinHtmlEditDlg::OnOK() //完成
{
// TODO: Add extra validation here
Ontitle();
OnsavefromURL();
Onlockfile();
OnButton9() ;//保存图片
OnButton8() ;//图片本地化
Onsave() ;//保存
CDialog::OnOK();
}
右键菜单“重命名”
树属性选中“编辑卷标”
void CWebVampireDlg::OnMRname()
{
// TODO: Add your command handler code here
m_tree_ctrl.EditLabel(m_tree_ctrl.GetSelectedItem());
}
编辑完处理文件
TVN_ENDLABELEDIT
void CWebVampireDlg::OnEndlabeleditTREElist(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
//m_page.Navigate2();
m_page.Navigate2("");
CString oldtreelabelname=m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem());
CString olddir=GetFullname();
// AfxMessageBox(olddir+"//"+oldtreelabelname+".htm");
m_tree_ctrl.SetItem(&pTVDispInfo->item);
CString newtreelabelname=m_tree_ctrl.GetItemText(m_tree_ctrl.GetSelectedItem());
CString newdir=GetFullname();
// AfxMessageBox(newdir+"//"+newtreelabelname+".htm");
if(olddir!=newdir)
{
// AfxMessageBox("重命名");
DocumentManagement(olddir,newdir,FO_MOVE);
DocumentManagement(newdir+"//"+oldtreelabelname+".htm",newdir+"//"+newtreelabelname+".htm",FO_MOVE);
m_page.Navigate2(newdir+"//"+newtreelabelname+".htm");
}
else
{
m_page.Navigate2(olddir+"//"+oldtreelabelname+".htm");
}
*pResult = 0;
}
右键菜单"添加类"
#include <direct.h>
void CWebVampireDlg::OnMAddg()
{
// TODO: Add your command handler code here
CString path;
GetCurrentDirectory(MAX_PATH,path.GetBuffer(MAX_PATH));
path.ReleaseBuffer();
path+="//"+GetFullname()+"//";
HTREEITEM hItemnew=m_tree_ctrl.InsertItem("新加分类", m_tree_ctrl.GetSelectedItem());
mkdir(path+"新加分类");//0成功,-1已存在
CFile mFile2(_T(path+"新加分类//新加分类.htm"), CFile::modeCreate);
mFile2.Close();
m_tree_ctrl.Expand(m_tree_ctrl.GetSelectedItem(),TVE_EXPAND);
m_tree_ctrl.SetItemImage(hItemnew,2,3);
m_tree_ctrl.SelectItem(hItemnew);
m_tree_ctrl.EditLabel(hItemnew);
}
===============================================================================================================================================================================
================================================================================================================================================================================
增加“后退”“前进”“主页”“转到”“地址栏”
按钮“后退”IDC_BUTTON_back
按钮“前进”IDC_BUTTON_Forward
按钮“主页”IDC_BUTTON_Home
按钮“转到”IDC_BUTTON_gogo 控制变量 m_bt_gogo
编辑框 “地址栏”IDC_EDIT_url 控制变量 m_bt_url 字符变量m_go_url
void CWebVampireDlg::OnOK()
{
// TODO: Add extra validation here
OnBUTTONgogo() ;
CDialog::OnOK();
}
void CWebVampireDlg::OnBUTTONback()
{
// TODO: Add your control notification handler code here
m_page.GoBack();
}
void CWebVampireDlg::OnBUTTONForward()
{
// TODO: Add your control notification handler code here
m_page.GoForward();
}
void CWebVampireDlg::OnBUTTONgogo()
{
// TODO: Add your control notification handler code here
UpdateData();
CString url=m_go_url;
m_page.Navigate2(m_go_url);
}
void CWebVampireDlg::OnBUTTONHome()
{
// TODO: Add your control notification handler code here
m_page.GoHome();
}
界面控制
BOOL CWebVampireDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//--------------------------------------------------------------------
VERIFY(m_page.CreateFromStatic(IDC_STATIC_web, this));
//-----------------------------------------------------------------------
//AfxMessageBox("init");
//-------------------------------------------------------
b_lbtdown=FALSE;
b_spliter=FALSE;
pstatic=GetDlgItem(IDC_STATIC_web);
GetClientRect(rect_maindlg);
m_tree_ctrl.GetClientRect(&rect_treelist); //取得控件的全屏坐标
pstatic->GetClientRect(rect_static_web);
rect_treelist.left=0;
rect_treelist.top=5;
rect_treelist.right=200;
rect_static_web.top=30;
rect_treelist.bottom=rect_maindlg.bottom-0;
rect_static_web.bottom=rect_maindlg.bottom-0;
rect_static_web.right=rect_maindlg.right-0;
rect_static_web.left=rect_treelist.right+6;
m_tree_ctrl.MoveWindow(rect_treelist);
(*pstatic).MoveWindow(rect_static_web);
CRect buttonrect;
GetDlgItem(IDC_BUTTON_back)->GetClientRect(&buttonrect);
buttonrect.left=rect_treelist.right+6;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_back)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+50;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_Forward)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+94;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_Home)->MoveWindow(buttonrect);
buttonrect.left=rect_maindlg.right-96;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=rect_maindlg.right-100;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
//----------------------------------------------------------------
Onbtdirtree() ;
return TRUE; // return TRUE unless you set the focus to a control
}
void CWebVampireDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//--------------------------------------------
POINT pt;
GetCursorPos(&pt);//取得当前鼠标坐标。
//ClientToScreen(&pt);
//ScreenToClient(&pt);//换算到窗口坐标。
m_tree_ctrl.GetWindowRect(&rect_treelist); //取得控件的全屏坐标。
pstatic->GetWindowRect(rect_static_web);
//this->ScreenToClient(&rect_treelist);
//m_tree_ctrl.GetClientRect(rect_treelist);
if((pt.x > rect_treelist.right) && (pt.x < rect_treelist.right+6))//当鼠标处于IDC_STATIC_web和IDC_TREE_list中间时。
{
SetCursor(LoadCursor(NULL,IDC_SIZEWE));//设置鼠标样式,左右箭头样式IDC_SIZEWE。
b_spliter=TRUE; //鼠标在分界线上,可以拖动,也就是可以调节分界线位置。
}
else
{
b_spliter=FALSE;//鼠标不在分界线上,不可以拖动。
}
if(b_lbtdown&&(pt.x > rect_treelist.left+10)&&(pt.x < rect_static_web.right-10 ))//当鼠标左键按下时调节分割条,并且不能超出树跟静态框的边界。
{
rect_treelist.right=pt.x-3;//调节树控件IDC_TREE_list的最右边保持鼠标坐标-3的位置。
this->ScreenToClient(&rect_treelist); //换算到屏幕坐标。
m_tree_ctrl.MoveWindow(rect_treelist);//
rect_static_web.left=pt.x+3;
this->ScreenToClient(&rect_static_web);
(*pstatic).MoveWindow(rect_static_web);
CRect buttonrect;
GetDlgItem(IDC_BUTTON_back)->GetClientRect(&buttonrect);
buttonrect.left=rect_treelist.right+6;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_back)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+50;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_Forward)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+94;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_Home)->MoveWindow(buttonrect);
GetClientRect(rect_maindlg);
if(rect_static_web.Width()>382)
{
buttonrect.left=rect_maindlg.right-96;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=rect_maindlg.right-100;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
}
else
{
buttonrect.left=rect_treelist.right+292;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=buttonrect.left+150;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
}
Invalidate(FALSE);
}
//-------------------------------------------
CDialog::OnMouseMove(nFlags, point);
}
void CWebVampireDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialog::OnSizing(fwSide, pRect);
// TODO: Add your message handler code here
//----------------------------------------------------
CRect rect(pRect);
m_tree_ctrl.GetWindowRect(&rect_treelist); //取得控件的全屏坐标
pstatic->GetWindowRect(rect_static_web);
rect_static_web.right=rect.right-5;
rect_static_web.bottom=rect.bottom-5;
rect_treelist.bottom=rect.bottom-5;
this->ScreenToClient(&rect_treelist);
m_tree_ctrl.MoveWindow(rect_treelist);
this->ScreenToClient(&rect_static_web);
(*pstatic).MoveWindow(rect_static_web);
CRect buttonrect;
GetDlgItem(IDC_BUTTON_back)->GetClientRect(&buttonrect);
buttonrect.left=rect_treelist.right+6;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_back)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+50;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_Forward)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+94;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_Home)->MoveWindow(buttonrect);
GetClientRect(rect_maindlg);
if(rect_static_web.Width()>382)
{
buttonrect.left=rect_maindlg.right-96;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=rect_maindlg.right-100;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
}
else
{
buttonrect.left=rect_treelist.right+292;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=buttonrect.left+150;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
}
// Invalidate();
// m_page.MoveWindow(rect_static_web);
// CString str,str2;
// str.Format("x1:%d,y1:%d,x2:%d,y2:%d",rect.top,rect.left,rect.right,rect.bottom);
// str2.Format("x1:%d,y1:%d,x2:%d,y2:%d",rect_treelist.top,rect_treelist.left,rect_treelist.right,rect_treelist.bottom);
//m_go_url=str;
//UpdateData(false);
// AfxMessageBox(str);
// SetDlgItemText(IDC_STATIC_web,str+"/n"+str2);
//-----------------------------------------------------
}
void CWebVampireDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType == SIZE_RESTORED) //还原
{
m_tree_ctrl.GetWindowRect(&rect_treelist);
this->ScreenToClient(&rect_treelist);
rect_treelist.bottom=cy;
m_tree_ctrl.MoveWindow(rect_treelist);
m_page.GetWindowRect(rect_static_web);
this->ScreenToClient(&rect_static_web);
rect_static_web.right=cx;
rect_static_web.bottom=cy;
m_page.MoveWindow(rect_static_web);
rect_static_web.right=cx-56;
rect_static_web.left=cx-96;
rect_static_web.top=0;
rect_static_web.bottom=28;
m_bt_gogo.MoveWindow(rect_static_web);
rect_static_web.left=rect_treelist.right+138;
rect_static_web.right=cx-100;
rect_static_web.top=5;
rect_static_web.bottom=25;
m_bt_url.MoveWindow(rect_static_web);
}
if(nType == SIZE_MAXIMIZED) //最大化
{
m_tree_ctrl.GetWindowRect(&rect_treelist);
pstatic->GetWindowRect(rect_static_web);
this->ScreenToClient(&rect_treelist);
this->ScreenToClient(&rect_static_web);
rect_static_web.right=cx-5;
rect_static_web.bottom=cy-5;
rect_treelist.bottom=cy-5;
m_tree_ctrl.MoveWindow(rect_treelist);
(*pstatic).MoveWindow(rect_static_web);
CRect buttonrect;
GetDlgItem(IDC_BUTTON_back)->GetClientRect(&buttonrect);
GetClientRect(rect_maindlg);
if(rect_static_web.Width()>382)
{
buttonrect.left=rect_maindlg.right-96;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=rect_maindlg.right-100;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
}
else
{
buttonrect.left=rect_treelist.right+292;
buttonrect.right=buttonrect.left+40;
GetDlgItem(IDC_BUTTON_gogo)->MoveWindow(buttonrect);
buttonrect.left=rect_treelist.right+138;
buttonrect.right=buttonrect.left+150;
buttonrect.top=5;
buttonrect.bottom=25;
GetDlgItem(IDC_EDIT_url)->MoveWindow(buttonrect);
}
}
}
结束!