整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

C++入门必看:MFC CFile类的运用

File类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作。

  一个读写文件的例子:

  文件I/O

  虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便捷方式,但有时在程序中需要对文件处理过程拥有更多的控制权,对于这种文件输入输出(I/O)服务的需求,Windows提供了一系列相关的API函数,并由MFC将其封装为CFile类,提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作。CFile类是MFC文件类的基类,支持无缓冲的二进制输入输出,也可以通过与CArchive类的配合使用而支持对MFC对象的带缓冲的序列化。

  CFile类包含有一个公有型数据成员m_hFile,该数据成员包含了同CFile类对象相关联的文件句柄。如果没有指定句柄,则该值为CFile::hFileNull。由于该数据成员所包含的意义取决于派生的类,因此一般并不建议使用m_hFile。

  通过CFile类来打开文件可以采取两种方式:一种方式是先构造一个CFile类对象然后再调用成员函数Open()打开文件,另一种方式则直接使用CFile类的构造函数去打开一个文件。下面的语句分别演示了用这两种方法打开磁盘文件“C:/TestFile.txt”的过程:

C++代码

// 先构造一个实例,然后再打开文件
CFile file;
file.Open(“C://TestFile.txt”, CFile::modeReadWrite);
……
// 直接通过构造函数打开文件
CFile file(“C://TestFile.txt”, CFile::modeReadWrite);

  其中参数CFile::modeReadWrite是打开文件的模式标志,CFile类中与之类似的标志还有十几个,现集中列表如下:

  文件模式标志 说明

  CFile::modeCreate 创建方式打开文件,如文件已存在则将其长度设置为0

  CFile::modeNoInherit 不允许继承

  CFile::modeNoTruncate 创建文件时如文件已存在不对其进行截断

  CFile::modeRead 只读方式打开文件

  CFile::modeReadWrite 读写方式打开文件

  CFile::modeWrite 写入方式打开文件

  CFile::shareCompat 在使用过程中允许其他进程同时打开文件

  CFile::shareDenyNone 在使用过程中允许其他进程对文件进行读写

  CFile::shareDenyRead 在使用过程中不允许其他进程对文件进行读取

  CFile::shareDenyWrite 在使用过程中不允许其他进程对文件进行写入

  CFile::shareExclusive 取消对其他进程的所有访问

  CFile::typeBinary 设置文件为二进制模式

  CFile::typeText 设置文件为文本模式

  这些标志可以通过“或”运算符而同时使用多个,并以此来满足多种需求。例如,需要以读写方式打开文件,如果文件不存在就创建一个新的,如果文件已经存在则不将其文件长度截断为0。为满足此条件,可用CFile::modeCreate、CFile::modeReadWrite和CFile::modeNoTruncate等几种文件模式标志来打开文件:

C++代码

CFile file ("C://TestFile.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);

  在打开的文件不再使用时需要将其关闭,即可以用成员函数Close()关闭也可以通过CFile类的析构函数来完成。当采取后一种方式时,如果文件还没有被关闭,析构函数将负责隐式调用Close()函数去关闭文件,这也表明创建在堆上的CFile类对象在超出范围后将自动被关闭。由于调用了对象的析构函数,因此在文件被关闭的同时CFile对象也被销毁,而采取Close()方式关闭文件后,CFile对象仍然存在。所以,在显式调用Close()函数关闭一个文件后可以继续用同一个CFile对象去打开其他的文件。

  文件读写是最常用的文件操作方式,主要由CFile类成员函数Read()、Write()来实现。其函数原型分别为:

C++代码

UINT Read( void* lpBuf, UINT nCount );
void Write( const void* lpBuf, UINT nCount );

  参数lpBuf为指向存放数据的缓存的指针,nCount为要读入或写入的字节数,Read()返回的为实际读取的字节数,该数值小于或等于nCount,如果小于nCount则说明已经读到文件末尾,可以结束文件读取,如继续读取,将返回0。因此通常可以将实际读取字节数是否小于指定读取的字节数或是否为0作为判断文件读取是否到达结尾的依据。下面这段代码演示了对文件进行一次性写入和循环多次读取的处理过程:

C++代码

// 创建、写入方式打开文件
CFile file;
file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);
// 写入文件
memset(WriteBuf, 'a', sizeof(WriteBuf));
file.Write(WriteBuf, sizeof(WriteBuf));
// 关闭文件
file.Close();
// 只读方式打开文件
file.Open("C://TestFile.txt", CFile::modeRead);
while (true)
{
// 读取文件数据
int ret = file.Read(ReadBuf, 100);
……
// 如果到达文件结尾则中止循环
if (ret < 100)
break;
}
// 关闭文件
file.Close();
  Write()和Read()函数执行完后将自动移动文件指针,因此不必再显示调用Seek()函数去定位文件指针。包含有文件定位函数的完整代码如下所示:

C++代码
// 创建、写入方式打开文件
CFile file;
file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);
// 写入文件
memset(WriteBuf, 'a', sizeof(WriteBuf));
file.SeekToBegin();
file.Write(WriteBuf, sizeof(WriteBuf));
// 关闭文件
file.Close();
// 只读方式打开文件
file.Open("C://TestFile.txt", CFile::modeRead);
while (true)
{
// 文件指针
static int position = 0;
// 移动文件指针
file.Seek(position, CFile::begin);
// 读取文件数据
int ret = file.Read(ReadBuf, 100);
position += ret;
……
// 如果到达文件结尾则中止循环
if (ret < 100)
break;
}
// 关闭文件
file.Close();

补充:

  使用CFile类对文件进行按结构读取,如:

C++代码

CFile fileRead,fileWrite;
fileRead.Open(_T("E://a.dat"),CFile::modeRead);//这里使用宏_T
fileWrite.Open(_T("E://backup.txt"),CFile::modeCreate | CFile::modeWrite);
VIDEOHEADER *videoheader=new VIDEOHEADER();
fileRead.Read(videoheader,sizeof(VIDEOHEADER));
char buf[sizeof(VIDEOHEADER)*8];
sprintf(buf,"videoheader.cCommandID:%s ,videoheader->cCommandID);  //通过sprintf对我们需要写入文件中的数据进行格式化,这样在文件中存储的数据就是以这里定义的格式显示的。
fileWrite.Write(buf,strlen(buf));

MFC扩展类库

在平时练习的时候我们可以自己手动进行,但是一旦接受一些项目,应用程序开发等,对界面的要求就会高出许多。这时候就有必要借助这些“半成品”实现界面美化提升效率。这里简单介绍一下,具体可点进去查看每个的详情以及教程,案例!

Toolkit Pro

Codejock软件公司的Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。

BCGControlBar

BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库,使您可以创建具有完全自定义选项(功能区、可自定义工具栏、菜单等)以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件,例如图表、日历、网格、编辑器、甘特图和许多其他控件。
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。可以轻松地集成到你的应用程序中,并为你节省数百个开发和调试时间。

QtitanRibbon:

QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。

本文转载自:http://www.jizhuomi.com/software/500.html

今天的内容就是这些了,点击下方“了解更多”获取限时免费教程、体验资格!

isual c++ 供 了 功 能 强 大 的 类 库, 基 本 上 用 开 发 的 要 求, 但 对 于 某 特 殊 要 面, 如 图 像 兼 文 字 的 按 , 列 表 框 中 入 图 像, 中 国 报 表 等 等, 仍 得 力 不 从 心, 因 而 很 有 必 要 创 建 扩 展MFC 类 库, 以 满 足 实 际 开 发 的 求。But,Toolkit Pro 是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件。 根据需要可进行下载体验!

本文通过实例说明MFC工具栏的创建、设计和使用方法,包括三个demo。

demo1:创建一个工具栏

C++代码

//摘抄自MSDN
demo1 (创建一个工具栏)
1.Create a toolbar resource.
/*可以先插入一个新的工具栏资源
添加分隔符,将按钮向右拖动一小下
删除按钮,将按钮拖动出工具栏
*/
2.Construct the CToolBar object.
/*
工具栏是 CToolBar 对象,声明为应用程序的 CMainFrame 类的数据成员。也就是说,工具栏对象嵌入到主框架窗口对象中。这意味着 MFC 在创建框架窗口时创建工具栏,在销毁框架窗口时销毁工具栏。
*/
3.Call the Create (or CreateEx) function to create
the Windows toolbar and attach it to the CToolBar object.
4.Call LoadToolBar to load the toolbar resource.
/*
工具栏创建发生在 CMainFrame::OnCreate 中。MFC 在创建框架窗口之后且在窗口可见之前调用 OnCreate。
在 OnCreate 中调用适当的函数来停靠或浮动工具栏、设置它的样式等。
应用程序向导”生成的默认 OnCreate 执行以下工具栏任务:
1.调用 CToolBar 对象的 Create 成员函数来创建基础 CToolBarCtrl 对象。
2.调用 LoadToolBar 来加载工具栏资源信息。
3.调用函数来启用停靠、浮动和工具提示。
*/
class CMainFrame : public CMDIFrameWnd
{
// ...
// Implementation
// ...
protected:  // control bar embedded members
CStatusBar  m_wndStatusBar;
CToolBar    m_wndToolBar;
// Generated message map functions
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//框架类中m_wndMyToolBar成员变量先调用CreateEx函数,再调用LoadToolBar函数
if (! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
! m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1;      // fail to create
}
//调用CToolBar中的成员函数设置工具栏可停靠的位置
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//调用框架类中的成员函数设置哪里可以被停靠
EnableDocking(CBRS_ALIGN_ANY);
//Points to the control bar to be docked.
DockControlBar(&m_wndToolBar);
return 0;
}


demo2:停靠和浮动工具栏


C++代码


demo2 (停靠和浮动工具栏)
/*
如果使用“应用程序向导”来生成应用程序的主干,向导将要求您选择是否想要可停靠的工具栏。
默认情况下,“应用程序向导”生成代码来执行将可停靠工具栏放置在应用程序中所需的三个操作:
1.在框架窗口中启用停靠。
2.为工具栏启用停靠。
3.停靠工具栏(靠向框架窗口)。
如果这些步骤中的任何一个缺少,应用程序都将显示标准工具栏。
后两个步骤对应用程序中的每一个可停靠工具栏都必须执行。
*/
CFrameWnd::EnableDocking()//在框架窗口中启用停靠
/*
若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。
这可通过使用 CFrameWnd::EnableDocking 函数来实现,该函数采用一个 DWORD 参数,这是一组指示框架窗口的哪一个边接受停靠的样式位。
如果一个工具栏即将停靠并且有多个边可以停靠,则在传递给 EnableDocking 的参数中指示的边按以下顺序使用:顶边、底边、左边、右边。
如果希望能够将控制条停靠在任意位置,请将 CBRS_ALIGN_ANY 传递给 EnableDocking。
*/
CControlBar::EnableDocking()//为工具栏启用停靠
/*
准备好停靠目标后,必须以相似的方式准备工具栏(或源)。为想要停靠的每一个工具栏调用 CControlBar::EnableDocking,指定工具栏应停靠的目标边。如果在 CControlBar::EnableDocking 调用中所指定的边没有一个与框架窗口中为停靠启用的边匹配,则工具栏无法停靠(它将浮动)。
工具栏一旦浮动,将保持为浮动工具栏,不能停靠到框架窗口。
如果希望工具栏永久浮动,请调用参数为 0 的 EnableDocking。然后调用 CFrameWnd::FloatControlBar。工具栏将保持浮动,永远不能在任意位置停靠。
*/
CFrameWnd::DockControlBar()//停靠工具栏
/*
当用户试图将工具栏放置在允许停靠的框架窗口某一边时,框架调用 CFrameWnd::DockControlBar。
另外,可以随时调用该函数将控制条停靠在框架窗口中。这通常在初始化过程中完成。
框架窗口的具体某个边上可停靠多个工具栏。
*/
CFrameWnd::FloatControlBar()//浮动工具栏
/*
从框架窗口分离可停靠工具栏称为浮动工具栏。调用 CFrameWnd::FloatControlBar 来执行该操作。指定要浮动的工具栏、将放置的点以及决定浮动工具栏是水平还是垂直的对齐样式。
当用户拖动工具栏离开停靠位置并将它放置在一个未启用停靠的位置时,框架调用该函数。
这可以是框架窗口的内部或外部的任意位置。同 DockControlBar 一样,也可以在初始化过程中调用该函数。
可停靠工具栏的 MFC 实现不提供一些支持可停靠工具栏的应用程序中有的扩展功能。诸如可自定义工具栏这样的功能不提供。
*/
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//...
//部分代码略
//...
//调用CToolBar中的成员函数设置工具栏可停靠的位置
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//调用框架类中的成员函数设置哪里可以被停靠
EnableDocking(CBRS_ALIGN_ANY);
//Points to the control bar to be docked.
DockControlBar(&m_wndToolBar);
return 0;
}

demo3:点击菜单项显示和隐藏工具栏

C++代码

demo3 (点击菜单项显示和隐藏工具栏)
CFrameWnd::ShowControlBar//显示和隐藏菜单项
void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
void CMainFrame::OnViewNewtool()
{
ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//控制显示和隐藏
}
void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());//为菜单项打标记
}

MFC扩展类库

在平时练习的时候我们可以自己手动进行,但是一旦接受一些项目,应用程序开发等,对界面的要求就会高出许多。这时候就有必要借助这些“半成品”实现界面美化提升效率。这里简单介绍一下,具体可点进去查看每个的详情以及教程,案例!

Toolkit Pro

Codejock软件公司的Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。

BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库,使您可以创建具有完全自定义选项(功能区、可自定义工具栏、菜单等)以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件,例如图表、日历、网格、编辑器、甘特图和许多其他控件。
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。可以轻松地集成到你的应用程序中,并为你节省数百个开发和调试时间。

转载自:http://www.jizhuomi.com/software/494.html

关注我或者点击下方“了解更多”获取一手开发资讯哦!

ibbon是类似于office2007样 式的界面,它替代了传统的MFC程序里的菜单和工具栏MFC默认生成的Ribbon功能少,需要我们自己添加一些控件和图片等元素使界面好看。看下面的一个界面,是示例里的

  看到它与默认Ribbon样式的区别:

  工具自己设计,MFC提供的Ribbon控件基本都用上了;图片(位图)也是原资源没有的

  那到底怎么实现呢?

  可以注意到的是:类别由面板组成,面板由按钮或文本编辑框或进度条等控件组成

  按钮都是图片和文字组成,按钮通过按钮集合可以产生类似于下拉菜单的作用

  观察这些按钮,可以发现有两类:小图标的按钮和大图标的按钮

  小图标:像素16×16,32位

  大图标:像素32×32,32位

  关键问题是如何制作这些BitMap以及如何将他们加载到Ribbon界面中。

有两个方法:一是自己动手制作,二是利用现成的组件ToolKit Pro,BCGControlBar,QitanRibbon后文会有详细介绍!

 一、 制作工具栏BitMap

  在网上找了IconWorkshop这个软件,很好用,可以制作icon图标,也可以用多个icon图标制作位图BitMap。这正是我想要的功能

  自己不会美工,所以在网上找了些素材,做了以下一个工具栏样的32×32像素32位的BitMap

  看到木有,跟程序默认生成的几个位图很像啊,内牛满面啊

  将这个位图加载到资源中,ID改为IDB_BIG

   修改Ribbon内的按钮图标

  首先,修改类别属性,Large Images和Small Images,Large Images就是大图标,Small Images是小图标。在Large Images中的下拉菜单中选择IDB_BIG

  然后修改面板中的按钮属性,在Large Images属性选项中选择一个合适的图标即可

  小图标也是一样的道理,修改各自Small Images属性即可

实现下拉菜单

  按钮属性中有个行为的属性,在里面添加相应的菜单(或间隔符)即完成了类似下拉菜单

  还有一些快捷方式的按键(两个向下的箭头、最左上角的图标按钮)也可以设置它们的功能项

  我做出来的界面如下所示

   将按钮ID和菜单上的ID匹配

  Ribbon中的菜单ID是不能自己设置的,必须绑定在某个菜单上,对菜单的事件响应就是对响应的Ribbon上按钮的响应,所以按了Ribbon界面上的某个按钮就等同于按钮对应的某个菜单

  所以必须将菜单栏也制作完整,给其添加事件消息,将Ribbon中按钮的ID改为对应菜单的ID。菜单不在界面中显示出来不代表它就没用,没它还不行,不知道以后能不能摆脱菜单直接在Ribbon按钮上添加事件。

   修改最小化工具栏上的图标

  上图虽然修改了左上角的按钮图标,但是电脑工具栏上还是现实的MFC图标,使用下面代码进行修改

C++代码

  1. HICON m_hIcon;
  2. m_hIcon = AfxGetApp()->LoadIcon(IDI_HAHA);
  3. SetIcon(m_hIcon, TRUE); // Set small icon
  4. //SetIcon(m_hIcon, FALSE); // Set big icon

二、利用组件

在平时练习的时候我们可以自己手动进行,但是一旦接受一些项目,应用程序开发等,对界面的要求就会高出许多。这时候就有必要借助这些“半成品”实现界面美化提升效率。这里简单介绍一下,具体可点进去查看每个的详情以及教程,案例!

Toolkit Pro

Codejock软件公司的Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。

BCGControlBar

BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库,使您可以创建具有完全自定义选项(功能区、可自定义工具栏、菜单等)以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件,例如图表、日历、网格、编辑器、甘特图和许多其他控件。
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。可以轻松地集成到你的应用程序中,并为你节省数百个开发和调试时间。

QtitanRibbon:

QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。

本文转载自:http://www.jizhuomi.com/software/500.html

今天的内容就是这些了,点击下方“了解更多”获取限时免费体验资格!