admin管理员组文章数量:1642899
2024年7月16日发(作者:)
维普资讯
……
PROGR^啊LANGU柏El……………………………………………………………………………………………
l一蘩毫疆臻蠢|
。
羹簪鏊囊甏 蔼i 器 l 誓蠢ll囊囊 誊|聱|甏譬琶l一罄强疆羲篡 一 I 奠l |l警罄赣毯攀精
蠢 翻囊嚆蠢羹纛
t
翻
|。 .
摘要介绍在VC++6.0下开发迅雷批量下载列表生成器的全过程,生成多个通配符的
批量下载列表,并导入迅雷下载,可以起到事半功倍的效果。
关键词批量下载列表,VC,字符串
发思路是:首先通过MFC AppWizard新建一个基于对话框的工
程;然后添加相应的控件设计出界面,为控件添加消息响应;
在控件消息响应函数中添加相应代码,主要有通配符的识别,
列表生、导出列表文件等。
迅雷批量下载列表生成器的界面设计如图2所示。界面主
要的控件信息如表1所示。
一
、
引言
迅雷是目前的下载工具中用户最多的一款下载软件,其中
有一项功能是批量下载。所谓批量下载就是指只要指定一个初
始网络路径、通配符及取值范围,就可以在这个路径基础上自
动生成批量下载列表,方便用户批量下载具有规律网络路径的
文件。如图1就是迅雷的新建批量任务的界面。同时迅雷也支
持导入外部下载列表文件( .1st文件)来进行批量下载。
图2迅雷批量下载列表生成器的界面设计
表1迅雷批量下载列表生成器界面的主要控件元素设计
控件D
ⅡIc聊URL E击t
类型 功 B说明
初始网络路径输入框
mc-班 Sr^mNI触l
Ⅲ0脚Ⅱq 舢
E击t
E击t
E击t
E击t
E击t
Ij越B旺
PushButtm
PushButtm
PushButtm
第—个通配符的起始数字
第—个通配符的终止数字
第—个通配符的起始字母
第—个通配符的终止字母
第—个通配符的长度
列表显示框
生成列表按钮
导出列表文件按钮
退出按钮
E 脚r.s】l^K【1CH啪
mC IDIr丑虹髓IAR】
IDC_ED1T.WID'I ̄I
ECI玛T1
图1迅雷批量下载界面
从图1可以看出,迅雷的批量下载列表生成功能比较弱,因
E_c.明[N.a珏:A1[E
E_ 明[N E旺 fm玛T
E 瑚 IⅪr
为其只支持一个通配符的下载列表,当用户批量下载文件的网
络路径同时有两个或两个以上的可变值时,迅雷就无能为力
了。所以,为了解决这个问题,本文利用VC+4-6.0开发了迅雷
批量下载列表生成器。
迅雷批量下载列表生成器关键算法是自动识别通配符的个
数,并根据通配符的先后位置及字符范围来生成下载列表,设
计流程如图3所示。
二、设计思路
迅雷批量下载列表生成器基于MFC的对话框开发,其开
三、制作过程
新建一个基于MFC的对话框工程,工程名称叫Down—
维普资讯
…… … … H ……… …… …… 自………
实用第一 智慧密集
… ……… … … … … …… .…………………… …
List。添加如图2所示的控件,控件ID按照表1命名,并对控
件添加消息响应,如表2所示。
图3设计流程图
表2控件的消息映射
控件Ⅲ 消息类型 函数名称 说明
ⅢC.明 .C瑚帆 BN.cI 0l】B协( 强te 生成下载列表
IDC_BTI ̄.EXPORTLIST BN cI配Ⅺ 0nB咖 t 导出下载列表文件
ⅢC
.
皿邛.UⅢ| .a{ANGE  ̄tUrl 数
检测通配符的出现个
IDC
RADIO-COMMO ̄10 .a_JlCⅪED O did。c吐破啪l0 应
选择单选按钮时的响
.
ⅢC.IDⅡ聊Hl .a{ANGE  ̄tWidthl 输入数字宽度的响应
1.对话框初始化,定位到OnInitDialog()。
在return TRUE所在行的上一行添加如下代码:
DisableCommonCtrls():
//使设置范围控件初始时不可用DisableCommonCtrls
//函数的作用就是设置通配符的设置控件不可用,下面为
//CDownListDIg类添加成员函数DisableCommonCtrls():
void CDownListDIg::DisableCommonCtrls()
{
for(inti=O:i<36;i++)
{
HWND hWnd=::GetDIgltem(this一>m_hWnd,
lDC RADIO COMMON1O+i):
::EnableWindow(hWnd.FALSE):
//使控件呈灰色不可用状态
)
)
2.检测输入通配符的个数,为初始网络地址输入框的
CHANGE消息响应函数添加代码。
void CDownListDIg::OnChangeEdItUrl()
毫■螭毽技巧 与箍
{
UpdateData();//接收控件数据
int nCount=O://通配符计数器,初始为0
for( nti=O: <m ̄truRL.GetLenIgth():i++) 。
{
lf{m_strURL.M|d( ,1)== )
{ .
nCount+4-://通配符 的计数
)
)
lf(nCount>4)//目前只支持1—4个通配符,所以异常处理
//大于4个通配符的情况
{
MessageBox( 通配符个数1—4 );
)
m_nCommonNum=nCount;
UpdateData(faIse):
EnableWnd(nCount)
//根据通配符的个数确定控件的可用程度
)
其中EnableWnd函数的功能就是根据通配符的个数确定控
件的可用程度,实参nCount传入的就是输入的通配符个数,
EnableWnd函数定义如下:
voidCDownListDIg::EnableWnd(intnNum)
{
switch(nNum){
caseO:
{
DisableCommonCtrls(): //当没有通配符时,全部不可用
break;
)
case1:
{
DisableCommonCtrIs():
EnableCommonCtrll():
//当一个通配符时,使第一组设置控件可用
break;
)
case2:
(
DisableCommonCtrls():
EnableCommonCtrl 1():
EnableCommonCtrl2():
//当一个通配符时,使第一、二组设置控件可用
break;
)
case3:
{
DisableCommonCtrls():
EnableCommonCtrl 1():
维普资讯
……-
PROG阻啊圳GUAGE…………………- ………………………………………………………………………¨
EnableCommonCtrl2():
EnableCommonCtrl3(): 。
//当一个通配符时 使第一、二、三组设置控件可用
break |
、jj1 _
| | ||
l
I
|j
O
isableCommo
n
Ctrls()1
||| 。
bleCommonCtrl 、 一 -
b。。r
eak;
。
| I
de fault:;
、|
、
1 。。| ・一 譬|≥
void CDownListDIg:t OnBtnCreate j
UpdateData()://接收控件数据 一
mJistBox ResetContent /, 空||-
/ 四个通配符将字符串分为5段,用数组str[5] ̄fltl。
intnl,n2,n3tn / 通 祷位置
n1=m
_
strURL。Find )://寻找第一通配符
|f(n :=一1】//如果没找到通配符。
if (n2
==-
)II; ̄t! II,lJl-'P*
|。
st r[1 l;
Mi nl。。
|l
叠一
;
m_st rUR L.Mid(nl 1
+
;/ /第二段 第二段字符串
| str[2、=~ 7,第3段字符晕| 。 。I
trURL. Mid(n2 +1);/ ./ ̄3段
。
str[4、:_
参 m
,,
_ :s
镩5段字符晕 j |
)
else
str【2\1 =m ̄tr"URL.Mid(n2  ̄ii n3-n2-1\) :l 。
等3段字符卑 |j
n4=m-strURL Find ’ +、、
if n4==一飞、
t 一一 ≯≯
【3l=m..s#URL Mid(n3+1);//第4段字符串
str 4、=一 /≯等5段字符
、
else
{
j 一
.11
、
"I"--
-)、 第5段字符晕I馨 。 .? |
|
、| |
、|j | 。|I -。 。
,记 起点终点 变量 蔷 魄I5骶薅暑 | 一 ||
int nStart、 ns rt2;nStart3. 她rt4; |0|
intnEndl,nEnd2;nEnd3 nEnd4;
|f(m ̄CommonlTy#e=:0)//如果为数字通配符≯一
ns an =r≤ rtNum ; _ r
、
else
{一
维普资讯
…… … . 一 … ……… -… ……………………
实用第一 智慧密集
………… ………… …… 一………… ….……… …
讦{m nCommon4Type::0)
{
nStart4:m_nStartNum4;
nEnd4=m
_
nEndNum4;
1
else
{
nStart4:m strStartChar4 GetAt(0)://获取ASII码值
nEnd4:m_strEndChar4.GetAt(0);//获取ASIl码值
)
//不同个数的通配符,循环的层数不同
switch《m_nCommonNum){
case 1://一个通配符时,一层循环
{
for《intl=nStartl:i<=nEndl;i++)
(
CString strTmp;
strTmp.Format《 %s%d%s ,str[0],i,str[1】)
m/istBox AddString《strTmp)
//为显示列表框添加生成的列表
)
break;
)
case2://两个通配符时,两层循环
{
for《intI=nStaR1:i<=nEnd i+4-)
{
for《intj=nStart2;j<=nEnd2;j十+)
{
CString strTmp;
strTm p|Format《 %S%d%s%d%s
str【OlJi.str【1 1.j,str[2】):
mJistBox AddStringlI(strTmp):
//为显示列表框添加生成的列表
)
}
break;
)
case3://--个通配符时,三层循环
{
for《int__nStartl:i<=nEnd i+十)
{
for《intj=nStart2;j<=nEnd2;j++)
{
for《intk=nStart3;k<=nEnd3;k+十)
《
CStringf strTmp;
strTmp.Format( %s%d%s%d%s%d%s ,
str[01,i.str【1】,j,str【2 k,str【3】):
m』stBox.AddString《strTmp);
型 i 与雏
)
break;
)
case4.://四个通配符时,四层循环
for《int nStartl:i<=nEnd1:i+十)
{
for《intj-=nStart2;j<:nEnd2;j++) 一
{
for《intk=nStart3;k<=nEnd3;k十牛)
for{intl:nStart4:l<:nEnd4 }++)
{
CString strTmp;
strTmp.Format( %s%d%s%d%s%d%s ,str[0].
i,str[11,jJ str[2】,k,str[3]):
m/istBox.AddString《strTmp);
1
)
) l
)
break;
)
default: 。
)
)
4 导出下载列表,为导出列表文件按钮单击消息响应函
数添加代码如下:
VOidI CDownListDIg::OnBtnE×portlist《)
{
if(m/istBox.GetCount1)=:0)
{
MessageBox{ 请先生成列表l )
return
\|
char szFilter【】 DownListFileS《 .1st)l .1stIAllFiles《}
.
)l . l I :
CFileDialogfdlg(false, BMP NULL OFN_HIDEREADONLY
\1OFN_OVERWRITEPROMPT.szFiIter1 。
if(fdIg DoModal《)}=IDOK)//弹出另存为文件对话框
retUm:
CString strFilePath=fdlg.GetPathName(): 0
CStdioFile file;
_f(j e.Open《strFilePath,CFile::modeCreate ICFile::mod-
eWrite、、
|
。
AfxMessageBox( 保存失败! j
returnl|
、 0
CString str;
file.SeekToBegin《 //将文件定位到文件开头 0
维普资讯
……a
PROG胁啊圳BII肺E||……………………………………………………………………………一……………
一 囊 for(inti O:i<mJistBox.GetCount();i++l
mJistB ̄xl GetText(1,stY);//从ListBQx ̄获取字符串羹参
filei W!dteString(str+ n l://将{ 符串写入文件畸
filel ClOSe 、
, 0
曩
MessageBox ‘导 茂勘、 。|
四、运行效果
本文测试过程中,使用初始路径为:http://
pic.edushi.con// ̄an//marppic/pngI/ , .png?t=3,其中
有两个通配符,利用本文开发的迅雷批量下载列表生成器生成
图4软件运行效果
批量下载列表,如图4所示。然后导出列表文件test.1st,最后
运行迅雷,选择菜单文件一导人下载列表..,将test.1st导人
迅雷即可下载,导入后效果如图5所示。
五、结语
本文开发的迅雷批量下载列表生成器是基于VC++6.0
的MFC开发的,应用了字符串和文件相关处理函数。使用该
软件用户可以方便地生成多个通配符的批量下载列表,配合迅
雷下载软件可以起到事半功倍的效果。
(收稿日期:2008年4月29日)
图5列表文件导入迅雷后下载效果 .
.
;
(上接第17页)
息利用几条简单的规则进行决策,这样,在蚁群这个集体里,
if(s ̄(UliI、s.WALL)i/责掩奄辔碍 I
retum ̄ 00; 一 曩0
|蠹萋|u ;
.麓
复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解
释的规律。
三、结语
,≯诗算克捂年各项参数镪馑 。 一蠢I 誓。
上面实现的蚂蚁算法只是大致模拟蚁群的觅食过程,真正
的蚂蚁觅食过程远比这个复杂,比如增加蚂蚁搬运食物的距离
和数量,蚂蚁在搬运食物发现更大的食物可能会丢弃原有食
5.播撒外激素规则
每只蚂蚁找到食物后会根据食物的数量播撒相应量的外激
素,以便其他蚂蚁能够更快得找到这堆食物。
retum ̄getFood *thresholds、0、 食 ≯ 毫0
+s getPheromone_Ii)thresholds[ ̄]/漶 爨|毫鬣
物,还可以增加蚂蚁搬运食物回蚁穴的最短路径的求解。同时
需要注意的是,由于蚁群算法觅食的过程,蚁群算法可能会过
早地收敛并陷入局部最优解。当然经过改进算法将会更优,希
望能起着“抛砖引玉”的作用,给大家一点启发和思路。
pr ̄atevoidputPheromQne_l(doubleamount)
getPherOmO ̄! t i
s. 诞ROMONE_LIMIT、 |≯蚤I
参考文献
l朱福喜 人工智能基础教程,2006年3月
2周书敬,孙红林,李慧敏.蚂蚁算法复杂性自组织分析与启示
【A].第八届中国青年运筹信息管理学者大会论文集【c],
2006年.
SQUARE bddPheromOSb_l amount);!!!iil|
从以上蚁群算法中各个要素的代码来看,实现蚁群算法并
不难。每只蚂蚁并不是像我们想象的需要知道整个环境的信
息。它们只关心很小范围内的眼前信息,而且根据这些局部信
(收稿13期:2008年3月2 13)
版权声明:本文标题:用VC制作迅雷批量下载列表生成器 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1721091949a860294.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论