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 扩展动态库
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 扩展动态库