WebVampire(网页编辑管理工具)开发全纪录(提供源码)

来源:互联网 发布:python 余弦相似 编辑:程序博客网 时间:2024/06/05 04:09

http://download.csdn.net/source/2062491

 

 

本作品主旨:

方便的管理网页资料,直接从网页中复制内容,并且可进行简单编辑,可根据需要去掉广告等信息。

 

 

主要实现了网页文件的所见即所得与源码2种模式的编辑,以及vc与js通讯。(功能部分主要以JS实现);浏览器基本功能。

 

 

自动完成:

  1.  
    1. 设置标题。
    2. 设置原始链接。
    3. 设置相关文件。
    4. 自动在但前分类目录下创建以标题命名的目录,其下层又创建以标题命名的htm文件、image文件夹、file文件夹。
    5. 网页中的图片自动下载到image目录。
    6. 图片的链接替换为本地图片链接,并添加命令使得双击图片可以打开原始图片链接。

其他功能:

  • 可以通过右键菜单直接管理资料文件。
  • "编辑"时自动导入原文件并填写标题、链接等内容。
  • 编辑时“原始链接”随输入实时更新。
  • 主页面实现了手动分割窗口、拖动边框调整窗口时动态调整布局,以及最大化、最小化、还原时窗口的动态调整。
  • 遍历文件到树中显示,并根据需要设置不同图标。
  • 当目录发生变化时(复制、剪切、删除、添加等),可以部分重新遍历,提高效率。
  • 对文件操作(复制、剪切、删除)等实现函数封装。
  • 对网页中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);
 }  
 }


}
结束!

原创粉丝点击