×

c++ mfc教程

c++ mfc教程(MFC入门书籍)

admin admin 发表于2024-02-09 13:19:46 浏览32 评论0

抢沙发发表评论

大家好,今天小编来为大家解答以下的问题,关于c++ mfc教程,MFC入门书籍这个很多人还不知道,现在让我们一起来看看吧!

本文目录

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,编译不错错,但是会导致无法正确格式化数据,堆栈的地址也不对,可能导致崩溃。

关于本次c++ mfc教程和MFC入门书籍的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。