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 _ 

| | || 

|j

isableCommo

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) 

本文标签: 通配符下载列表批量控件