MFC第十二天

  1 列表 ListCtrl
    1.1 MFC相关
      CListCtrl - 父类是CWnd,封装了List View Ctrl的
        API和消息
      * CListView - 父类是CView,是一个视图,相当于在一个View中包含了一个CListCtrl,是CView的子类,可以从
        中获取CListCtrl。<GetListCtrl这个函数来获取视图中的列表控件>
        2风格
        CListCtrl::ModifyStyle   修改样式
        CListCtrl::SetImageList  设置图标
        设置数据项的文本:SetItemText
        
    1.2 List Ctrl的样式
      1.2.1 ICON
      1.2.2 Small Icon
      1.2.3 List
      1.2.4 Report View
    1.3 使用
      1.3.1 创建
        CListCtrl::Create 创建控件
      1.3.2 样式
      1.3.3 增加项和列
        CListCtrl::InsertItem
        CListCtrl::InsertColumn
      1.3.4 获取项
        CListCtrl::GetNextItem
        CListCtrl::FindItem
      1.3.5 删除项或列
        CListCtrl::DeleteItem
        CListCtrl::DeleteAllItems
        CListCtrl::DeleteColume
      1.3.6 List排序
        CListCtrl::SortItems
        需要定义一个排序函数传递给
        SortItems
      1.3.7 消息 
      1.3.8 EDITLABLE
         1) 增加 LVS_EDITLABELS 风格
         2)要处理
            LVN_BEGINLABELEDIT
            LVN_ENDLABELEDIT
      1.3.9 ItemData  附加数据
         SetItemData
         GetItemData

1.先添加一个列表框,然后在上面添加一个组合框〈用来操作列表框的显示〉在data中添加数据:图标;小图标;列有;详细;
2.添加成员变量 m_wndStyle   m_wndList
3.在OnInitDialog函数中完成初始化控件操作,添加成员函数InitListCtrl,在OnInitDialog中调用一下即可。
4.添加两个成员变量,CImageList m_ilNormal;//图标列表  CImageList m_ilSmall;//小图标列表插入两个Bitmap资源。IDB_NORMAL,IDB_SMALL。正常下添加两个32*32的图标,一个红色,一个黄色。在同一个位图中我们设置两个图标。接着设置小图标。18*18
void CDlgBaseControlDlg::InitListCtrl(void)
{
//设置控件的图标列表
     m_ilNormal.Create(IDB_Normal,31,1,RGB(0,0,0));
m_ilSmall.Create(IDB_Small,15,1,RGB(0,0,0));//注意这里大小的设置一定要改动
m_wndList.SetImageList(&m_ilNormal,LVSIL_NORMAL);
m_wndList.SetImageList(&m_ilSmall,LVSIL_SMALL);
//设置列
m_wndList.InsertColumn(0,_T("名称"),LVCFMT_LEFT,150);
m_wndList.InsertColumn(1,_T("大小"), LVCFMT_LEFT,80);
m_wndList.InsertColumn(2,_T("类型"), LVCFMT_LEFT,80);
m_wndList.InsertColumn(3,_T("修改日期"), LVCFMT_LEFT,100);
    //插入测试数据
    m_wndList.InsertItem(0,_T("文件"),1);
m_wndList.InsertItem(1,_T("文件夹"),0);
    m_wndList.SetItemText(0,1,_T("125"));
m_wndList.SetItemText(0,2,_T("类型"));
 m_wndList.SetItemText(0,3,_T("2012-9-19"));
  m_wndList.SetItemText(1,1,_T("1255"));
   m_wndList.SetItemText(1,2,_T("文件夹"));
m_wndList.SetItemText(1,3,_T("2013-3-2"));
}
5.为Combo Box添加事件处理程序<设置其中的数据不允许字母排序,按照添加的顺序。将sort设为FALSE即可>
void CDlgBaseControlDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
int nSel=m_wndStyle.GetCurSel();
switch(nSel){
 case 0://图标
 m_wndList.ModifyStyle(LVS_SMALLICON|LVS_REPORT|LVS_LIST,LVS_ICON);
 break;
 case 1://小图标
 m_wndList.ModifyStyle(LVS_ICON|LVS_REPORT|LVS_LIST,LVS_SMALLICON);
 break;
 case 2://列表
 m_wndList.ModifyStyle(LVS_SMALLICON|LVS_REPORT|LVS_ICON,LVS_LIST);
 break;
 case 3://详细
 m_wndList.ModifyStyle(LVS_SMALLICON|LVS_ICON|LVS_LIST,LVS_REPORT);
 break;
}
}
6.在OnInitDialog函数中,初始化combo Box的初始值
m_wndStyle.SetCurSel(3);
/
让上述程序能够展示出C盘根目录下的内容。添加成员函数void ShowData(CString strPath);
void CDlgBaseControlDlg::ShowData(CString strPath)
{
//使用CFileFind类获取数据添加到CListCtrl
//添加数据前,清空原有的数据 
m_wndList.DeleteAllItems();
CFileFind find;
int index=0;//数据项的索引
BOOL bRet=find.FindFile(strPath+_T("*.*"));
while (bRet)
{
bRet=find.FindNextFile();
if(find.IsDirectory()){
m_wndList.InsertItem(index,find.GetFileName(),0);
m_wndList.SetItemText(index,2,_T("文件夹"));
}
else{
          m_wndList.InsertItem(index,find.GetFileName(),1);
 ULONGLONG nLen=find.GetLength();
CString strLen;
 strLen.Format(_T("\t%I64u byte(s)"),nLen);
 m_wndList.SetItemText(index,1,strLen);
 
}
//保存文件路径
        CString *pPath=new CString ;
*pPath=find.GetFilePath();
m_wndList.SetItemData(index,(DWORD)pPath);
       index++;
}
find.Close();//结束查找
}

实现功能,当双击时,打开该文件夹.为列表框添加事件处理程序,消息为On_DBCLK
void CDlgBaseControlDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;
// TODO: 在此添加控件通知处理程序代码
    //获取双击时选择的数据项
int nSel=pNMItemActivate->iItem;
if (-1!=nSel)
{
CString *pPath=(CString *)m_wndList.GetItemData(nSel);
ShowData(*pPath);
}
*pResult = 0;


}

实现功能,查找并删除查找到的文件
LVFINDINFO info;
info.flags=LVFI_STRING|LVFI_PARTIAL;
info.psz="12";
int index=m_wndList.FindItem(&info,-1);
if(index!=-1){
m_wndList.DeleteItem(index);
}
//设置背景色初始化时
m_wndList.SetBkColor(RGB(200,200,200));
m_wndList.SetTextColor(RGB(255,0,0));
m_wndList.SetTextBkColor(CLR_NONE);
//设置背景图片
m_wndList.SetBkImage("f:\\a.bmp");如果想要加入这样一张照片,需要在InitInstance加一个OLE库初始化操作。
OleInitialize(NULL);
///
2 树控件 TreeCtrl
 2.1 TreeCtrl MFC相关
   CTreeCtrl - 父类是CWnd,昌一个控件 封装了Tree View Ctrl的
        API和消息
   * CTreeView - 是CView的子类,可以从
        中获取CTreeCtrl。<GetTreeCtrl>
2.2 CTreeCtrl的使用
  2.2.2 增加节点
    CTreeCtrl::InsertItem
  2.2.3 获取
    GetSelectedItem - 获取被选择的节点
    GetRootItem - 得到根节点
  2.2.4 删除节点
    DeleteItem
    DeleteAllItem
  2.2.5 消息
  2.2.6 EDITLABLE
    1) 增加 TVS_EDITLABELS 风格
    2)增加消息处理
      TVN_BEGINLABELEDIT
      TVN_ENDLABELEDIT 
  2.2.7 ItemData
    GetItemData
    SetItemData

风格,更多的是使用属性来设置。也可以设置它的图标。
GetRootItem
GetParentItem
GetSelectedItem
//
//也使用它来查看C盘下的内容
1.拖放一个树控件来对话框上来,然后可以调节它的属性。has lines,has buttons,lines at root
2.添加函数来处理树控件的初始化。void InitTreeCtrl().添加图标,并为树控件绑定成员变量。
void CDlgBaseControlDlg::InitTreeCtrl(void)
{
//设置控件的图标列表
m_ilSmall.Create(IDB_Small,15,1,RGB(0,0,0));
m_wndTree.SetImageList(&m_ilSmall,TVSIL_NORMAL);
//添加测试数据
HTREEITEM hRoot=m_wndTree.InsertItem(_T("北京市"),0,1);
HTREEITEM hCY=m_wndTree.InsertItem(_T("朝阳区"),0,1,hRoot);
HTREEITEM hHB=m_wndTree.InsertItem(_T("海滨区"),0,1,hRoot);
//设置数据项的高度
m_wndTree.SetItemHeight(25);
//在根结点展开
m_wndTree.Expand(hRoot,TVE_EXPAND);
}


3.添加成员函数用来显示C盘中数据,ShowData2(CString strPath,HTREEITEM htree);
//设置数据项的高度
m_wndTree.SetItemHeight(25);
HTREEITEM hRoot=m_wndTree.InsertItem(_T("c:\\"),0,1);
ShowData2(_T("c:"),hRoot);
//在根结点展开
m_wndTree.Expand(hRoot,TVE_EXPAND);
}


void CDlgBaseControlDlg::ShowData2(CString strPath, HTREEITEM htree)
{
CFileFind find;
BOOL bRet=find.FindFile(strPath+_T("\\*.*"));
while(bRet){
      HTREEITEM hItem;//插入节点的节点句柄
       bRet=find.FindNextFile();
  CString strName=find.GetFileName();
 if(!find.IsDots())// 如果不是点目录
 {
 if(find.IsDirectory()){
 hItem=m_wndTree.InsertItem(strName,0,1,htree);
 }
 else{
             hItem=m_wndTree.InsertItem(strName,0,1,htree);   
 }
 }
}
find.Close();
}
实验功能,双击目录的时候展示它下面的结点
1.添加树控件的双击事件 消息NM_DBCLIK
 //保存路径
 CString *pPath=new CString ;
 *pPath=find.GetFilePath();
 m_wndTree.SetItemData(hItem,(DWORD)pPath);
 }
}
find.Close();
}


void CDlgBaseControlDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hCurItem=m_wndTree.GetSelectedItem();
//使用路径
CString *pPath=(CString *)m_wndTree.GetItemData(hCurItem);
ShowData2(*pPath,hCurItem);
*pResult = 0;
}
//防止重复添加代码
在ShowData2函数的最前面添加
if(m_wndTree.ItemHasChildren(hParent)){
return;
}
///
进程和线程     
四   MFC线程
      1.线程分类
      工作者线程:没有界面,一般用来处理后台比较耗时的操作。
               2.1定义线程函数
                   线程函数要么是全局函数,要么是类的静态成员函数。
                2.2调用AfxBeginThread函数,指定线程函数
 //
 //这里我们仍然选择基于对话框的应用程序。界面上创建一个按钮,当点击按钮的时候,创建出一个工作线程。中间一个列表框(ListBox),最下面是一个用户线程按钮。为两个按钮添加事件处理程序.为列表框绑定成员函数。
 //线程函数
UINT WorkerThreadProc(LPVOID lParam){
    CDlgBaseControlDlg  *pDlg=(CDlgBaseControlDlg*)lParam;
for(int i=0;i<10;i++){
pDlg->m_wndListBox1.AddString(_T("hello worker"));
  Sleep(100); 
}
return 0;
}
void CDlgBaseControlDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
      AfxBeginThread(WorkerThreadProc,this);//this表示主线程
}
 ///      
      用户界面线程:拥有自己的界面,能够对用户的操作做出响应。
       3.1定义CWinThread的子类<使用向导添加类,记得是添加MFC类>然后在InitInstance中添加代码。
        3.2新添加一个对话框资源,并双击添加一个类。
        BOOL CMyThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
   CMyDlg dlg;
   m_pMainWnd=&dlg;
   dlg.DoModal();
return TRUE;
}
//注意添加头文件
void CDlgBaseControlDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
     AfxBeginThread(RUNTIME_CLASS(CMyThread));
}
 对于工作者线程,当线程函数执行完毕时,该工作者线程会结束。
 对于用户级线程,当窗口关闭时,该线程也会自动结束。  
  












































/
二 MFC动态库


  1 MFC动态库的类型
    1.1 规则库 - 导出函数/自定义类
      1.1.1 静态链接MFC库的规则库
      1.1.2 动态链接MFC库的规则库
    1.2 扩展库 - 导出基于MFC的扩展类
      
2 规则库使用
 类似于Win32动态库的使用。
 
 在DLL中:
    MFC查找资源,需要获取资源HINSTANCE时,
    默认会获得当前EXE的HINSTANCE。所以,
    如果在EXE的HINSTANCE中,查找DLL
    资源的ID,会查找失败或者获取错误的
    资源数据。
 因此,需要在DLL的函数开始,增加
    
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    作用是将当前的默认资源HINSTANCE,由
    原来的EXE替换为当前所在DLL的HINSTANCE。
  
  2 扩展动态库
  
    
  









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值