本文目录
- MFC入门书籍
- C++ MFC 如何获取和设置控件属性,比如获取button的caption
- c++中怎么使用MFC
- C++ mfc 新建excel文件
- 求MFC教程,关于进程的例如:编写程序像任务管理器那样获得某个进程的句柄数,和线程数
- 如何在Visual Studio 2015中创建MFC窗体应用
- C++中实现MFC风格的TRACE
MFC入门书籍
《VC++深入详解》和侯捷《深入浅出mfc》都是入门的必看书籍,没有哪个更好,看你更喜欢哪本书的表述方式。其它较好的书籍还有:
1、《windows程序设计》,讲win32 api的,了解了这个再看mfc会容易一点。
2、鸡啄米的《MFC教程》,对比学习,一般的控件基本都会用的。
3、《windows核心编程》,重中之重,要多看几遍。
MFC(英语:Microsoft Foundation Classes)是微软基础类库的简称,微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以,编译,调试,而不是使用多种工具轮换操作,灵活性较大。
MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西。
由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。
C++ MFC 如何获取和设置控件属性,比如获取button的caption
首先要知道这个控件的ID,通过ID来访问控件要想获得控件上的文本,可以用GetDlgItemText这个函数函数原型是int GetDlgItemText( int nID, CString& rString ) const;第一个参数是控件的ID,第二个参数是用来接收控件文本的字符串(CString类型的)
c++中怎么使用MFC
定义一个中文标点符号集合,然后扫描文档每个字符,如能在集合中搜到则用空格代替,否则不做处理
C++ mfc 新建excel文件
本文简略介绍在VC++6.0中如何使用Excel2003的库函数并对其进行编程。先创建一个对话框工程,命名为VCExcel。在对话框中添加一个按钮,控件ID为ID_RUNEXCEL。 再在该按钮上添加消息BN_CLICKED,其消息映射函数为OnRunexcel()。通过一个实例来说明VC是如何调用Excel2003的接口编程的。 要编程输出一个如下表格。
格式如下: 1、表头的字体为宋体,加粗,颜色为白色,底色为深蓝,垂直水平居中对齐; 2、表中正文内容字体为宋体,颜色为深蓝,底色为灰色,垂直水平居中对齐; 3、全部边框,文本自动换行。 在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()语句之后加入如下代码:
if(CoInitialize(NULL)==0)//初始化COM库 { AfxMessageBox("初始化COM失败!"); exit(1); }
在return FALSE;语句之前加入:::CoUninitialize();//释放COM库。 为了能调用Excel的接口我们打开MFC ClassWizard-》Automation-》Add Class-》From a type library,选择\EXCEL.exe,然后把所有的类都添加进去,头文件为excel.h,源文件为excel.cpp。当然,你也可以只把一些比较常用的类如_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range加进去,因为网上流传的绝大部分教程都只添加这几个类,这完全根据你个人的需要。但在本例中我们至少还要用到Interior类(设置底色),Font类(设置字体),而且这样做又简单又方便扩展功能,不管三七二十一全部弄进去吧!但这样做会有一个问题,有可能产生类的名字冲突,例如本来你自己写了一个类叫Font,当你全部添加时又再次加入了Font类,这样就重复定义了,不过可以通过名字空间来解决这个问题。再在VCExcelDlg.cpp文件的头部添加(如果系统已经自动添加就不要重复添加了):
#include "VCExcel.h" #include "comdef.h"
这样一来我们的程序就可以自由调用EXCEL了,一切准备就绪。 下面先在CVCExcelDlg中添加如下成员变量,用来操控Excel应用程序、工作簿和单元格。 A
Range m_ExlRge; _Worksheet m_ExlSheet; Worksheets m_ExlSheets; _Workbook m_ExlBook; Workbooks m_ExlBooks; _Application m_Exl
;
我们利用加载Excel模板来生成要求的表格,在本工程Debug文件夹中建立一个Excel文件,命名为Template.xls。我们的OnRunexcel()代码如下(详见注释):
void CVCExcelDlg::OnRunexcel() { // TODO: Add your control notification handler code here //用m_ExlApp对象创建Excel2003进程 if(!m_ExlApp.CreateDispatch("Excel.Application",NULL)) { AfxMessageBox("创建Excel服务失败!"); return; } //设置为可见 m_ExlApp.SetVisible(TRUE); ///////////////////下面得到应用程序所在的路径/////////////////// CString theAppPath,theAppName; char Path; GetModuleFileName(NULL,Path,MAX_PATH);//得到应用程序的全路径 theAppPath=(CString)Path; theAppName=AfxGetApp()-》m_pszAppName; theAppName+=".exe"; //把最后的文件名去掉 int length1,length3; length1=theAppPath.GetLength(); length3=theAppName.GetLength(); theAppPath.Delete(length1-length3,length3); //////////////////////////////////////////////////////////////// CString TempPath=""; TempPath=theAppPath+"Template.xls";//EXCEL模板的路径 m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE); m_ExlBook.AttachDispatch(m_ExlBooks.Add((_variant_t)TempPath),TRUE);//加载EXCEL模板 m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加载Sheet页面 //添加新的Sheet页面 m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing); //删除第二个Sheet页面 m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)2)),TRUE); m_ExlSheet.Delete(); //把第一个Sheet页面的名字改变为TestSheet m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE); m_ExlSheet.SetName("TestSheet"); ///////合并第一行单元格A1至D1////// //加载要合并的单元格 m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1")),TRUE); m_ExlRge.Merge(_variant_t((long)0)); ////////设置表格内容//////// m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);//加载所有单元格 m_ExlRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("数学系研究生课程统计")); m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)1),_variant_t("课程名")); m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)2),_variant_t("课时")); m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)3),_variant_t("难度")); m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)4),_variant_t("教学方式")); m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)1),_variant_t("泛函分析")); m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)2),_variant_t("60")); m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)3),_variant_t("普通")); m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)4),_variant_t("老师讲课")); m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)1),_variant_t("微分流形")); m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)2),_variant_t("40")); m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)3),_variant_t("变态难")); m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)4),_variant_t("自学")); m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)1),_variant_t("二阶椭圆型方程与方程组")); m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)2),_variant_t("60")); m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)3),_variant_t("很难")); m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)4),_variant_t("讨论")); m_ExlRge.AttachDispatch(m_ExlSheet.GetUsedRange());//加载已使用的单元格 m_ExlRge.SetWrapText(_variant_t((long)1));//设置单元格内的文本为自动换行 //设置齐方式为水平垂直居中 //水平对齐:默认=1,居中=-4108,左=-4131,右=-4152 //垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107 m_ExlRge.SetHorizontalAlignment(_variant_t((long)-4108)); m_ExlRge.SetVerticalAlignment(_variant_t((long)-4108)); ///////设置整体的字体、字号及颜色////// Font ft; ft.AttachDispatch(m_ExlRge.GetFont()); ft.SetName(_variant_t("宋体"));//字体 ft.SetColorIndex(_variant_t((long)11));//字的颜色 ft.SetSize(_variant_t((long)12));//字号 ///////////设置标题字体及颜色////////// m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1"))); ft.AttachDispatch(m_ExlRge.GetFont()); ft.SetBold(_variant_t((long)1));//粗体 ft.SetSize(_variant_t((long)13)); ft.SetColorIndex(_variant_t((long)2)); CellFormat cf; cf.AttachDispatch(m_ExlRge.GetCells()); //////////////设置底色///////////////// Interior it; it.AttachDispatch(m_ExlRge.GetInterior()); it.SetColorIndex(_variant_t((long)11));//标题底色 ////表格内容的底色//// m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A2"),_variant_t("D5"))); it.AttachDispatch(m_ExlRge.GetInterior()); it.SetColorIndex(_variant_t((long)15)); //////////////为表格设置边框///////////// Range UnitRge; CString CellName; for(int i=1;i《=4;i++) { for(int j=1;j《=4;j++) { CellName.Format("%c%d",j+64,i);//单元格的名称 UnitRge.AttachDispatch(m_ExlRge.GetRange(_variant_t(CellName),_variant_t(CellName)));//加载单元格 //LineStyle=线型 Weight=线宽 ColorIndex=线的颜色(-4105为自动) UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)2),_variant_t((long)-4105),vtMissing);//设置边框 } } //释放对象(相当重要!) m_ExlRge.ReleaseDispatch(); m_ExlSheet.ReleaseDispatch(); m_ExlSheets.ReleaseDispatch(); m_ExlBook.ReleaseDispatch(); m_ExlBooks.ReleaseDispatch(); //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错 m_ExlApp.ReleaseDispatch(); //退出程序 m_ExlApp.Quit(); }
求MFC教程,关于进程的例如:编写程序像任务管理器那样获得某个进程的句柄数,和线程数
#include 《TlHelp32.h》#include 《pdh.h》#pragma comment(lib,"pdh.lib")#include 《PSAPI.H》#pragma comment(lib,"psapi.lib")// 返回指定进程的句柄数BOOL EnableDebugPrivilege(BOOL fEnable){ BOOL fOK = FALSE; HANDLE hToken = NULL; if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)){ TOKEN_PRIVILEGES tp; tp.PrivilegeCount =1; LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges.Luid); tp.Privileges.Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL); fOK = (GetLastError()==ERROR_SUCCESS); CloseHandle(hToken); } return fOK;}DWORD GetProcHandleCount(HANDLE hProcess){ if(!EnableDebugPrivilege(TRUE)) { return 0; } HANDLE hQuery=NULL; PdhOpenQuery(NULL,0,&hQuery); if(NULL==hQuery) { return 0; } HANDLE hCounter=NULL; char szProcessName = "unknown"; HMODULE hMod=NULL; GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ); char szName=""; _tsplitpath(szProcessName,NULL,NULL,szName,NULL); char szCounterPath=""; sprintf(szCounterPath,"\\Process(%s)\\Handle Count",szName); PdhAddCounter(hQuery,szCounterPath,0,&hCounter); if(NULL==hCounter || INVALID_HANDLE_VALUE==hCounter) { PdhCloseQuery(hQuery); return 0; } DWORD nHandles=0; if(ERROR_SUCCESS==PdhCollectQueryData(hQuery)) { PDH_FMT_COUNTERVALUE pdhfmtHandles; if(ERROR_SUCCESS==PdhGetFormattedCounterValue(hCounter, PDH_FMT_LONG, NULL, &pdhfmtHandles)) nHandles = DWORD(pdhfmtHandles.longValue); } if(NULL!=hCounter && INVALID_HANDLE_VALUE!=hCounter) PdhRemoveCounter(hCounter); if(NULL!=hQuery && INVALID_HANDLE_VALUE!=hQuery) PdhCloseQuery(hQuery); EnableDebugPrivilege(FALSE); return nHandles;}转载的 试一试
如何在Visual Studio 2015中创建MFC窗体应用
我们在使用Visual Studio 2015创建桌面应用的时候,最经常遇到的就是Winform和MFC了,那么如何在Visual Studio 2015中创建MFC窗体应用呢?下面我给大家分享一下。
工具/材料
Visual Studio 2015
- 01
首先我们打开Visual Studio 2015软件,点击顶部的文件菜单,然后选择新建下面的项目选项,如下图所示
- 02
接下来在弹出的新建项目界面中我们定位到Visual C++下面的MFC,然后选择右侧的MFC应用程序,如下图所示
- 03
然后会打开MFC应用程序向导界面,我们选择应用程序类型为单个文档,如下图所示
- 04
接着在复合文档支持界面中将复合文档支持类型选择为无,如下图所示
- 05
接下来会进入文档模板属性界面,这里需要给文件扩展名起一个名字,大家根据自己的情况随便起即可,如下图所示
- 06
然后就会进入数据库支持设置界面,由于这里并没有使用数据库,所以勾选无,如下图所示
- 07
接下来就进入到用户界面功能选择页了,我们需要根据自己的实际情况选择使用哪些功能,如下图所示
- 08
最后运行MFC应用程序,我们就会看到如下图所示的MFC窗体应用了,到这里在Visual Studio中创建MFC窗体应用程序就创建完了
C++中实现MFC风格的TRACE
***隐藏网址******隐藏网址***
我们知道,MFC中可以调用宏TRACE等十分方便的输出调试信息到Visual Studio输出窗口,但C++中没人类似的函数,最近我在开发一个小程序时跟踪了一下MFC的TRACE宏,发现它映像了atltrace.h中的ATLTRACE宏,因些,我们也想在C++中使用TRace可以用如下方式:
在C++中可以直接使用下面的函数:
关键点 :字符串格式化必须使用“vsprintf_s”,而不能使用“sprintf_s",“sprintf_s"的第三个参数是”...“,而不是va_list,编译不错错,但是会导致无法正确格式化数据,堆栈的地址也不对,可能导致崩溃。