申明:请用这个的同学修改变量名函数名和删除注释,否则后果自负..........
可视化编程老师布置的题目:获取驱动器名和图标,插入到列表视图,而且可以随意切换视图风格。用线程让一个进度条走动,并可以随时终止这个线程,最终效果如下:
实现过程:首先创建一个以学号命名的工程,选择单对话框模式,添加1个列表视图控件,1个进度条控件,1个下拉框控件,2个按钮。下拉框风格设置为下拉列表,数据哪里添加上图4项。命名控件(见图)
往对话框类里面 添加2个公有成员变量 1个公有函数 1个保护成员变量
public:
CImageList bimage;//大图标
CImageList image;//小图标
void GetPen();//获取系统磁盘信息protected:
CWinThread* pThread;//线程指针
在类之外添加一个全局函数
UINT ThreadFunc(LPVOID lpParam);//线程执行函数
该函数实现代码:
- //
- //线程执行函数 传入要操作进度条
- //
- UINT ThreadFunc(LPVOID lpParam)
- {
- CProgressCtrl* cp=(CProgressCtrl*) lpParam;//强制转换为进度条类
- for (int i=0;i<100;i++)
- {
- cp->SetPos(i);//设置进度条光标位置
- Sleep(50);//睡眠一下线程,让进度条走慢一点- -b
- }
- return 0;
- }
线程这个功能已经实现一部分,我们跳过先去实现驱动器部分。在对话框类的OnInitDialog()中加入:
- m_ctrlProgress.SetRange(0,100);//定义进度条长度
- //初始化列表视图
- m_listMain.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE|LVS_EX_INFOTIP);
- m_listMain.InsertColumn(0,"名称",LVCFMT_LEFT,80);
- //创建大小图标
- image.Create(16,16,ILC_COLOR32,10,10);
- bimage.Create(32,32,ILC_COLOR32,10,10);
- //将图标与列表视图绑定
- m_listMain.SetImageList(&image,LVSIL_SMALL);
- m_listMain.SetImageList(&bimage,LVSIL_NORMAL);
- //获取驱动器信息
- GetPen();
- //设置下拉列表为图标
- m_cmbView.SetCurSel(0);
为下拉框添加事件OnSelendok 并写入:
- LONG lStyle;
- lStyle=GetWindowLong(m_listMain.m_hWnd,GWL_STYLE);//获取当前窗口类型
- lStyle&=~LVS_TYPEMASK; //清除显示方式位
- int i=m_cmbView.GetCurSel();//获取选择的显示方式
- switch (i)
- {
- case 0:
- lStyle|=LVS_ICON; //大图标
- break;
- case 1:
- lStyle|=LVS_LIST;//列表
- break;
- case 2:
- lStyle|=LVS_SMALLICON;//小图标
- break;
- case 3:
- lStyle|=LVS_REPORT; //报告
- break;
- default:
- lStyle|=LVS_ICON; //大图标
- break;
- }
- SetWindowLong(m_listMain.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型
实现GetPen函数:
- CString str;
- char Drivers[120];//用于保存所有驱动器名称
- char* pDriver=NULL;//定义指针去读取单个驱动器名称
- GetLogicalDriveStrings(120,Drivers);//获取所有驱动器名称
- HICON bhIcon;//大图标
- HICON shIcon;//小图标
- //ExtractIconEx函数从指定DLL中提取图标
- //第一个参数为要操作的DLL
- //第二个参数为要获取图标的序号
- //第三个参数为该图标要保存到那个图标上(大图标)
- //第四个参数为该图标要保存到那个图标上(小图标)
- // 8 硬盘驱动器图标
- ExtractIconEx("SHELL32.DLL",8,&bhIcon,&shIcon,1);
- image.Add(shIcon); //添加小图标到图像列表
- bimage.Add(bhIcon); //添加大图标到图像列表
- // 7 可移动的驱动器图标
- ExtractIconEx("SHELL32.DLL",7,&bhIcon,&shIcon,1);
- image.Add(shIcon);
- bimage.Add(bhIcon);
- // 9 网络驱动器图标
- ExtractIconEx("SHELL32.DLL",11,&bhIcon,&shIcon,1);
- image.Add(shIcon);
- bimage.Add(bhIcon);
- // 11 CD-ROM驱动器图标
- ExtractIconEx("SHELL32.DLL",9,&bhIcon,&shIcon,1);
- image.Add(shIcon);
- bimage.Add(bhIcon);
- pDriver=Drivers;//指向驱动器名称头
- DWORD Type=0;//驱动器类型
- int i=0;//列表视图序号
- int index=0;//图像列表序号 0为硬盘驱动器
- while (strcmp(pDriver,""))
- {
- Type=GetDriveType(pDriver);//获取驱动器类别
- switch (Type)
- {
- case DRIVE_REMOVABLE://移动驱动器
- index=1;
- break;
- case DRIVE_CDROM://光盘
- index=2;
- break;
- case DRIVE_REMOTE://网络驱动器
- index=3;
- break;
- }
- str.Format(pDriver);//把char转换为CString
- str.Remove('//');//移除中的后面的斜杠
- m_listMain.InsertItem(i,str,index);//插入到列表视图 index为图标序号
- pDriver+=strlen(pDriver)+1; //下一个驱动器
- i++;//下一项
- }
好了,驱动器已经读取成功,开始写线程功能。一个按钮是开启线程,一个是终止线程。
开始按钮事件:
- //开启一个线程
- //第一个参数为要执行的函数名
- //第二个参数为要操作的进度条(这个也是函数ThreadFunc的参数LPVOID lpParam)
- //AfxBeginThread返回一个 CWinThread*
- //所以一开始定义一个成员变量去记录这个线程
- //方便后面对该线程执行终止命令
- pThread=AfxBeginThread(ThreadFunc,&m_ctrlProgress);
终止按钮事件:
- //TerminateThread终止线程
- //pThread->m_hThread为要操作的线程的句柄
- TerminateThread(pThread->m_hThread,0);