//----------------------------------------------------------------------------------------
将应用程序加入到ie工具栏
1 运行输入(gpedit.msc) 启用组策略
2 选择本地计算机策略->用户配置->Internet Explorer维护->浏览器用户界面
3 浏览器工具栏自定义(双击)出现浏览器工具栏自定义对话框
4 在按钮选项卡中单击添加 出现浏览器工具栏按钮信息对话框
5 在工具栏标题内填入一个自己喜欢的名字 在工具栏中输入应用程序路径,接下来选择工具栏颜色
图标和工具栏灰度图标路径,单击浏览 定位到一个图标文件即可
6 单击确定回到主窗口
工具栏图标在注册表中的位置是:"HKEY_LOCAL_MACHINE/Softwaret/Microsoft/Internet Explorer/Extensions"
双击ID
ButtonText:自定义按钮的显示文本
Default Visible:控制自定义按钮是否可见,一般为YES
Exec:自定义按钮执行的目标,可以为执行程序或超文本连接
HotIcon:鼠标一到按钮上的显示图标
Icon:定义一般情况的图标
MenuText:定义了鼠标指向浏览器工具栏菜单中的图标,在浏览器状态栏里面显示内容
MenuStatusBar:定义了当鼠标指向IE工具菜单中的相关选项时,在状态栏所显示的相关说明
//----------------------------------------------------------------------------------------
用程序实现:(2,4,5步骤)
1得到应用程序的路径和文件名
/*2获得程序的图标
HICON smalls;//小图标
HICON larges;//大图标
ExtractIconEx(LPCSTR(filename),0,&larges,&smalls,1);//获取应用程序中的图标
*/
/*3得到文件的CLSID
CLSID pclsid;
unsigned short *a=new unsigned short[pathname.GetLength()];
for(int i=0;i<filename.GetLength();i++)
{
a[i]=(unsigned short)(filename[i]);
}
if(GetClassFile(a,&pclsid)==MK_E_CANTOPENFILE)
{
}*/
4 调用GenerateRadomName产生键值
GenerateRadomName(CString &valuename)
{
char a[3];
int i=0;
valuename="{";
srand( (unsigned)time( NULL ) ); //以时间为种子
while(i<8)
{
i++;
a[0]=rand()%('9'-'0'+1)+'0';
a[1]=rand()%('z'-'a'+1)+'a';
a[2]=rand()%('Z'-'A'+1)+'A';
valuename=valuename+CString(a[rand()%3]);
}
valuename+="-";
i=0;
while(i<4)
{
i++;
a[0]=rand()%('9'-'0'+1)+'0';
a[1]=rand()%('z'-'a'+1)+'a';
a[2]=rand()%('Z'-'A'+1)+'A';
valuename=valuename+CString(a[rand()%3]);
}
valuename+="-";
i=0;
while(i<4)
{
i++;
a[0]=rand()%('9'-'0'+1)+'0';
a[1]=rand()%('z'-'a'+1)+'a';
a[2]=rand()%('Z'-'A'+1)+'A';
valuename=valuename+CString(a[rand()%3]);
}
valuename+="-";
i=0;
while(i<4)
{
i++;
a[0]=rand()%('9'-'0'+1)+'0';
a[1]=rand()%('z'-'a'+1)+'a';
a[2]=rand()%('Z'-'A'+1)+'A';
valuename=valuename+CString(a[rand()%3]);
}
valuename+="-";
i=0;
while(i<12)
{
i++;
a[0]=rand()%('9'-'0'+1)+'0';
a[1]=rand()%('z'-'a'+1)+'a';
a[2]=rand()%('Z'-'A'+1)+'A';
valuename=valuename+CString(a[rand()%3]);
}
valuename+="}";
}
5想上面的信息写入注册表
AddEventSource(CString keyname, CString pathname, CString filename)
{
HKEY hk;
CString buffer;
CString CLSID="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}";
//创建一个子键,子键名称是keyname
if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software//Microsoft//Internet Explorer//Extensions//"+keyname
,&hk)!=ERROR_SUCCESS)
{
AfxMessageBox("Cann't Create Key!");
return ;
}
//Button text 键值设置,显示按钮文本
buffer="Button Text";
if(RegSetValueEx(hk,// subkey handle
buffer,// value name
0,// must be zero
REG_SZ, // value type
(CONST BYTE*)((LPCSTR)filename),// pointer to value data
filename.GetLength() // length of value data
)!=ERROR_SUCCESS)
{
AfxMessageBox("Cannot Set Value");
}
//CLSID
if (RegSetValueEx(hk, // subkey handle
"CLSID", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)CLSID), // pointer to value data
CLSID.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value");
}
buffer="Yes";
if (RegSetValueEx(hk, // subkey handle
"Default visible", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)buffer), // pointer to value data
buffer.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value !");
}
// Exec
if (RegSetValueEx(hk, // subkey handle
"Exec", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)pathname), // pointer to value data
pathname.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value !");
}
// HotIcon
if (RegSetValueEx(hk, // subkey handle
"HotIcon", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)(pathname+",001")), // pointer to value data
pathname.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value !");
}
// Icon
if (RegSetValueEx(hk, // subkey handle
"Icon", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)(pathname+",002")), // pointer to value data
pathname.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value !");
}
// MenuStatusBar
if (RegSetValueEx(hk, // subkey handle
"MenuStatusBar", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)filename), // pointer to value data
filename.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value !");
}
// MenuText
if (RegSetValueEx(hk, // subkey handle
"MenuText", // value name
0, // must be zero
REG_SZ, // value type
(CONST BYTE *)((LPCSTR)filename), // pointer to value data
filename.GetLength())!=ERROR_SUCCESS) // length of value data
{
AfxMessageBox("Cannot Set Value !");
}
RegCloseKey(hk);
}
/
超级连接的实现:
因为CStatic本身是没有超链接功能的,采用的方法是从CStatic类中继承一个子类;
子类完成以下功能:
(1):相应鼠标移动消息;
(2):鼠标左键按下消息;
(3):实现对静态文本框种颜色的绘制:
(4):实现Shell功能,启动外部程序;
注意:
1 CStatic类本身无法获得任何鼠标消息,可以利用SetWindowLong函数直接修改窗口风格,这里添加一个一个消息SS_NOTIFY的窗口
2 afx_msg HBRUSH CtlColor(CDC* pDC,UINT nCtlColor);
ON_WM_CTLCOLOR_REFLECT()
HBRUSH CHyperLinker::CtlColor(CDC* pDC, UINT nCtlColor)
{
ASSERT(nCtlColor==CTLCOLOR_STATIC);
DWORD dwStyle=GetStyle();
if(!(dwStyle&SS_NOTIFY))
{
::SetWindowLong(m_hWnd,GWL_STYLE,dwStyle|SS_NOTIFY);
}
HBRUSH hbr=NULL ;
if ((dwStyle & 0xFF) <= SS_RIGHT)
{
// Modify the font to be underline
if (!((HFONT) m_Font))
{
LOGFONT lf;
GetFont()->GetObject(sizeof(lf), &lf);
lf.lfUnderline = m_bUnderLine;
m_Font.CreateFontIndirect(&lf);
}
pDC->SelectObject(&m_Font);
//set the text colors
if(m_bVisited==TRUE)
{
pDC->SetTextColor(m_VisitedColor);
// AfxMessageBox("Click");
}
else
{
if(m_bAboveControl==TRUE)
{
pDC->SetTextColor(m_CoverColor);
// AfxMessageBox("Above");
}
else
{
pDC->SetTextColor(this->m_InitColor);
}
}
pDC->SetBkMode(TRANSPARENT);
hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}
return hbr;
}
3 virtual void PreSubclassWindow();
//修改静态文本框的窗口属性
void CHyperLinker::PreSubclassWindow()
{
//获得鼠标事件
DWORD dwStyle = GetStyle();
::SetWindowLong(GetSafeHwnd(),GWL_STYLE,dwStyle|SS_NOTIFY);
CStatic::PreSubclassWindow();
}
4 该变鼠标形状函数:
BOOL CHyperLinker::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
HCURSOR LinkCursor = ::AfxGetApp()->LoadCursor(IDC_CURSOR1);
::SetCursor(LinkCursor);
return TRUE; //必须包括这句话
return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
//-----------------------
IE收藏夹:
原理:
首先调用Shell API函数SHGetSpecialFolderPath(),其中的CSIDL参数设为CSIDL_FAVORITES,这样获得收藏夹的路径名,接着扫描路径下的所有URL文件并递归的扫描所有文件,然后获取一个字符串列表,记录了刚才所扫描出来的所有URL名称和文件夹名,将这个字符串列表组合成一个菜单栏,最后利用ON_COMMAND_RANGE消息相应用户对收藏夹选项的选择
注意:
afx_msg void OnFavorite(UINT nID);
ON_COMMAND_RANGE(0xe00,0xfff,OnFavorite)
void CMainFrame::OnFavorite(UINT nID)
{
((CMyBrowserxxView*)GetActiveView())->Navigate2(m_astrFavoriteUrls[nID-0xe00],0,NULL);
}
ON_COMMAND_RANGE是一个宏,它可以使得多个命令符号在同一个消息处理函数中的到处理
步骤:
1
CStringArray m_astrFavoriteUrls;//收藏夹字符串列表
int BuildFavoritesMenu(LPCTSTR pszPath,int nStartPos,CMenu *pMenu);
afx_msg void OnFavorite(UINT nID);//选择列表后的消息相应
2 在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里添加:
//生成“我的收藏夹”子菜单
char path[MAX_PATH];
CMenu* pMenu;
//开始消去存在的菜单
pMenu=GetMenu()->GetSubMenu(4);
TRACE("%d",pMenu->GetMenuItemCount());
while(pMenu->DeleteMenu(0, MF_BYPOSITION));/**/
SHGetSpecialFolderPath(NULL,path,CSIDL_FAVORITES,FALSE);
//添加我的收藏菜单项
BuildFavoritesMenu(path, 0, pMenu);
3
构建收藏夹菜单的函数
int CMainFrame::BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu *pMenu)
{
CString strPath(pszPath);
CString strPath2;
CString str;
WIN32_FIND_DATA wfd;
HANDLE h;
int nPos;
int nEndPos;
int nNewEndPos;
int nLastDir;
TCHAR buf[400];
CStringArray astrFavorites;
CStringArray astrDirs;
CMenu* pSubMenu;
// 确定有'//'字符
if(strPath[strPath.GetLength() - 1] != _T('//'))
strPath += _T('//');
strPath2 = strPath;
strPath += "*.*";
// 首先扫描 .URL 然后扫描子目录
h = FindFirstFile(strPath, &wfd);
if(h != INVALID_HANDLE_VALUE)
{
nEndPos = nStartPos;
do
{
//如果是文件 插入到文件夹列表
//--------------------------------------------------------------------------------------------------------
//非目录文件,非隐藏属性,非系统属性
if((wfd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
{
str = wfd.cFileName;
if(str.Right(4) == _T(".url"))
{
// an .URL file is formatted just like an .INI file, so we can
// use GetPrivateProfileString() to get the information we want
::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"),
_T(""), buf, 400,
strPath2 + str);
str = str.Left(str.GetLength() - 4);
// scan through the array and perform an insertion sort
// to make sure the menu ends up in alphabetic order
也就是按一定排序进行插入
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
if(str.CompareNoCase(astrFavorites[nPos]) < 0)
break;
}
astrFavorites.InsertAt(nPos, str);
m_astrFavoriteUrls.InsertAt(nPos, buf);
++nEndPos;
}
}
}while(FindNextFile(h, &wfd));
FindClose(h);
//--------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------
// Now add these items to the menu
for(nPos=nStartPos;nPos<nEndPos;++nPos)
{
pMenu->AppendMenu(MF_STRING | MF_ENABLED,0xe00+nPos,astrFavorites[nPos]);
}
//--------------------------------------------------------------------------------------------
nLastDir = 0;
h = FindFirstFile(strPath, &wfd);
ASSERT(h != INVALID_HANDLE_VALUE);
do
{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//是文件夹
{
//忽略当前路径和父路径节点
if(lstrcmp(wfd.cFileName,_T("."))==0 || lstrcmp(wfd.cFileName,_T(".."))==0)
continue;
for(nPos = 0 ; nPos < nLastDir ; ++nPos)
{
if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
break;
}
//创建弹出式菜单
pSubMenu=new CMenu;
pSubMenu->CreatePopupMenu();
//递归找出所有文件
nNewEndPos = BuildFavoritesMenu(strPath2 + wfd.cFileName, nEndPos, pSubMenu);
if(nNewEndPos != nEndPos)
{
// only intert a submenu if there are in fact .URL files in the subdirectory
nEndPos = nNewEndPos;
pMenu->InsertMenu(nPos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)pSubMenu->m_hMenu, wfd.cFileName);
pSubMenu->Detach();
astrDirs.InsertAt(nPos, wfd.cFileName);
++nLastDir;
}
delete pSubMenu;
}
}while(FindNextFile(h,&wfd));
FindClose(h);
}
return nEndPos;
}