精华内容
下载资源
问答
  • vs2010MFC入门到精通教程,包括常用的应用程序开发,对话框,常用控件,文档、视图的详细解说,并提供了很多实例
  • 鸡啄米:VS2010-MFC编程入门教程(1-55).docx

    千次下载 热门讨论 2013-08-13 11:52:22
    一、VS2010/MFC编程入门教程之目录 第一部分:VS2010/MFC开发环境 VS2010/MFC编程入门之前言 VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解) 第二部分:VS2010/MFC应用程序框架 VS2010/MFC编程入门之二...
  • 本例来自于“鸡啄米”---VS2010MFC入门到精通教程 实例步骤: 一、创建一个基于对话框的MFC 工程,名称为“ColorDemo” 二、点击“确定”,下一步后选择如下界面 三、各个控件的设置 1...

    本例来自于“鸡啄米”---VS2010之MFC入门到精通教程


    实例步骤:

    一、创建一个基于对话框的MFC 工程,名称为“ColorDemo”



    二、点击“确定”,下一步后选择如下界面



    三、各个控件的设置

    1、按钮的设置



    2、静态文本的设置



    3、编辑框的设置



    4、红色分量、绿色分量、蓝色分量的设置(只给出红色分量的设置,另两个类似)





    四、为按钮 IDC_COLOR_BUTTON 添加点击消息的消息处理函数





    五、在函数中添加如下代码

            // TODO: 在此添加控件通知处理程序代码
    	// 颜色对话框的初始颜色为红色
    	COLORREF color = RGB(255, 0, 0);
    	// 构造颜色对话框,传入初始颜色值
    	CColorDialog colorDlg(color);
    	// 显示颜色对话框,并判断是否点击了“确定”
    	if ( IDOK == colorDlg.DoModal() )
    	{
    		// 获取颜色对话框中选择的颜色值
    		color = colorDlg.GetColor();
    		// 在 Color 编辑框中显示所选颜色值
    		SetDlgItemInt(IDC_COLOR_EDIT,color);
    		// 在 R 编辑框中显示所选颜色的 R 分量值
    		SetDlgItemInt(IDC_R_EDIT,GetRValue(color));
    		// 在 G 编辑框中显示所选颜色的 G 分量值
    		SetDlgItemInt(IDC_G_EDIT,GetGValue(color));
    		// 在 B 编辑框中显示所选颜色的 B 分量值
    		SetDlgItemInt(IDC_B_EDIT,GetBValue(color));
    	}
    


    六,运行,如下界面




    展开全文
  • 写这套VS2010/MFC编程入门教程历时八个月,时间比较长,都是鸡啄米在工作之余加班加点完成的。虽然有点累,但看到有这么多人过来支持鸡啄米,很是值得。 写每节教程我都力求讲明白,深入浅出的阐述每个知识点;每...

           写这套VS2010/MFC编程入门教程历时八个月,时间比较长,都是鸡啄米在工作之余加班加点完成的。虽然有点累,但看到有这么多人过来支持鸡啄米,很是值得。

           写每节教程我都力求讲明白,深入浅出的阐述每个知识点;每个实例都以让大家快速的掌握要点为目的,且都是鸡啄米事先写好并能正常运行的。

           每节课的写作耗时差不多都在两三个小时以上,有时候甚至写到凌晨一点多。付出了很多,同样也收获了很多,最大的收获莫过于大家的肯定和支持,很多朋友都留言或者发邮件支持鸡啄米,这说明我的辛勤劳动没有白费,帮助了很多人,感谢那些一直以来支关注鸡啄米的朋友,也特别感谢那些在鸡啄米经常留言支持的读者。

           除了大家的支持,鸡啄米自己也通过本教程的完成更深入的理解了VS2010/MFC的很多内容,提高了对VS2010/MFC的认识水平,尤其是更加巩固了一些较少使用的知识。在帮人的同时也帮了自己。

           很多朋友在鸡啄米留言或者给鸡啄米发电子邮件讨论问题,由于时间确实比较少,晚上更新文章,白天上班,所以只回复了一部分,望大家见谅。

           学会了VS2010/MFC编程,很多人就开始喜欢研究MFC了,但是提醒大家不要忘了根本,即C++语言。从《鸡啄米C++编程入门系列》和《VS2010/MFC编程入门教程》这两套学习教程的受欢迎程度,鸡啄米感觉大家有些忽视C++的学习,更喜欢应用性强的MFC。在你能熟练使用MFC后,最好再认真学学C++,提高C++水平才能真正让你的编程功力上一个台阶。

           以后鸡啄米会继续分享各种编程知识,还会编写一些教程,希望大家能一如既往的关注鸡啄米网站,支持鸡啄米!

     
    除非特别注明,鸡啄米文章均为原创
    转载请标明本文地址:http://www.jizhuomi.com/software/257.html
    2012年10月31日
    作者:鸡啄米 分类:软件开发 浏览:454586 评论:211
     

           鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事。作为本教程的最后一课,鸡啄米将对前面所讲内容进行目录归纳,并对这八个月加班加点的努力进行总结。

     

           一、VS2010/MFC编程入门教程之目录

           第一部分:VS2010/MFC开发环境

           VS2010/MFC编程入门之前言
           VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)

           第二部分:VS2010/MFC应用程序框架

           VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)
           VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
           VS2010/MFC编程入门之四(MFC应用程序框架分析)
           VS2010/MFC编程入门之五(MFC消息映射机制概述)

           第三部分:对话框

           VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)
           VS2010/MFC编程入门之七(对话框:为对话框添加控件)
           VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)
           VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)
           VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)
           VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)
           VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)
           VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
           VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)
           VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)
           VS2010/MFC编程入门之十六(对话框:消息对话框)
           VS2010/MFC编程入门之十七(对话框:文件对话框)
           VS2010/MFC编程入门之十八(对话框:字体对话框)
           VS2010/MFC编程入门之十九(对话框:颜色对话框)

           第四部分:常用控件

           VS2010/MFC编程入门之二十(常用控件:静态文本框)
           VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)
           VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)
           VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)
           VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)
           VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)
           VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)
           VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)
           VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
           VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
           VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)
           VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)
           VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)
           VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)

           第五部分:菜单、工具栏与状态栏

           VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
           VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)
           VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
           VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
           VS2010/MFC编程入门之三十八(状态栏的使用详解)

           第六部分:文档、视图和框架

           VS2010/MFC编程入门之三十九(文档、视图和框架:概述)
           VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)
           VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)

           第七部分:MFC常用类

           VS2010/MFC编程入门之四十二(MFC常用类:CString类)
           VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)
           VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)
           VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)
           VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

           第八部分:字体和文本输出

           VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)
           VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)

           第九部分:图形图像

           VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)
           VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)
           VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

           第十部分:Ribbon界面开发

           VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)
           VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)
           VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

           二、VS2010/MFC编程入门教程之总结

     
    展开全文
  • 最近一个同学说是要做一个报账的软件,总体上要实现的功能就是读写Excel文件,于是自己就开始在网上找读写Excel的方法,首先看到了C/C++读写Excel的几种方法...在网上也看到了很多教程,其中VS2010通过OLE操作Excel...

    最近一个同学说是要做一个报账的软件,总体上要实现的功能就是读写Excel文件,于是自己就开始在网上找读写Excel的方法,首先看到了C/C++读写Excel的几种方法,说是读写的方法有很多,但是反正就是各有利弊,我就选择了以OLE的方式进行Excel的操作(这种方式必须要在电脑上安装Excel程序,否则连最开始的配置就无法完成)。

    在网上也看到了很多教程,其中VS2010通过OLE操作Excel2010这篇博客的正文加上下面有个博主的评论就差不多可以实现了,但是都是以文字、方法的方式进行讲解,很难操作,并且自己在弄得时候也遇到了各种各样的问题,所以,我以我自己的实例进行讲解:

    1.新建一个MFC工程文件,如下

    2.为工程文件导入Excel.exe程序并添加一些必须的类,首先点“文件”,然后找到自己的Excel的安装位置添加过来,最后添加下面 的那几个类(如果前面不小心已经添加了这几个类上面却没有添加Excel.exe程序,这个时候直接把添加的文件直接“删除”即可,如果不删直接添加的话仍然会添加成功,但是添加的就是“CApplication0.h”、“CRange0.h”,这样的话就会跟下面添加的头文件和源文件的类不一致,就会报错

    3.添加完成以后,在“解决方案资源管理器”里面就多了下面6个文件,依次打开每个文件,把右边这个路径给注释掉或者直接删掉

    4.这个时候编译时没有问题的

    5.为这个工程添加对Excel表格进行操作的头文件“IllusionExcelFile.h”和源文件“IllusionExcelFile.cpp”

    头文件(IllusionExcelFile.h):

    #pragma once
     
    //OLE的头文件
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    #include "CApplication.h"
     
    ///
    ///用于OLE的方式的EXCEL读写,
    class IllusionExcelFile
    {
     
    public:
     
    	//构造函数和析构函数
    	IllusionExcelFile();
    	virtual ~IllusionExcelFile();
     
    protected:
    	///打开的EXCEL文件名称
    	CString       open_excel_file_;
     
    	///EXCEL BOOK集合,(多个文件时)
    	CWorkbooks    excel_books_; 
    	///当前使用的BOOK,当前处理的文件
    	CWorkbook     excel_work_book_; 
    	///EXCEL的sheets集合
    	CWorksheets   excel_sheets_; 
    	///当前使用sheet
    	CWorksheet    excel_work_sheet_; 
    	///当前的操作区域
    	CRange        excel_current_range_; 
     
     
    	///是否已经预加载了某个sheet的数据
    	BOOL          already_preload_;
    	///Create the SAFEARRAY from the VARIANT ret.
    	COleSafeArray ole_safe_array_;
     
    protected:
     
    	///EXCEL的进程实例
    	static CApplication excel_application_;
    public:
     
    	///
    	void ShowInExcel(BOOL bShow);
     
    	///检查一个CELL是否是字符串
    	BOOL    IsCellString(long iRow, long iColumn);
    	///检查一个CELL是否是数值
    	BOOL    IsCellInt(long iRow, long iColumn);
     
    	///得到一个CELL的String
    	CString GetCellString(long iRow, long iColumn);
    	///得到整数
    	int     GetCellInt(long iRow, long iColumn);
    	///得到double的数据
    	double  GetCellDouble(long iRow, long iColumn);
     
    	///取得行的总数
    	int GetRowCount();
    	///取得列的总数
    	int GetColumnCount();
     
    	///使用某个shet,shit,shit
    	BOOL LoadSheet(long table_index,BOOL pre_load = FALSE);
    	///通过名称使用某个sheet,
    	BOOL LoadSheet(LPCTSTR sheet,BOOL pre_load = FALSE);
    	///通过序号取得某个Sheet的名称
    	CString GetSheetName(long table_index);
     
    	///得到Sheet的总数
    	int GetSheetCount();
     
    	///打开文件
    	BOOL OpenExcelFile(LPCTSTR file_name);
    	///关闭打开的Excel 文件,有时候打开EXCEL文件就要
    	void CloseExcelFile(BOOL if_save = FALSE);
    	//另存为一个EXCEL文件
    	void SaveasXSLFile(const CString &xls_file);
    	///取得打开文件的名称
    	CString GetOpenFileName();
    	///取得打开sheet的名称
    	CString GetLoadSheetName();
     
    	///写入一个CELL一个int
    	void SetCellInt(long irow, long icolumn,int new_int);
    	///写入一个CELL一个string
    	void SetCellString(long irow, long icolumn,CString new_string);
     
    public:
    	///初始化EXCEL OLE
    	static BOOL InitExcel();
    	///释放EXCEL的 OLE
    	static void ReleaseExcel();
    	///取得列的名称,比如27->AA
    	static char *GetColumnName(long iColumn);
     
    protected:
     
    	//预先加载
    	void PreLoadSheet();
    };
     

    源文件(IllusionExcelFile.cpp):

    #include "StdAfx.h"
    #include "IllusionExcelFile.h"
     
     
     
    COleVariant
    covTrue((short)TRUE),
    covFalse((short)FALSE),
    covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);    
     
    //
    CApplication IllusionExcelFile::excel_application_;
     
     
    IllusionExcelFile::IllusionExcelFile():
        already_preload_(FALSE)
    {
    }
     
    IllusionExcelFile::~IllusionExcelFile()
    {
        //
        CloseExcelFile();
    }
     
     
    //初始化EXCEL文件,
    BOOL IllusionExcelFile::InitExcel()
    {
     
    	CoUninitialize();
    	if(CoInitialize(NULL)==S_FALSE) 
    	{ 
    		AfxMessageBox(_T("初始化COM支持库失败!")); 
    		return FALSE; 
    	}
        //创建Excel 2000服务器(启动Excel) 
        if (!excel_application_.CreateDispatch(_T("Excel.Application"),NULL)) 
        { 
            AfxMessageBox(_T("创建Excel服务失败,你可能没有安装EXCEL,请检查!")); 
            return FALSE;
        }
     
        excel_application_.put_DisplayAlerts(FALSE); 
        return TRUE;
    }
     
    //
    void IllusionExcelFile::ReleaseExcel()
    {
        excel_application_.Quit();
        excel_application_.ReleaseDispatch();
        excel_application_=NULL;
    }
     
    //打开excel文件
    BOOL IllusionExcelFile::OpenExcelFile(LPCTSTR file_name)
    {
        //先关闭
        CloseExcelFile();
        
        //利用模板文件建立新文档 
        excel_books_.AttachDispatch(excel_application_.get_Workbooks(),true); 
     
        LPDISPATCH lpDis = NULL;
        lpDis = excel_books_.Add(COleVariant(file_name)); 
        if (lpDis)
        {
            excel_work_book_.AttachDispatch(lpDis); 
            //得到Worksheets 
            excel_sheets_.AttachDispatch(excel_work_book_.get_Worksheets(),true); 
            
            //记录打开的文件名称
            open_excel_file_ = file_name;
     
            return TRUE;
        }
        
        return FALSE;
    }
     
    //关闭打开的Excel 文件,默认情况不保存文件
    void IllusionExcelFile::CloseExcelFile(BOOL if_save)
    {
        //如果已经打开,关闭文件
        if (open_excel_file_.IsEmpty() == FALSE)
        {
            //如果保存,交给用户控制,让用户自己存,如果自己SAVE,会出现莫名的等待
            if (if_save)
            {
                ShowInExcel(TRUE);
            }
            else
            {
                //
                excel_work_book_.Close(COleVariant(short(FALSE)),COleVariant(open_excel_file_),covOptional);
                excel_books_.Close();
            }
     
            //打开文件的名称清空
            open_excel_file_.Empty();
        }
     
        
     
        excel_sheets_.ReleaseDispatch();
        excel_work_sheet_.ReleaseDispatch();
        excel_current_range_.ReleaseDispatch();
        excel_work_book_.ReleaseDispatch();
        excel_books_.ReleaseDispatch();
    }
     
    void IllusionExcelFile::SaveasXSLFile(const CString &xls_file)
    {
        excel_work_book_.SaveAs(COleVariant(xls_file),
            covOptional,
            covOptional,
            covOptional,
            covOptional,
            covOptional,
            0,
            covOptional,
            covOptional,
            covOptional,
            covOptional,
            covOptional);
        return;
    }
     
     
    int IllusionExcelFile::GetSheetCount()
    {
        return excel_sheets_.get_Count();
    }
     
     
    CString IllusionExcelFile::GetSheetName(long table_index)
    {
        CWorksheet sheet;
        sheet.AttachDispatch(excel_sheets_.get_Item(COleVariant((long)table_index)),true);
        CString name = sheet.get_Name();
        sheet.ReleaseDispatch();
        return name;
    }
     
    //按照序号加载Sheet表格,可以提前加载所有的表格内部数据
    BOOL IllusionExcelFile::LoadSheet(long table_index,BOOL pre_load)
    {
        LPDISPATCH lpDis = NULL;
        excel_current_range_.ReleaseDispatch();
        excel_work_sheet_.ReleaseDispatch();
        lpDis = excel_sheets_.get_Item(COleVariant((long)table_index));
        if (lpDis)
        {
            excel_work_sheet_.AttachDispatch(lpDis,true);
            excel_current_range_.AttachDispatch(excel_work_sheet_.get_Cells(), true);
        }
        else
        {
            return FALSE;
        }
        
        already_preload_ = FALSE;
        //如果进行预先加载
        if (pre_load)
        {
            PreLoadSheet();
            already_preload_ = TRUE;
        }
     
        return TRUE;
    }
     
    //按照名称加载Sheet表格,可以提前加载所有的表格内部数据
    BOOL IllusionExcelFile::LoadSheet(LPCTSTR sheet,BOOL pre_load)
    {
        LPDISPATCH lpDis = NULL;
        excel_current_range_.ReleaseDispatch();
        excel_work_sheet_.ReleaseDispatch();
        lpDis = excel_sheets_.get_Item(COleVariant(sheet));
        if (lpDis)
        {
            excel_work_sheet_.AttachDispatch(lpDis,true);
            excel_current_range_.AttachDispatch(excel_work_sheet_.get_Cells(), true);
            
        }
        else
        {
            return FALSE;
        }
        //
        already_preload_ = FALSE;
        //如果进行预先加载
        if (pre_load)
        {
            already_preload_ = TRUE;
            PreLoadSheet();
        }
     
        return TRUE;
    }
     
    //得到列的总数
    int IllusionExcelFile::GetColumnCount()
    {
        CRange range;
        CRange usedRange;
        usedRange.AttachDispatch(excel_work_sheet_.get_UsedRange(), true);
        range.AttachDispatch(usedRange.get_Columns(), true);
        int count = range.get_Count();
        usedRange.ReleaseDispatch();
        range.ReleaseDispatch();
        return count;
    }
     
    //得到行的总数
    int IllusionExcelFile::GetRowCount()
    {
        CRange range;
        CRange usedRange;
        usedRange.AttachDispatch(excel_work_sheet_.get_UsedRange(), true);
        range.AttachDispatch(usedRange.get_Rows(), true);
        int count = range.get_Count();
        usedRange.ReleaseDispatch();
        range.ReleaseDispatch();
        return count;
    }
     
    //检查一个CELL是否是字符串
    BOOL IllusionExcelFile::IsCellString(long irow, long icolumn)
    {
        CRange range;
        range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
        COleVariant vResult =range.get_Value2();
        //VT_BSTR标示字符串
        if(vResult.vt == VT_BSTR)       
        {
            return TRUE;
        }
        return FALSE;
    }
     
    //检查一个CELL是否是数值
    BOOL IllusionExcelFile::IsCellInt(long irow, long icolumn)
    {
        CRange range;
        range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
        COleVariant vResult =range.get_Value2();
        //好像一般都是VT_R8
        if(vResult.vt == VT_INT || vResult.vt == VT_R8)       
        {
            return TRUE;
        }
        return FALSE;
    }
     
    //
    CString IllusionExcelFile::GetCellString(long irow, long icolumn)
    {
       
        COleVariant vResult ;
        CString str;
        //字符串
        if (already_preload_ == FALSE)
        {
            CRange range;
            range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
            vResult =range.get_Value2();
            range.ReleaseDispatch();
        }
        //如果数据依据预先加载了
        else
        {
            long read_address[2];
            VARIANT val;
            read_address[0] = irow;
            read_address[1] = icolumn;
            ole_safe_array_.GetElement(read_address, &val);
            vResult = val;
        }
     
        if(vResult.vt == VT_BSTR)
        {
            str=vResult.bstrVal;
        }
        //整数
        else if (vResult.vt==VT_INT)
        {
            str.Format(_T("%d"),vResult.pintVal);
        }
        //8字节的数字 
        else if (vResult.vt==VT_R8)     
        {
            str.Format(_T("%0.0f"),vResult.dblVal);
        }
        //时间格式
        else if(vResult.vt==VT_DATE)    
        {
            SYSTEMTIME st;
            VariantTimeToSystemTime(vResult.date, &st);
            CTime tm(st); 
            str=tm.Format("%Y-%m-%d");
     
        }
        //单元格空的
        else if(vResult.vt==VT_EMPTY)   
        {
            str="";
        }  
     
        return str;
    }
     
    double IllusionExcelFile::GetCellDouble(long irow, long icolumn)
    {
        double rtn_value = 0;
        COleVariant vresult;
        //字符串
        if (already_preload_ == FALSE)
        {
            CRange range;
            range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
            vresult =range.get_Value2();
            range.ReleaseDispatch();
        }
        //如果数据依据预先加载了
        else
        {
            long read_address[2];
            VARIANT val;
            read_address[0] = irow;
            read_address[1] = icolumn;
            ole_safe_array_.GetElement(read_address, &val);
            vresult = val;
        }
        
        if (vresult.vt==VT_R8)     
        {
            rtn_value = vresult.dblVal;
        }
        
        return rtn_value;
    }
     
    //VT_R8
    int IllusionExcelFile::GetCellInt(long irow, long icolumn)
    {
        int num;
        COleVariant vresult;
     
        if (already_preload_ == FALSE)
        {
            CRange range;
            range.AttachDispatch(excel_current_range_.get_Item (COleVariant((long)irow),COleVariant((long)icolumn)).pdispVal, true);
            vresult = range.get_Value2();
            range.ReleaseDispatch();
        }
        else
        {
            long read_address[2];
            VARIANT val;
            read_address[0] = irow;
            read_address[1] = icolumn;
            ole_safe_array_.GetElement(read_address, &val);
            vresult = val;
        }
        //
        num = static_cast<int>(vresult.dblVal);
     
        return num;
    }
     
    void IllusionExcelFile::SetCellString(long irow, long icolumn,CString new_string)
    {
        COleVariant new_value(new_string);
        CRange start_range = excel_work_sheet_.get_Range(COleVariant(_T("A1")),covOptional);
        CRange write_range = start_range.get_Offset(COleVariant((long)irow -1),COleVariant((long)icolumn -1) );
        write_range.put_Value2(new_value);
        start_range.ReleaseDispatch();
        write_range.ReleaseDispatch();
     
    }
     
    void IllusionExcelFile::SetCellInt(long irow, long icolumn,int new_int)
    {
        COleVariant new_value((long)new_int);
        
        CRange start_range = excel_work_sheet_.get_Range(COleVariant(_T("A1")),covOptional);
        CRange write_range = start_range.get_Offset(COleVariant((long)irow -1),COleVariant((long)icolumn -1) );
        write_range.put_Value2(new_value);
        start_range.ReleaseDispatch();
        write_range.ReleaseDispatch();
    }
     
     
    //
    void IllusionExcelFile::ShowInExcel(BOOL bShow)
    {
        excel_application_.put_Visible(bShow);
        excel_application_.put_UserControl(bShow);
    }
     
    //返回打开的EXCEL文件名称
    CString IllusionExcelFile::GetOpenFileName()
    {
        return open_excel_file_;
    }
     
    //取得打开sheet的名称
    CString IllusionExcelFile::GetLoadSheetName()
    {
        return excel_work_sheet_.get_Name();
    }
     
    //取得列的名称,比如27->AA
    char *IllusionExcelFile::GetColumnName(long icolumn)
    {   
        static char column_name[64];
        size_t str_len = 0;
        
        while(icolumn > 0)
        {
            int num_data = icolumn % 26;
            icolumn /= 26;
            if (num_data == 0)
            {
                num_data = 26;
                icolumn--;
            }
            column_name[str_len] = (char)((num_data-1) + 'A' );
            str_len ++;
        }
        column_name[str_len] = '\0';
        //反转
        _strrev(column_name);
     
        return column_name;
    }
     
    //预先加载
    void IllusionExcelFile::PreLoadSheet()
    {
     
        CRange used_range;
     
        used_range = excel_work_sheet_.get_UsedRange();	
     
     
        VARIANT ret_ary = used_range.get_Value2();
        if (!(ret_ary.vt & VT_ARRAY))
        {
            return;
        }
        //
        ole_safe_array_.Clear();
        ole_safe_array_.Attach(ret_ary); 
    }

    6.这个时候再次编译会出现如下问题,双击出现的错误定位到错误的行,只需在“DialogBox()”前面加一个横杠改为“_DialogBox()”即可

    7.这个时候已经对工程文件配置好了,下面就开始进行测试,对Excel进行读写:

    8.在工程文件的头文件“COperateExcelByOLEDlg.h”中包含我们刚才添加的头文件,并定义一个“IllusionExcelFile”类的对象“excl”如下:

       

    9.在源文件“COperateExcelByOLEDlg.cpp”中的“OnInitDialog()”初始化函数中添加如下代码:

    AfxOleInit();
    excl.InitExcel();

    10.在界面上添加一个按钮控件并为这个按钮添加如下代码(代码里面为了测试,我在电脑的F盘新建了一个“Exce”的文件夹并新建了一个“工作簿1.xlsx”文件,自己也可以根据自己的需求改变路径):

    	bool bRet = excl.OpenExcelFile("F:\\Excel\\工作簿1.xlsx"); 
    	CString strSheetName = excl.GetSheetName(1);    
    	bool bLoad = excl.LoadSheet(strSheetName);
    	int nRow = excl.GetRowCount();
    	int nCol = excl.GetColumnCount();
    	if (bRet == 1)
    	{
    		AfxMessageBox("文件打开成功!");
    		 for (int i=1; i<10; ++i)
    		 {         
    			 for (int j=1; j<20; ++j)
    		     {            
    				 CString strValue = excl.GetCellString(i,j);  
    				 excl.SetCellInt(i,j,9);
    			 }     
    		 }
    	}
    	else
    	{
    		AfxMessageBox("文件打开失败!");
    		return ;
    	}
    	excl.SaveasXSLFile("F:\\Excel\\工作簿2.xlsx");
    
    	AfxMessageBox("文件写入成功!");

    11.此时按道理讲,应该就可以运行了

      

    12.如果运行的时候报错:“服务器出现意外情况”,看到一篇C#操作Excel报错:服务器出现意外情况,就是自己的电脑安装了福熙阅读器这个软件

    解决方案:

    打开你电脑中的Office-Excel。在“文件”->"选项"->"加载项"->"管理",选择“COM加载项”,点击“转到”按钮。将“复习阅读器”这个选项不勾选即可

    最后,我上传了这个实例教程的工程文件,需要的可以自行下载:https://download.csdn.net/my

    因为现在上传好像是自己改不了下载所需积分,因此如果没有积分的朋友可以直接下面评论给我说,我再私发也可以的

     

    展开全文
  •  上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button、Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用。  因为Button控件...

    http://www.jizhuomi.com/software/184.html

     上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button、Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用。

           因为Button控件在前面的例子中涉及到了,比较简单,本文就不作深入分析了,而是重点讲解单选按钮Radio Button、复选框Check Box的使用。

           按钮控件实例的功能

           首先介绍此实例实现的功能。此实例用来根据网站类型选择网站,并将选择的网站的名称显示到编辑框中。网站类型有“门户”、“论坛”和“博客”三种,为单选按钮。网站有六个:鸡啄米、新浪、天涯论坛、韩寒博客、网易和凤凰网论坛,均为复选框。

           当选中某种网站类型即点了某个单选按钮时,其对应的网站的复选框就激活,其他则禁用,不允许选择,且为非选中状态。例如,如果选中了“门户”单选按钮,则“新浪”、“网易”复选框激活,允许用户选择,而其他复选框则禁用。

           按钮控件实例的实现

           鸡啄米下面为大家详细阐述此实例的编写步骤。

           1. 创建一个基于对话框的MFC工程,名称设为“Example23”。

           2. 在自动生成的主对话框IDD_EXAMPLE23_DIALOG的模板中,删除“TODO: Place dialog controls here.”静态文本框,添加两个Group Box,属性Caption分别改为“网站类型”、“网站”。

           3. 在Group Box“网站类型”中加入三个Radio Button,Caption分别设为“门户”、“论坛”和“博客”,ID分别设为IDC_PORTAL_RADIO、IDC_FORUM_RADIO和IDC_BLOG_RADIO。

           4. 在Group Box“网站”中加入六个Check Box,Caption分别设为“鸡啄米”、“新浪”、“天涯论坛”、“韩寒博客”、“网易”和“凤凰网论坛”,ID分别设为IDC_CHECK1、IDC_CHECK2、IDC_CHECK3、IDC_CHECK4、IDC_CHECK5和IDC_CHECK6。然后为每个复选框添加CButton类型的变量m_check1、m_check2、m_check3、m_check4、m_check5和m_check6。

           5. 在两个Group Box下面,添加一个静态文本框和一个编辑框。静态文本框的Caption设为“选择的网站:”。编辑框的ID设为IDC_WEBSITE_SEL_EDIT,属性Read Only改为True,使此编辑框为只读状态,不允许用户编辑。

           6. 将“OK”按钮的Caption修改为“确定”,“Cancel”按钮的Caption修改为“退出”。到此,对话框模板就修改好了,如下图:

    VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)

            7. 为“门户”、“论坛”和“博客”三个单选按钮分别添加点击消息的消息处理函数CExample23Dlg::OnBnClickedPortalRadio()、CExample23Dlg::OnBnClickedForumRadio()和CExample23Dlg::OnBnClickedBlogRadio()。

            在某个单选按钮被点击之后,我们可以先将六个网站复选框都禁用且置为非选中状态,而后将选择的网站类型对应的网站复选框激活。为了代码复用,我们将置所有复选框为禁用且非选中状态的操作写到一个函数里,此函数为CExample23Dlg::InitAllCheckBoxStatus(),然后就可以在三个单选按钮的消息处理函数中调用InitAllCheckBoxStatus(),实现复选框状态的初始化。

           三个消息处理函数及InitAllCheckBoxStatus()函数的实现如下:

    C++代码

    1. void CExample23Dlg::OnBnClickedPortalRadio()   
    2. {   
    3.     // TODO: Add your control notification handler code here   
    4.     // 如果选择了“门户”单选按钮,则激活复选框“新浪”和“网易”,其他复选框禁用并非选中   
    5.     InitAllCheckBoxStatus();   
    6.     m_check2.EnableWindow(TRUE);   
    7.     m_check5.EnableWindow(TRUE);   
    8. }   
    9.   
    10.   
    11. void CExample23Dlg::OnBnClickedForumRadio()   
    12. {   
    13.     // TODO: Add your control notification handler code here   
    14.     // 如果选择了“论坛”单选按钮,则激活复选框“天涯论坛”和“凤凰网论坛”,其他复选框禁用并非选中   
    15.     InitAllCheckBoxStatus();   
    16.     m_check3.EnableWindow(TRUE);   
    17.     m_check6.EnableWindow(TRUE);   
    18. }   
    19.   
    20.   
    21. void CExample23Dlg::OnBnClickedBlogRadio()   
    22. {   
    23.     // TODO: Add your control notification handler code here   
    24.     // 如果选择了“博客”单选按钮,则激活复选框“鸡啄米”和“韩寒博客”,其他复选框禁用并非选中   
    25.     InitAllCheckBoxStatus();   
    26.     m_check1.EnableWindow(TRUE);   
    27.     m_check4.EnableWindow(TRUE);   
    28. }   
    29.   
    30. // 初始化所有复选框的状态,即全部禁用,全部非选中   
    31. void CExample23Dlg::InitAllCheckBoxStatus()   
    32. {   
    33.     // 全部禁用   
    34.     m_check1.EnableWindow(FALSE);   
    35.     m_check2.EnableWindow(FALSE);   
    36.     m_check3.EnableWindow(FALSE);   
    37.     m_check4.EnableWindow(FALSE);   
    38.     m_check5.EnableWindow(FALSE);   
    39.     m_check6.EnableWindow(FALSE);   
    40.   
    41.     // 全部非选中   
    42.     m_check1.SetCheck(0);   
    43.     m_check2.SetCheck(0);   
    44.     m_check3.SetCheck(0);   
    45.     m_check4.SetCheck(0);   
    46.     m_check5.SetCheck(0);   
    47.     m_check6.SetCheck(0);   
    48. }  

           8. 程序运行后,我们希望网站类型默认选择为“门户”,则修改对话框初始化函数CExample23Dlg::OnInitDialog()为:

    C++代码

    1. BOOL CExample23Dlg::OnInitDialog()   
    2. {   
    3.     CDialogEx::OnInitDialog();   
    4.   
    5.     // Add "About..." menu item to system menu.   
    6.   
    7.     // IDM_ABOUTBOX must be in the system command range.   
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);   
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
    12.     if (pSysMenu != NULL)   
    13.     {   
    14.         BOOL bNameValid;   
    15.         CString strAboutMenu;   
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
    17.         ASSERT(bNameValid);   
    18.         if (!strAboutMenu.IsEmpty())   
    19.         {   
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);   
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
    22.         }   
    23.     }   
    24.   
    25.     // Set the icon for this dialog.  The framework does this automatically   
    26.     //  when the application's main window is not a dialog   
    27.     SetIcon(m_hIcon, TRUE);         // Set big icon   
    28.     SetIcon(m_hIcon, FALSE);        // Set small icon   
    29.   
    30.     // TODO: Add extra initialization here   
    31.     // 默认选中“门户”单选按钮   
    32.     CheckDlgButton(IDC_PORTAL_RADIO, 1);   
    33.     OnBnClickedPortalRadio();   
    34.   
    35.     return TRUE;  // return TRUE  unless you set the focus to a control   
    36. }  

           9. 点击“确定”后,将选择的网站名字显示到编辑框中,那么需要修改“确定”按钮(原来的OK按钮)的消息处理函数CExample23Dlg::OnBnClickedOk()如下:

    C++代码

    1. void CExample23Dlg::OnBnClickedOk()   
    2. {   
    3.     // TODO: Add your control notification handler code here   
    4.     CString strWebsiteSel;         // 选择的网站   
    5.   
    6.     // 若选中“鸡啄米”则将其加入结果字符串   
    7.     if (1 == m_check1.GetCheck())   
    8.     {   
    9.         strWebsiteSel += _T("鸡啄米 ");   
    10.     }   
    11.     // 若选中“新浪”则将其加入结果字符串   
    12.     if (1 == m_check2.GetCheck())   
    13.     {   
    14.         strWebsiteSel += _T("新浪 ");   
    15.     }   
    16.     // 若选中“天涯论坛”则将其加入结果字符串   
    17.     if (1 == m_check3.GetCheck())   
    18.     {   
    19.         strWebsiteSel += _T("天涯论坛 ");   
    20.     }   
    21.     // 若选中“韩寒博客”则将其加入结果字符串   
    22.     if (1 == m_check4.GetCheck())   
    23.     {   
    24.         strWebsiteSel += _T("韩寒博客 ");   
    25.     }   
    26.     // 若选中“网易”则将其加入结果字符串   
    27.     if (1 == m_check5.GetCheck())   
    28.     {   
    29.         strWebsiteSel += _T("网易 ");   
    30.     }   
    31.     // 若选中“凤凰网论坛”则将其加入结果字符串   
    32.     if (1 == m_check6.GetCheck())   
    33.     {   
    34.         strWebsiteSel += _T("凤凰网论坛 ");   
    35.     }   
    36.   
    37.     // 将结果字符串显示于“选择的网站”后的编辑框中   
    38.     SetDlgItemText(IDC_WEBSITE_SEL_EDIT, strWebsiteSel);   
    39.   
    40.     // 为了避免点“确定”后对话框退出,将OnOk注掉   
    41.     //CDialogEx::OnOK();   
    42. }  

           10. 到此程序编写完成。运行程序弹出结果对话框,选择网站后界面如下图:

    VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)

           按钮控件的内容就这些了。掌握了按钮控件的基本用法,又动手编写了这个实例后,相信大家对按钮控件已经很熟悉了。鸡啄米欢迎大家继续来学习交流。

    展开全文
  • 此工程文件是我《VS2010 MFC工程通过OLE方式读写Excel文件》这篇博客教程实例文件原文链接如下 https://blog.csdn.net/qq_40969467/article/details/103336129
  • 上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button、Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用。  因为Button控件...
  • 上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button、Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用。 因为Button控件在...
  • 上一节VS2010/MFC编程入门教程中讲了按钮控件Button、Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用。 因为Button控件在前面的...
  • VS2010 MFC + SQL ADO编程

    2017-05-30 16:24:06
    一.安装SQL server 2008 R2更新:近日重装系统之后...1)在选择安装实例的时候不要选择默认实例MSSQLSERVER,因为据说选择默认实例名就是没有实例名,反正我在安装时选择默认实例名,装完之后服务器名字输入“kxiansen
  • VS2010MFC入门到精通教程的pdf,共306页 ,10大章节,55小节。完整有图版 第一部分:VS2010/MFC 开发环境 VS2010/MFC 编程入门之前言 VS2010/MFC 编程入门之一(VS2010 与MSDN 安装过程图解) 第二部分:VS2010/...
  • 本节教程将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数。 一、为Ribbon Bar添加更多Ribbon控件 下面将在上一节实例的基础上,继续添加下拉菜单、Chec...
  • 本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数。  一、为Ribbon Bar添加更多Ribbon控件  鸡啄米将在上一节实例的基础上,继续添加下拉菜单、Check Box、...
  • 本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数。 一、为Ribbon Bar添加更多Ribbon控件 鸡啄米将在上一节实例的基础上,继续添加下拉菜单、Check Box、...
  • 本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数。 一、为Ribbon Bar添加更多Ribbon控件 鸡啄米将在上一节实例的基础上,继续添加下拉菜单、Check Box、...
  • 程序设计第六次作业——计算器(可视...4.VS2010/MFC编程入门教程 5.对话框:文件对话框的打开和选择 6.MFC Tab control控件的简单实例 <1>刚看到题目的要求的时候是一脸蒙逼的,完全不知道应该写什么,就连什...
  • 权威剖析--MFC的原理、机制与开发实例].(随书光盘).iso 2012-06-11 15:21 5,744,909 《Lex与Yacc》中文第二版(带源码).rar 2012-06-11 15:25 26,431 云输入法.txt 2012-06-11 15:37 384,431 使用C语言知识编写个人...
  • vc源代码合集0951.rar

    热门讨论 2012-06-13 10:25:18
    2012-06-12 12:10 71,680 vs2010安装msdn.doc 2012-06-12 12:00 970,347 WebServer源代码.rar 2012-06-12 12:31 157,391 windiff_src.zip 2012-06-12 12:44 12,282,377 Windows2000设备驱动程序设计指南.pdf 2012-06...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

mfc实例教程vs2010