可视化编程的小作业

来源:互联网 发布:.name域名 编辑:程序博客网 时间:2024/05/21 17:31

申明:请用这个的同学修改变量名函数名和删除注释,否则后果自负..........

可视化编程老师布置的题目:获取驱动器名和图标,插入到列表视图,而且可以随意切换视图风格。用线程让一个进度条走动,并可以随时终止这个线程,最终效果如下:

QQ截图未命名

实现过程:首先创建一个以学号命名的工程,选择单对话框模式,添加1个列表视图控件,1个进度条控件,1个下拉框控件,2个按钮。下拉框风格设置为下拉列表,数据哪里添加上图4项。命名控件(见图)

QQ截图未命名2

往对话框类里面 添加2个公有成员变量 1个公有函数 1个保护成员变量

public:
    CImageList bimage;//大图标
    CImageList image;//小图标
    void GetPen();//获取系统磁盘信息

protected:
    CWinThread* pThread;//线程指针

 

在类之外添加一个全局函数

UINT ThreadFunc(LPVOID lpParam);//线程执行函数

 

该函数实现代码:

  1. //////////////////////////////////////////////////////////////////////////
  2. //线程执行函数 传入要操作进度条
  3. //////////////////////////////////////////////////////////////////////////
  4. UINT ThreadFunc(LPVOID lpParam)
  5. {
  6.     CProgressCtrl* cp=(CProgressCtrl*) lpParam;//强制转换为进度条类
  7.     for (int i=0;i<100;i++)
  8.     {
  9.         cp->SetPos(i);//设置进度条光标位置
  10.         Sleep(50);//睡眠一下线程,让进度条走慢一点- -b
  11.     }   
  12.     return 0;
  13. }

线程这个功能已经实现一部分,我们跳过先去实现驱动器部分。在对话框类的OnInitDialog()中加入:

  1. m_ctrlProgress.SetRange(0,100);//定义进度条长度
  2. //初始化列表视图
  3. m_listMain.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE|LVS_EX_INFOTIP);
  4. m_listMain.InsertColumn(0,"名称",LVCFMT_LEFT,80); 
  5.     
  6. //创建大小图标
  7. image.Create(16,16,ILC_COLOR32,10,10);
  8. bimage.Create(32,32,ILC_COLOR32,10,10);
  9. //将图标与列表视图绑定
  10. m_listMain.SetImageList(&image,LVSIL_SMALL);
  11. m_listMain.SetImageList(&bimage,LVSIL_NORMAL);
  12. //获取驱动器信息
  13. GetPen();
  14.     
  15. //设置下拉列表为图标
  16. m_cmbView.SetCurSel(0);

为下拉框添加事件OnSelendok 并写入:

  1. LONG lStyle;     
  2. lStyle=GetWindowLong(m_listMain.m_hWnd,GWL_STYLE);//获取当前窗口类型     
  3. lStyle&=~LVS_TYPEMASK; //清除显示方式位 
  4. int i=m_cmbView.GetCurSel();//获取选择的显示方式 
  5. switch (i) 
  6. case 0: 
  7.     lStyle|=LVS_ICON; //大图标
  8.          break
  9. case 1: 
  10.     lStyle|=LVS_LIST;//列表 
  11.         break
  12. case 2: 
  13.     lStyle|=LVS_SMALLICON;//小图标 
  14.     break
  15. case 3: 
  16.     lStyle|=LVS_REPORT; //报告
  17.     break
  18. default
  19.     lStyle|=LVS_ICON; //大图标
  20.     break
  21. }        
  22. SetWindowLong(m_listMain.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型

实现GetPen函数:

  1.     CString str;
  2.     char Drivers[120];//用于保存所有驱动器名称
  3.     char* pDriver=NULL;//定义指针去读取单个驱动器名称
  4.     GetLogicalDriveStrings(120,Drivers);//获取所有驱动器名称 
  5.     
  6.     HICON bhIcon;//大图标
  7.     HICON shIcon;//小图标
  8.     //ExtractIconEx函数从指定DLL中提取图标
  9.     //第一个参数为要操作的DLL
  10.     //第二个参数为要获取图标的序号
  11.     //第三个参数为该图标要保存到那个图标上(大图标)
  12.     //第四个参数为该图标要保存到那个图标上(小图标)
  13.      
  14.     // 8 硬盘驱动器图标 
  15.     ExtractIconEx("SHELL32.DLL",8,&bhIcon,&shIcon,1);       
  16.     image.Add(shIcon);  //添加小图标到图像列表
  17.     bimage.Add(bhIcon); //添加大图标到图像列表
  18.     // 7 可移动的驱动器图标
  19.     ExtractIconEx("SHELL32.DLL",7,&bhIcon,&shIcon,1);       
  20.     image.Add(shIcon);  
  21.     bimage.Add(bhIcon);
  22.     // 9 网络驱动器图标 
  23.     ExtractIconEx("SHELL32.DLL",11,&bhIcon,&shIcon,1);      
  24.     image.Add(shIcon);  
  25.     bimage.Add(bhIcon);
  26.     // 11 CD-ROM驱动器图标
  27.     ExtractIconEx("SHELL32.DLL",9,&bhIcon,&shIcon,1);       
  28.     image.Add(shIcon);  
  29.     bimage.Add(bhIcon);
  30.     pDriver=Drivers;//指向驱动器名称头
  31.     DWORD Type=0;//驱动器类型
  32.     int i=0;//列表视图序号
  33.     int index=0;//图像列表序号 0为硬盘驱动器
  34.     while (strcmp(pDriver,""))
  35.     {
  36.         Type=GetDriveType(pDriver);//获取驱动器类别
  37.         switch (Type)
  38.         {
  39.         case DRIVE_REMOVABLE://移动驱动器
  40.             index=1;
  41.             break;
  42.         case DRIVE_CDROM://光盘
  43.             index=2;
  44.             break;
  45.         case DRIVE_REMOTE://网络驱动器       
  46.             index=3;
  47.             break;
  48.         }       
  49.         str.Format(pDriver);//把char转换为CString
  50.         str.Remove('//');//移除中的后面的斜杠
  51.         m_listMain.InsertItem(i,str,index);//插入到列表视图 index为图标序号     
  52.         pDriver+=strlen(pDriver)+1; //下一个驱动器    
  53.         i++;//下一项
  54.     }

好了,驱动器已经读取成功,开始写线程功能。一个按钮是开启线程,一个是终止线程。

开始按钮事件:

  1.          //开启一个线程
  2.     //第一个参数为要执行的函数名
  3.     //第二个参数为要操作的进度条(这个也是函数ThreadFunc的参数LPVOID lpParam)
  4.     //AfxBeginThread返回一个 CWinThread* 
  5.     //所以一开始定义一个成员变量去记录这个线程
  6.     //方便后面对该线程执行终止命令
  7.     pThread=AfxBeginThread(ThreadFunc,&m_ctrlProgress);

终止按钮事件:

  1. //TerminateThread终止线程
  2. //pThread->m_hThread为要操作的线程的句柄
  3. TerminateThread(pThread->m_hThread,0);
原创粉丝点击