mfc 调用ole控件的方法
- 格式:doc
- 大小:36.80 KB
- 文档页数:3
⼀步⼀步教你如何通过MFC操作excelexcel合成需要如下步骤:打开MFC⼯程(任何⼯程都可以,此处以串⼝为例)→打开MFC⼯程类向导并选择Automation→点击Add class,并选择from a type library。
江会弹出如下浏览框在浏览框中找到并选择office的excel.exe(或者是excel.olb),这⾥必须是office,⽽不能是wps,因为wps对应的事excel.et⽽不是exe⽂件,这⾥我选择的是excel.exe,我是⽤的是office2010,通过电脑的⽂件搜索功能定位了excel.exe的位置并添加的。
打开excel.exe之后,选择新类,如图总共选择六个类,分别是_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加⼊新类,即可达到⽤MFC操作excel的前提条件。
选完之后,可在classview中看到如下六个新类。
→在My***Dlg.cpp中加⼊#include”excel.h”与#include”comdef.h”,同时,在My***.cpp中加⼊#include”excel.h”→在My***App::InitInstance(),加⼊如下代码:if(!AfxOleInit() ){AfxMessageBox("初始化Ole出错!");return FALSE;},效果如图:注意excel保存时需要添加“comdef.h”头⽂件。
到此为⽌,excel在MFC中的配置环境已完成。
接下来添加⼀个按键,⽤于保存成excel⽂档,按键对应的程序如下:在对应(需要操作excel的)的CPP⽂件前加#include "comdef.h"_Application ExcelApp;Workbooks workbooks;_Workbook workbook;Worksheets sheets;_Worksheet sheet;Range range;if (!ExcelApp.CreateDispatch("Excel.Application",NULL)){AfxMessageBox("创建Excel服务失败!");}//创建Excel 2000服务器(启动Excel)ExcelApp.SetVisible(false);workbooks.AttachDispatch(ExcelApp.GetWorkbooks(),true); //⽤来锁定对应的⼯作簿workbook.AttachDispatch(workbooks.Add(COleVariant((_bstr_t)CString(). AllocSysString())));//得到Worksheetssheets.AttachDispatch(workbook.GetWorksheets(),true);sheet.AttachDispatch(sheets.GetItem(_variant_t("Sheet1")),true);//得到全部Cells,此时,range是cells的集合.range.AttachDispatch(sheet.GetCells(),true);//设置1⾏2列的单元的值range.SetItem(_variant_t((long)1),_variant_t((long)2),_variant_t("This Is A Excel Test Program!"));TCHAR szPath[MAX_PATH];::GetCurrentDirectory(MAX_PATH, szPath);CString strPath(szPath);strPath +=_T("\\test.xlsx");sheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing); ExcelApp.SetVisible(true);ExcelApp.ReleaseDispatch();workbooks.ReleaseDispatch();workbook.ReleaseDispatch();sheets.ReleaseDispatch(); sheet.ReleaseDispatch();Excel的数据读取:运⽤在MSDN中的⽰例函数(具体函数见excel⽂档创建⽰例4):根据顺序,依次从系统中获取app、books、book、sheets、sheet、range、对象,然后获取路径strpath。
MFC通用控件使用详解首先,我们需要在MFC应用程序中包含要使用的控件的头文件。
例如,要使用按钮控件,我们需要包含afxwin.h文件。
然后,在对话框资源中添加一个按钮控件,并给它一个唯一的ID值。
在OnInitDialog(函数中,我们可以使用以下代码获取按钮控件的指针并对其进行操作:```cppCButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON1);``````cpppButton->SetWindowText(_T("Click Me"));```我们还可以使用以下代码来设置按钮的样式:```cpppButton->SetButtonStyle(BS_DEFPUSHBUTTON);```这将使按钮默认显示为按下按钮。
```cppCEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);``````cppCString strText;pEdit->GetWindowText(strText);``````cpppEdit->SetWindowText(_T("Hello World"));```对于列表框控件,我们可以使用以下代码获取列表框的指针:```cppCListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST1); ```然后,我们可以使用以下代码向列表框中添加项:```cpppListBox->AddString(_T("Item 1"));pListBox->AddString(_T("Item 2"));```我们还可以使用以下代码来获取列表框中选定项的索引:```cppint nIndex = pListBox->GetCurSel(;```此外,MFC通用控件还提供了进度条控件和组合框控件等功能。
MFC一些调用的步骤MFC(Microsoft Foundation Class)是微软提供的用于开发Windows桌面应用程序的一套C++库。
它提供了许多方便的类和函数,使开发者可以更快速地创建Windows应用程序。
在使用MFC进行开发时,一般会按照以下步骤进行调用:1.创建一个MFC应用程序项目在Visual Studio中新建项目,选择MFC应用程序向导,设置项目的名称和位置,然后选择要使用的MFC库版本。
选择完毕后,点击“确定”按钮,系统就会自动生成一个MFC应用程序项目的骨架。
2.修改窗口类MFC应用程序的主窗口类通常继承自CFrameWnd或CMDIFrameWnd。
通过修改窗口类可以自定义应用程序的主窗口的外观和行为。
可以修改类的消息映射,添加自定义的消息处理函数。
3.设计主窗口的布局在上一步中,可以使用Visual Studio提供的设计器来设计主窗口的布局。
在设计器中,可以拖拽各种控件,设置它们的属性,使其显示在主窗口中。
4.响应控件的事件在MFC中,控件(如按钮、菜单等)可以触发事件,例如点击按钮,选择菜单项等。
开发者需要响应这些事件,并编写相应的处理函数。
通过消息映射表,将特定的消息与处理函数关联起来。
5.添加自定义对话框可以使用MFC提供的对话框设计器来创建自定义对话框。
在对话框中,可以添加各种控件,并定义响应事件的处理函数。
在需要显示自定义对话框时,使用对话框类的Create或DoModal方法来创建对话框的实例。
6.进行数据处理在MFC应用程序中,一般需要对数据进行处理。
可以使用MFC提供的数据库类(如CDatabase、CRecordset等)来连接数据库、执行SQL语句、获取查询结果等。
也可以使用MFC提供的文件操作类(如CFile、CFileFind等)进行文件的读写操作。
通过这些类,可以方便地进行数据处理。
7.添加多线程支持MFC提供了一套多线程支持的类和函数,可以帮助开发者实现多线程的应用程序。
经过一晚上的努力终于解决了在VS2008下VC++ 调用IDL的所有的问题。
环境:VS2008下的VC++ENVI4.7下的IDL7.1第一步:打开一个MFC的MFC的应用程序,并添加一个按钮,工程名为:hello1第二步:设置VS2008如:项目->hello1属性->配置属性->链接器->输入在对话框的附加依赖项:填写idl.lib第三步:在C:\Program Files (x86)\ITT\IDL71\external\include找到idl_export.h,把他放在hello1的工程文件里面,和其他.h文件放在一块第四步:在MFC的Button1的单击事件中,写入代码如下:HANDLE hInstance=AfxGetInstanceHandle();IDL_Win32Init(0,hInstance,NULL,0);IDL_ExecuteStr(".compile 'C:\Users\acer\Desktop\d_map.pro'");IDL_ExecuteStr("d_map");IDL_Cleanup(TRUE);注意:d_map.pro 文件放在C:\Users\acer\Desktop如果是想编译XX.sav文件,格式如:IDL_ExecuteStr(".restore, 'C:\Users\acer\Desktop\XX.sav'");其他代码不变还用一个注意事项是:添加idl_export.h头文件如:运行截图:不过在开始碰到很多系统问题如:我的系统是win7系统,开始新建MFC总是报错:mfc90ud.dll丢失,最后解决了是路径问题,解决方法是:“工具”—>“选项”—>“项目和解决方案”—>“VC++目录”,在可执行文件栏中加入下面的路径:$(SystemRoot)\System32$(SystemRoot)$(SystemRoot)\System32\wbem。
使用MFC开发ActiveX控件MFC(Microsoft Foundation Classes)是一套用于开发Windows应用程序的C++类库,它提供了一组封装了Windows API的类和函数,可以方便地开发Windows桌面应用程序。
ActiveX(ocx)控件是一种可重用的组件,可以嵌入到其他应用程序中使用,可以在网页上嵌入,也可以在Visual Studio等开发环境中使用。
下面将介绍如何使用MFC开发ActiveX控件。
然后,根据自己的需求,在OnDraw函数中绘制控件的外观。
可以使用GDI+函数绘制各种形状、文字、图像等。
可以通过设置控件属性,比如颜色、大小、透明度等来改变控件的外观。
接下来,处理控件的消息和事件。
通过重写控件类的成员函数,比如OnLButtonDown、OnKeyDown等,可以处理鼠标和键盘的输入事件。
可以在函数中编写相应的逻辑代码,比如响应鼠标点击事件时弹出一个对话框。
在控件类中,可以添加成员变量和成员函数,用于保存控件的状态和实现控件的功能。
可以在控件的Load函数中初始化控件,可以在DoPropExchange函数中保存控件的属性,可以在Serialize函数中保存控件的状态。
最后,编译项目,生成ActiveX控件的.dll文件。
可以在同一解决方案的其他项目中引用这个控件,通过拖拽控件到窗口上的方式将其嵌入到应用程序中使用。
总结起来,使用MFC开发ActiveX控件主要有以下几个步骤:创建MFC应用程序项目,设计控件的外观,处理控件的消息和事件,实现控件的功能,编译项目,生成ActiveX控件的.dll文件。
通过这些步骤,可以方便地开发自己的ActiveX控件,并在其他应用程序中使用。
mfc中cedit类使用方法MFC中的CEdit类是一种用于创建和管理编辑框控件的类。
编辑框控件可以用于接收用户输入的文本或显示文本信息。
在本文中,我们将介绍CEdit类的使用方法,包括创建编辑框、获取和设置文本内容、限制输入、设置样式和处理事件等。
一、创建编辑框要创建一个编辑框控件,首先需要在对话框资源中添加一个编辑框控件,并设置相应的属性,如ID和位置大小等。
然后,在对话框类的OnInitDialog函数中通过调用CEdit类的SubclassDlgItem函数来将编辑框与对话框资源中的控件进行关联。
代码示例如下:```cppBOOL CMyDialog::OnInitDialog(){CDialogEx::OnInitDialog();// 将ID为ID_EDIT的编辑框控件与对话框资源中的控件关联起来m_edit.SubclassDlgItem(ID_EDIT, this);return TRUE;}```二、获取和设置文本内容CEdit类提供了几个用于获取和设置文本内容的函数。
例如,可以使用GetWindowText函数获取编辑框的文本内容,并使用SetWindowText函数设置编辑框的文本内容。
代码示例如下:```cppCString strText;// 获取编辑框的文本内容m_edit.GetWindowText(strText);// 设置编辑框的文本内容m_edit.SetWindowText(_T("Hello, World!"));```三、限制输入CEdit类还提供了一些函数用于限制用户输入的内容。
例如,可以使用SetLimitText函数设置编辑框的最大字符数。
代码示例如下:```cpp// 限制编辑框的最大字符数为10m_edit.SetLimitText(10);```四、设置样式CEdit类提供了一些函数用于设置编辑框的样式。
例如,可以使用SetReadOnly函数将编辑框设置为只读模式,用户无法编辑其中的文本。
使用Windows标准控件我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。
在Visual C++中,可以使用的控件分成三类:(1) Windows标准控件Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。
所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。
Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。
表6.1 Windows标准控件续表6.1前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。
Windows标准控件在以下环境下提供:•Windows 95•Windows NT 3.51及以后版本•Win32s 1.3•注意:•Visual C++ 4.2及以后版本不再支持Win32s。
(2) ActiveX控件ActiveX控件可用于对话框中,也可用于HTML文档中。
这种控件过去被称为OLE 控件。
本书将在专门的章节中来讲述关于ActiveX控件的知识。
这里仅指出ActiveX控件使用了与标准控件完全不同的接口和实现方法。
(3) 其它MFC控件类除了Windows标准控件和自己编写的或者来自于第三方软件开发商的ActiveX 控件以外,MFC还提供了另外三种控件,它们由下面的三个类进行封装:•类CBitmapButton用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别代表按钮的四种不同状态。
•类CCheckListBox用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定该项是否被选中。
•类CDragListBox用于创建一种特殊的列表框,这种列表框允许用户移动列表项。
在本章我们仅讲述第一类控件,即Windows标准控件。
所涉及的内容包括各个控件的使用及相应的技巧。
在MF C中应用CTree Ctrl控件的技巧作者:阿宽下载源代码首先,我们要创建一个基本对话框的MFC工程MFC_T reeC RT L(名字随便给一个)。
然后在资源视图中插入两个D ia lo g,ID分别为IDD_DIA LOG11和ID D_DIA LOG211,都更改Sty le属性为C hild,B o rde r 属性为No ne,为它们建立两个类,分别命名为C dia lo g11和C dia lo g211,并在MFC_T reeC RT LD lg.CPP文件中包含dia lo g11.h和dia lo g211.h两个头文件。
再导入几个资源图标作为树形控件节点的图标及装饰面板。
最后在主面板上添加一个CT reeC trl控件,I D为默认,并在C lassW iza rd中添加它的一个变量,命名为m_myt ree。
接着,我们进行具体代码编写。
我们必须在CMFC_T reeC RT LD lg类中加入这些变量和函数CDialog * m_treePa ges[2];CString no de_name;BOOL InitM ytree();我们还要在CMFC_T reeC RT LD lg类的构造函数中为m_tre ePa ges[2]分配空间,m_treePage s[0]=new Cdialo g11;m_treePage s[1]=new Cdialo g211;InitMyt re e()函数为m_myt re e的初始化过程BOOL CMFC_TreeCRTL Dlg::In itMytre e(){//节点的图标int i=0;int i_coun t=2;//载入图标HICON icon[4];icon[0]=Af xGetApp()->Load Icon (I DI_ICON6);icon[1]=Af xGetApp()->Load Icon (I DI_ICON7);//创建图像列表控件CImageList *m_imag elist=n ew CIma geList;m_imagelis t->Creat e(16,16,0,7,7);m_imagelis t->SetBk Color (RGB(255,255,255));for(int n=0;n<i_co unt;n++){m_imagelis t->Add(i con[n]); //把图标载入图像列表控件}m_mytree.S etImageL ist(m_i magelis t,TVSIL_NORMAL); //为m_mytree设置一个图像列表,使CtreeCt rl的节点显示不同的图标m_mytree.S etBkColo r(RGB(0,250,255));//设置m_mytree的背景色//创建节点//父节点HTREEITEMroot0=m_my tree.Ins ertItem("Dialo g1",0,1,TVI_ROO T,TVI_L AST);HTREEITEMroot1=m_my tree.Ins ertItem("Dialo g2",0,1,TVI_ROO T,TVI_L AST);//一层子节点HTREEITEM sub_son0=m_mytr ee.Inse rtItem("Dialog1-1",0,1,r oot0,TVI_LAST);HTREEITEM sub_son1=m_mytr ee.Inse rtItem("Dialog2-1",0,1,r oot1,TVI_LAST);//二层孙子节点HTREEITEM sub_m_so n0=m_my tree.In sertIte m("Dialo g2-1-1",0,1,sub_son1,TVI_L AST);//建立节点对应的Dialo gm_treePage s[0]->Cr eate(ID D_DIALO G11,thi s);m_treePage s[1]->Cr eate(ID D_DIALO G211,th is);m_treePage s[0]->Sh owWindo w(SW_SH OW);m_treePage s[1]->Sh owWindo w(SW_HI DE);//把Dialog移到合适位置CRect m_re ct;GetClientR ect(m_re ct);m_rect.lef t=200;m_treePage s[0]->Mo veWindo w(m_rec t);m_treePage s[1]->Mo veWindo w(m_rec t);return tru e;}始初化完成后,我们要添加CT re eCt rl的消息响应事件,这样才能让它按我们的要求起作用。
///code/frame.cpp// frame.cpp : implementation of the CMainFrame class//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#include "stdafx.h"#include "oclient.h"#include "frame.h"#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)//_{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_COMMAND(ID_WINDOW_TILE_HORZ, OnWindowTileHorz) ON_WM_PALETTECHANGED()ON_WM_QUERYNEWPALETTE()//_}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// arrays of IDs used to initialize control bars// toolbar buttons - IDs are command buttonsstatic UINT BASED_CODE buttons[] ={// same order as in the bitmap 'toolbar.bmp'ID_FILE_NEW,ID_FILE_OPEN,ID_FILE_SA VE,ID_SEPARATOR,ID_EDIT_CUT,ID_EDIT_COPY,ID_EDIT_PASTE,ID_SEPARATOR,ID_FILE_PRINT,ID_APP_ABOUT,ID_CONTEXT_HELP,};static UINT BASED_CODE indicators[] ={ID_SEPARATOR, // status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};/////////////////////////////////////////////////////////////////////////////// CMainFrame construction/destructionCMainFrame::CMainFrame(){}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;if (!m_wndToolBar.Create(this) ||!m_wndToolBar.LoadBitmap(IDR_MAINFRAME) ||!m_wndToolBar.SetButtons(buttons,sizeof(buttons)/sizeof(UINT))){TRACE0("Failed to create toolbar\n");return -1; // fail to create}if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status bar\n");return -1; // fail to create}EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);CDC* pDC = GetDC();m_palette.CreateHalftonePalette(pDC);ReleaseDC(pDC);return 0;}CMainFrame::~CMainFrame(){}/////////////////////////////////////////////////////////////////////////////// CMainFrame diagnostics#ifdef _DEBUGvoid CMainFrame::AssertValid() const{CMDIFrameWnd::AssertValid();}void CMainFrame::Dump(CDumpContext& dc) const{CMDIFrameWnd::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CMainFrame commandsvoid CMainFrame::OnWindowTileHorz(){if (GetKeyState(VK_SHIFT) < 0)OnMDIWindowCmd(ID_WINDOW_TILE_VERT);elseOnMDIWindowCmd(ID_WINDOW_TILE_HORZ);}/////////////////////////////////////////////////////////////////////////////// CMainFrame message handlersvoid CMainFrame::OnPaletteChanged(CWnd* pFocusWnd){CMDIFrameWnd::OnPaletteChanged(pFocusWnd);if (pFocusWnd != this)SelectPalette(TRUE);}BOOL CMainFrame::OnQueryNewPalette(){if (CMDIFrameWnd::OnQueryNewPalette())return TRUE;return SelectPalette(FALSE);}BOOL CMainFrame::SelectPalette(BOOL bBackground){if (m_palette.m_hObject == NULL)return FALSE;CDC* pDC = GetDC();CPalette* pOldPal = pDC->SelectPalette(&m_palette, bBackground);UINT nPalChg = pDC->RealizePalette();pDC->SelectPalette(pOldPal, TRUE); // backgroundReleaseDC(pDC);if (nPalChg > 0)InvalidateRect(NULL, TRUE);return TRUE;}///code/frame.h// frame.h : interface of the CMainFrame class//// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.class CMainFrame : public CMDIFrameWnd{DECLARE_DYNAMIC(CMainFrame)public:CMainFrame();// Attributespublic:CPalette m_palette;// Operationspublic:BOOL SelectPalette(BOOL bBackground);// Implementationpublic:virtual ~CMainFrame();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif// Control bar embedded membersprotected:CStatusBar m_wndStatusBar;CToolBar m_wndToolBar;// Generated message map functionsprotected://_{{AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnWindowTileHorz();afx_msg void OnPaletteChanged(CWnd* pFocusWnd);afx_msg BOOL OnQueryNewPalette();//_}}AFX_MSGDECLARE_MESSAGE_MAP()};////////////////////////////////////////////////////////////////////////////////code/maindoc.cpp// maindoc.cpp : implementation of the CMainDoc class//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#include "stdafx.h"#include "oclient.h"#include "maindoc.h"#include "rectitem.h"#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif// private clipboard formatCLIPFORMAT CMainDoc::m_cfPrivate = NULL;/////////////////////////////////////////////////////////////////////////////// CMainDocIMPLEMENT_DYNCREATE(CMainDoc, COleLinkingDoc)BEGIN_MESSAGE_MAP(CMainDoc, COleLinkingDoc)//_{{AFX_MSG_MAP(CMainDoc)ON_COMMAND(ID_EDIT_CLEAR_ALL, OnEditClearAll)ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR_ALL, OnUpdateEditClearAll) //_}}AFX_MSG_MAPON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdatePasteMenu)ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, OnUpdatePasteLinkMenu) ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, OnUpdateEditLinksMenu) ON_COMMAND(ID_OLE_EDIT_LINKS, OnEditLinks)ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, OnUpdateObjectVerbMenu)ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CHANGE_ICON, OnUpdateEditChangeIcon)ON_COMMAND(ID_OLE_EDIT_CHANGE_ICON, OnEditChangeIcon) END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMainDoc construction/destructionCMainDoc::CMainDoc() : m_sizeDoc(800,1050) // document size is 8x10.5 {EnableCompoundFile();m_bNeedUpdate = TRUE;if (m_cfPrivate == NULL)m_cfPrivate = (CLIPFORMAT)::RegisterClipboardFormat(_T("MFC OClient Sample"));}CMainDoc::~CMainDoc(){}CSize &CMainDoc::GetDocumentSize(){return m_sizeDoc;}void CMainDoc::OnShowViews(BOOL bVisible){COleLinkingDoc::OnShowViews(bVisible);if (bVisible && m_bNeedUpdate){// update embedded links in this document before showing the windowCOleUpdateDialog dlg(this);dlg.DoModal();m_bNeedUpdate = FALSE;}}/////////////////////////////////////////////////////////////////////////////// CMainDoc item managementCRectItem* CMainDoc::CreateItem(){return new CRectItem(this); // does 'AddItem' automatically}// safe delete that notifies viewsvoid CMainDoc::DeleteItem(CRectItem* pItem){ASSERT(pItem->GetDocument() == this);SetModifiedFlag();UpdateAllViews(NULL, 1, pItem); // pItem will be deletedpItem->Delete(); // does a 'RemoveItem' & 'delete this' automatically }/////////////////////////////////////////////////////////////////////////////// CMainDoc serializationvoid CMainDoc::Serialize(CArchive& ar){// NOTE: New easier to use serialization model -- even for OLE objects!WORD wMagic = 0x0DAF;if (ar.IsStoring()){if (HasBlankItems() &&AfxMessageBox(IDP_SA VEINCOMPLETE,MB_YESNO|MB_ICONQUESTION) != IDYES){TRACE0("Aborting save -- incomplete items found!\n");AfxThrowArchiveException(CArchiveException::generic);}ar << wMagic;}else{WORD w;ar >> w;if (w != wMagic){TRACE0("invalid magic number at start of file\n");AfxThrowArchiveException(CArchiveException::generic);}}// serialize the rest of the document (OLE items)COleLinkingDoc::Serialize(ar);}/////////////////////////////////////////////////////////////////////////////// CMainDoc commandsvoid CMainDoc::OnEditClearAll(){// delete all items in the document (also removes sub-storages)POSITION pos = GetStartPosition();while (pos != NULL){CRectItem* pItem = (CRectItem*)GetNextItem(pos);ASSERT_KINDOF(CRectItem, pItem);pItem->Delete();}// everything is gone now!SetModifiedFlag();UpdateAllViews(NULL);}void CMainDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI){// Enable ClearAll if there is anything to clearpCmdUI->Enable(GetStartPosition() != NULL);}void CMainDoc::AdjustItemPosition(CRectItem* pItem){POSITION pos = GetStartPosition();while (pos != NULL){CRectItem* pRectItem = (CRectItem*)GetNextItem(pos);ASSERT_KINDOF(CRectItem, pItem);if (pRectItem != pItem && pRectItem->GetRect() == pItem->GetRect()){pItem->m_ptPos.x += 10;pItem->m_ptPos.y -= 10;pos = GetStartPosition();}}}/////////////////////////////////////////////////////////////////////////////// CMainDoc diagnostics#ifdef _DEBUGvoid CMainDoc::AssertValid() const{COleLinkingDoc::AssertValid();}void CMainDoc::Dump(CDumpContext& dc) const{COleLinkingDoc::Dump(dc);}#endif //_DEBUG///code/maindoc.h// maindoc.h : interface of the CMainDoc class//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.class CRectItem;class CMainDoc : public COleLinkingDoc{protected: // create from serialization onlyCMainDoc();DECLARE_DYNCREATE(CMainDoc)// Attributespublic:static CLIPFORMAT m_cfPrivate;CSize m_sizeDoc;CSize& GetDocumentSize();BOOL m_bNeedUpdate;// Operationspublic:CRectItem* CreateItem(); // this document only stores CRectItems void DeleteItem(CRectItem* pItem);void AdjustItemPosition(CRectItem* pItem);// Implementationpublic:virtual ~CMainDoc();virtual void Serialize(CArchive& ar); // overridden for document i/o virtual void OnShowViews(BOOL bVisible);#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif// Generated message map functionsprotected://_{{AFX_MSG(CMainDoc)afx_msg void OnEditClearAll();afx_msg void OnUpdateEditClearAll(CCmdUI* pCmdUI);//_}}AFX_MSGDECLARE_MESSAGE_MAP()};////////////////////////////////////////////////////////////////////////////////code/mainview.cpp// mainview.cpp : implementation of the CMainView class//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#include "stdafx.h"#include "oclient.h"#include "maindoc.h"#include "mainview.h"#include "rectitem.h"#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMainViewCBrush NEAR CMainView::m_brHatch;CLIPFORMAT CMainView::m_cfObjectDescriptor=NULL;IMPLEMENT_DYNCREATE(CMainView, CScrollView)BEGIN_MESSAGE_MAP(CMainView, CScrollView)//_{{AFX_MSG_MAP(CMainView)ON_COMMAND(ID_EDIT_PASTE, OnPaste)ON_COMMAND(ID_EDIT_PASTE_LINK, OnPasteLink)ON_COMMAND(ID_OLE_INSERT_NEW, OnInsertObject)ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR, OnUpdateEditMenu)ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)ON_COMMAND(ID_EDIT_COPY, OnEditCopy)ON_COMMAND(ID_EDIT_CUT, OnEditCut)ON_WM_LBUTTONDBLCLK()ON_WM_LBUTTONDOWN()ON_WM_SETCURSOR()ON_WM_RBUTTONDOWN()ON_WM_CHAR()ON_WM_SETFOCUS()ON_WM_CREATE()ON_WM_SIZE()ON_COMMAND(ID_OBJECT_DISPLAYCONTENT, OnObjectDisplayContent) ON_UPDATE_COMMAND_UI(ID_OBJECT_DISPLAYCONTENT, OnUpdateObjectDisplayContent)ON_COMMAND(ID_OBJECT_DISPLAYASICON, OnObjectDisplayAsIcon)ON_UPDATE_COMMAND_UI(ID_OBJECT_DISPLAY ASICON, OnUpdateObjectDisplayAsIcon)ON_COMMAND(ID_EDIT_PASTE_SPECIAL, OnPasteSpecial)ON_UPDATE_COMMAND_UI(ID_EDIT_CLONE, OnUpdateEditClone)ON_COMMAND(ID_EDIT_CLONE, OnEditClone)ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_SPECIAL, OnUpdateEditPaste)ON_COMMAND(ID_OBJECT_RESETSIZE, OnObjectResetsize)ON_COMMAND(ID_CANCEL_INPLACE, OnCancelInplace)ON_WM_DESTROY()ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditMenu)ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditMenu)ON_UPDATE_COMMAND_UI(ID_OBJECT_RESETSIZE, OnUpdateEditMenu)ON_COMMAND(ID_OLE_CHANGE_SOURCE, OnOleChangeSource)ON_UPDATE_COMMAND_UI(ID_OLE_CHANGE_SOURCE, OnUpdateOleChangeSource)ON_COMMAND(ID_OLE_EDIT_PROPERTIES, OnOleEditProperties)ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_PROPERTIES, OnUpdateOleEditProperties)//_}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMainView construction/destructionCMainView::CMainView(){if (m_brHatch.m_hObject == NULL)m_brHatch.CreateHatchBrush(HS_DIAGCROSS, RGB(0,0,0));if (m_cfObjectDescriptor == NULL)m_cfObjectDescriptor =(CLIPFORMAT)::RegisterClipboardFormat(_T("Object Descriptor"));m_pSelection = NULL;m_prevDropEffect = DROPEFFECT_NONE;m_bInDrag = FALSE;}CMainView::~CMainView(){}void CMainView::OnInitialUpdate(){CScrollView::OnInitialUpdate();// We can't pass MM_ANISOTROPIC to SetScrollSizes so we have to convert to MM_TEXTCSize size = GetDocument()->GetDocumentSize();CClientDC dc(NULL);size.cx = MulDiv(size.cx, dc.GetDeviceCaps(LOGPIXELSX), 100);size.cy = MulDiv(size.cy, dc.GetDeviceCaps(LOGPIXELSY), 100);SetScrollSizes(MM_TEXT, size);}/////////////////////////////////////////////////////////////////////////////// CMainView drawingvoid CMainView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo){CScrollView::OnPrepareDC(pDC, pInfo);// set up a reasonable default contextpDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));// LOENGLISH units are based on physical inches// We want logical inches so we have to do it differentlypDC->SetMapMode(MM_ANISOTROPIC);pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX), pDC->GetDeviceCaps(LOGPIXELSY));pDC->SetWindowExt(100,-100);}void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem, CRect* pTrueRect){ASSERT(pTracker != NULL);ASSERT(pItem != NULL);pTracker->m_rect = pItem->GetRect();DocToClient(pTracker->m_rect);// set minimum size for our OLE itemspTracker->m_sizeMin.cx = 8;pTracker->m_sizeMin.cy = 8;pTracker->m_nStyle = 0;// setup resize handles if item is selectedif (pItem == m_pSelection)pTracker->m_nStyle |= CRectTracker::resizeInside;// put correct border depending on item typeif (pItem->GetType() == OT_LINK)pTracker->m_nStyle |= CRectTracker::dottedLine;elsepTracker->m_nStyle |= CRectTracker::solidLine;// put hatching over the item if it is currently openif (pItem->GetItemState() == COleClientItem::openState ||pItem->GetItemState() == COleClientItem::activeUIState){pTracker->m_nStyle |= CRectTracker::hatchInside;}if (pTrueRect != NULL)pTracker->GetTrueRect(pTrueRect);}void CMainView::OnDraw(CDC* pDC){CMainDoc* pDoc = GetDocument();ASSERT_V ALID(pDC);if (!pDC->IsPrinting()){m_brHatch.UnrealizeObject();CPoint point(0, 0);pDC->LPtoDP(&point);pDC->SetBrushOrg(point.x % 8, point.y % 8);CRect rcClip;GetClientRect(&rcClip);ClientToDoc(rcClip);CSize docSize = pDoc->GetDocumentSize();if (rcClip.right > docSize.cx){CRect rcFill(rcClip);rcFill.left = max(rcFill.left,docSize.cx);pDC->FillRect(rcFill,&m_brHatch);}if (rcClip.bottom < -docSize.cy){CRect rcFill(rcClip);rcFill.top = min(rcFill.top, -docSize.cy);pDC->FillRect(rcFill,&m_brHatch);}}// Draw all the CRectItemsPOSITION pos = pDoc->GetStartPosition();while (pos != NULL){CRectItem* pItem = DYNAMIC_DOWNCAST(CRectItem, pDoc->GetNextItem(pos));if (pItem != NULL){pItem->Draw(pDC, pItem->GetRect());if (!pDC->IsPrinting()){// draw the trackerCRectTracker tracker;CRect rectTrue;SetupTracker(&tracker, pItem, &rectTrue);ClientToDoc(rectTrue);if (pDC->RectVisible(&rectTrue))tracker.Draw(pDC);}}}}// pHint is the deleted item or NULL if deselect/delete allvoid CMainView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) {if (pHint == NULL && lHint == 0){// some sort of clear allm_pSelection = NULL;}if (pHint != NULL && pHint->IsKindOf(RUNTIME_CLASS(CRectItem))) {// just invalidate the one itemInvalidateItem((CRectItem*)pHint);// clear selection if pointing to deleted itemif (lHint == 1 && pHint == m_pSelection){// specific case of pHint being deletedm_pSelection = NULL;}}else if (lHint != 0){// invalidate arbitrary rectangleInvalidateRect((CRect*)lHint);}else{// complete updateCScrollView::OnUpdate(pSender, lHint, pHint);}}void CMainView::InvalidateItem(CRectItem* pItem){if (m_nMapMode != 0){CRectTracker tracker;CRect rect;SetupTracker(&tracker, pItem, &rect);InvalidateRect(&rect);}}BOOL CMainView::OnScrollBy(CSize sizeScroll, BOOL bDoScroll) {// remove drag/drop feedback before scrollingif (bDoScroll && m_prevDropEffect != DROPEFFECT_NONE){CClientDC dc(this);dc.DrawFocusRect(CRect(m_dragPoint, m_dragSize));// erase previous focus rectm_prevDropEffect = DROPEFFECT_NONE;}// do the scrollif (!CScrollView::OnScrollBy(sizeScroll, bDoScroll))return FALSE;// update the position of any in-place active itemif (bDoScroll){UpdateActiveItem();UpdateWindow();}return TRUE;}/////////////////////////////////////////////////////////////////////////////// CMainView printingBOOL CMainView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}/////////////////////////////////////////////////////////////////////////////// Selection supportBOOL CMainView::IsSelected(const CObject* pDocItem) const{return (pDocItem == m_pSelection);}void CMainView::SetSelection(CRectItem* pNewSel, BOOL bSafeSelect) {if (pNewSel != NULL && pNewSel == m_pSelection)return;// deactivate any in-place active item on this view!COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);if (pActiveItem != NULL && pNewSel != pActiveItem){if (bSafeSelect)return;// if we found one, deactivate itpActiveItem->Close();ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL);}if (m_pSelection != NULL) // invalidate the old itemInvalidateItem(m_pSelection);if ((m_pSelection = pNewSel) != NULL) // invalidate the new itemInvalidateItem(m_pSelection);}/////////////////////////////////////////////////////////////////////////////// CMainView diagnostics#ifdef _DEBUGvoid CMainView::AssertValid() const{CScrollView::AssertValid();}void CMainView::Dump(CDumpContext& dc) const{CScrollView::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// Main 'Edit' menu commandsvoid CMainView::OnUpdateEditMenu(CCmdUI* pCmdUI){// most Edit menu commands are enabled only if we have a selection// and there are no in-place activations for this viewpCmdUI->Enable(m_pSelection != NULL &&GetDocument()->GetInPlaceActiveItem(this) == NULL);}void CMainView::OnEditCut(){ASSERT(m_pSelection != NULL);TRY{m_pSelection->CopyToClipboard(TRUE);OnEditClear();}CA TCH_ALL(e){AfxMessageBox(IDP_CLIPBOARD_CUT_FAILED);}END_CATCH_ALL}void CMainView::OnEditCopy(){ASSERT(m_pSelection != NULL);TRY{m_pSelection->CopyToClipboard(TRUE);}CA TCH_ALL(e){AfxMessageBox(IDP_CLIPBOARD_COPY_FAILED);}END_CATCH_ALL}void CMainView::OnEditClear(){if (m_pSelection != NULL)GetDocument()->DeleteItem(m_pSelection);}void CMainView::OnPaste(){if (DoPasteItem(FALSE, NULL, NULL) == NULL)AfxMessageBox(IDP_GET_FROM_CLIPBOARD_FAILED); }void CMainView::OnPasteLink(){if (DoPasteItem(TRUE, NULL, NULL) == NULL)AfxMessageBox(IDP_GET_FROM_CLIPBOARD_FAILED); }void CMainView::DoPasteNative(COleDataObject* pDataObject, CPoint* pPoint, CRectItem* pItem) {// get file refering to clipboard dataCFile* pFile = pDataObject->GetFileData(CMainDoc::m_cfPrivate);if (pFile == NULL){// if the file failed to open, throw an exception// to force cleanup in DoPasteItem. the exact// type of exception thrown here is unimportant...AfxThrowFileException(CFileException::generic);}CArchive ar(pFile, CArchive::load);TRY{// connect the file to an archive and read the dataar.m_pDocument = GetDocument(); // for COleClientItem serializepItem->Serialize(ar);}CA TCH_ALL(e){ar.Close();delete pFile;THROW_LAST();}END_CATCH_ALLar.Close();delete pFile;// adjust position to that specified by pointif (pPoint != NULL)pItem->m_ptPos = *pPoint;}void CMainView::DoPasteStandard(BOOL bLink, COleDataObject* pDataObject, CPoint* pPoint, CRectItem* pItem, CLIPFORMAT cfFormat){if (bLink) // paste link{if (!pItem->CreateLinkFromData(pDataObject))AfxThrowMemoryException(); // any exception will do}// paste embeddedelse if (!pItem->CreateFromData(pDataObject) &&!pItem->CreateStaticFromData(pDataObject, OLERENDER_DRAW, cfFormat)) {AfxThrowMemoryException(); // any exception will do}// copy the current iconic representationFORMATETC fmtetc;fmtetc.cfFormat = CF_METAFILEPICT;fmtetc.dwAspect = DV ASPECT_ICON;fmtetc.ptd = NULL;fmtetc.tymed = TYMED_MFPICT;fmtetc.lindex = 1;HGLOBAL hObj = pDataObject->GetGlobalData(CF_METAFILEPICT, &fmtetc);if (hObj != NULL){pItem->SetIconicMetafile(hObj);// the following code is an easy way to free a metafile pictSTGMEDIUM stgMed;memset(&stgMed, 0, sizeof(stgMed));stgMed.tymed = TYMED_MFPICT;stgMed.hGlobal = hObj;ReleaseStgMedium(&stgMed);}// set the current drawing aspecthObj = pDataObject->GetGlobalData(m_cfObjectDescriptor);if (hObj != NULL){ASSERT(hObj != NULL);// got CF_OBJECTDESCRIPTOR ok. Lock it down and extract size.LPOBJECTDESCRIPTOR pObjDesc = (LPOBJECTDESCRIPTOR)GlobalLock(hObj);ASSERT(pObjDesc != NULL);pItem->SetDrawAspect((DV ASPECT)pObjDesc->dwDrawAspect);GlobalUnlock(hObj);GlobalFree(hObj);}// set top-left based on point of dropif (pPoint != NULL)pItem->m_ptPos = *pPoint;// get size from drag/drop operationCSize size;if (GetObjectInfo(pDataObject, &size, NULL) && size.cx != 0 && size.cy != 0){// use size obtained from object instead of defaultsize.cx = MulDiv(size.cx, 10, 254);size.cy = -MulDiv(size.cy, 10, 254);pItem->SetSize(size);CSize sizeExtent;pItem->GetCachedExtent(&sizeExtent);pItem->SetBaseSize(sizeExtent);}else{// no extent from CF_OBJECTDESCRIPTOR, use extent from objectpItem->UpdateExtent();}}// Helper for paste/pastelink//// bLink pDataObject pPoint cfFormat // EditPaste FALSE NULL(clipboard) NULL(default) 0// Drag/Drop TRUE/FALSE X X 0 // PasteLink TRUE NULL(clipboard) NULL(default) 0// PasteSpecial TRUE/FALSE X NULL(default) X CRectItem* CMainView::DoPasteItem(BOOL bLink, COleDataObject* pDataObject, CPoint* pPoint, CLIPFORMAT cfFormat){BeginWaitCursor();CRectItem* pItem = GetDocument()->CreateItem();ASSERT_V ALID(pItem);BOOL bAllowAdjust = (pPoint == NULL) ? TRUE : FALSE;// use clipboard data if not doing drag/dropCOleDataObject clipboardData;if (pDataObject == NULL){clipboardData.AttachClipboard();pDataObject = &clipboardData;}TRY{if (cfFormat == CMainDoc::m_cfPrivate){// if format specified (i.e. PasteSpecial) then use that oneDoPasteNative(pDataObject, pPoint, pItem);}else if (!bLink && cfFormat == 0 &&pDataObject->IsDataAvailable(CMainDoc::m_cfPrivate)){// if we're not pasting a link, cfFormat was unspecified,// and private format is available use itDoPasteNative(pDataObject, pPoint, pItem);}// otherwise perform a standard pasteelse if (bAllowAdjust){CPoint ptDef(10, -10);DoPasteStandard(bLink, pDataObject, &ptDef, pItem, cfFormat);}else{DoPasteStandard(bLink, pDataObject, pPoint, pItem, cfFormat);}if (bAllowAdjust){// allow document to adjust position of item so that it doesn't// lay directly over an item of the same size// this only occurs if the drop point is not specifiedGetDocument()->AdjustItemPosition(pItem);}}CA TCH_ALL(e){// general cleanupTRACE0("failed to embed/link an OLE object\n");pItem->Delete();pItem = NULL;}END_CATCH_ALL// set the selection with bSafeSelect = TRUESetSelection(pItem, TRUE);// update the document and viewsGetDocument()->SetModifiedFlag();GetDocument()->UpdateAllViews(NULL, 0, pItem); // including this view EndWaitCursor();return pItem;}/////////////////////////////////////////////////////////////////////////////// Insert New Object and Activate Objectvoid CMainView::OnInsertObject(){COleInsertDialog dlg;if (dlg.DoModal() != IDOK)return;BeginWaitCursor();CRectItem* pItem = NULL;TRY{// create item from dialog resultspItem = GetDocument()->CreateItem();if (!dlg.CreateItem(pItem))AfxThrowMemoryException(); // any exception will do// try to get initial presentation datapItem->UpdateLink();pItem->UpdateExtent();// if insert new object -- initially show the objectif (dlg.GetSelectionType() == COleInsertDialog::createNewItem)。
NX⼆次开发-基于MFC界⾯的NX对Excel读写操作(OLE⽅式(COM组件))EXCAL操作(⼀)打开写⼊新建⼀个MFC项⽬点击下⼀步选择基于对话框直接点完成,进来后如下图先点项⽬,右键属性,更改为多字节。
先什么都不动,编译⼀下代码。
默认看能不能通过。
然后点项⽬,右键类向导。
弹出窗⼝如下点击添加类-类型库中的MFC类弹出如下我们切换到⽂件,点击添加。
此处添加要找到的⽂件就是你电脑上装的EXCAL.exe这个程序⽂件。
如果你不知道怎么找到的话,有⼀个⽅法,先去开始菜单找到你的EXCAL快捷⽅式,然后在点右键,打开⽂件所在的位置。
这样就找到了。
下⾯在回到MFC项⽬⾥⾯,我们选中这个⽂件。
添加进来之后,如图所⽰。
左侧为EXCAL给出的接⼝,我们来选择⼀些需要的添加进来。
我们就先添加这七个,后续有其他需求在添加其他的。
(先在左侧接⼝⾥选中⼀个,点中间的>就能添加到右侧⾥⽣成的类⾥,不想要就在点中间的<撤退回去。
)然后我们点完成,点确定。
就看到头⽂件⾃动添加进来了。
我们点击新增进来的EXCAL每个头⽂件,都把第⼀⾏的那句注释掉。
都注释完之后,我们在#include "stdafx.h"⾥添加EXCAL头⽂件,然后编译代码,出现如下报错问题。
这时我们双击这个错误,跳到对应的代码那⾥。
有问题的位置如下我们需要在DialogBox前⾯加上⼀个 _ 下划线。
再去编译就通过了。
别问我为什么,我答不上来,你照着搞就是了,别⼈就是这么搞的。
好的,到这⾥我们这个项⽬环境就算搭建完成了。
下⾯可以写代码了。
点击MFC那个对话框界⾯,双击确定。
在⾥⾯写代码。
代码如下:打开EXCAL,写⼊内容。
1//1.创建基本对象2 CApplication App; //创建应⽤程序实例3 CWorkbooks Books; //⼯作簿,多个Excel⽂件4 CWorkbook Book; //单个⼯作簿5 CWorksheets sheets;//多个sheet页⾯6 CWorksheet sheet; //单个sheet页⾯7 CRange range; //操作单元格8//2.打开指定Excel⽂件,如果不存在就创建9char path[MAX_PATH];10 GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//获取当前路径11 CString strExcelFile = (TCHAR*)path;12 CString strdevName = _T("\\Test.xlsx"); //xls也⾏13 strExcelFile += strdevName;14 COleVariant15 covTrue((short)TRUE),16 covFalse((short)FALSE),17 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);1819 LPDISPATCH lpdisp = NULL;20//1.创建Excel实例21if (!App.CreateDispatch(_T("Excel.Application"), NULL))22 {23 AfxMessageBox(_T("创建Excel实例失败"));24 exit(-1);25 }26else27 {28 AfxMessageBox(_T("创建成功"));29 }30 App.put_Visible(TRUE); //打开Excel31 App.put_UserControl(FALSE);32//2. 得到workbooks容器33 Books.AttachDispatch(App.get_Workbooks());34 Book.AttachDispatch(Books.Add(covOptional));35 sheets.AttachDispatch(Book.get_Worksheets());36 sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1))); //获取sheet137 sheet.put_Name(_T("TestName")); //设置sheet1名字3839//3. 加载要合并的单元格40 range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);41 range.Merge(COleVariant((long)0)); //合并单元格4243//4. 设置表格内容44 range.AttachDispatch(sheet.get_Cells(), TRUE); //加载所有单元格45 range.put_Item(COleVariant((long)2), COleVariant((long)2), COleVariant(_T("电⽓⼯程及其⾃动化课程统计")));46 range.put_Item(COleVariant((long)3), COleVariant((long)2), COleVariant(_T("课程名称")));47 range.put_Item(COleVariant((long)3), COleVariant((long)3), COleVariant(_T("课时")));48 range.put_Item(COleVariant((long)3), COleVariant((long)4), COleVariant(_T("难度")));49 range.put_Item(COleVariant((long)3), COleVariant((long)5), COleVariant(_T("教学⽅式")));5051 range.put_Item(COleVariant((long)4), COleVariant((long)2), COleVariant(_T("电磁场")));52 range.put_Item(COleVariant((long)4), COleVariant((long)3), COleVariant(_T("30")));53 range.put_Item(COleVariant((long)4), COleVariant((long)4), COleVariant(_T("变态难")));54 range.put_Item(COleVariant((long)4), COleVariant((long)5), COleVariant(_T("⽼师讲课")));5556 range.put_Item(COleVariant((long)5), COleVariant((long)2), COleVariant(_T("电机学")));57 range.put_Item(COleVariant((long)5), COleVariant((long)3), COleVariant(_T("40")));58 range.put_Item(COleVariant((long)5), COleVariant((long)4), COleVariant(_T("难")));59 range.put_Item(COleVariant((long)5), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));6061 range.put_Item(COleVariant((long)6), COleVariant((long)2), COleVariant(_T("PLC")));62 range.put_Item(COleVariant((long)6), COleVariant((long)3), COleVariant(_T("20")));63 range.put_Item(COleVariant((long)6), COleVariant((long)4), COleVariant(_T("普通")));64 range.put_Item(COleVariant((long)6), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));656667 range.put_Item(COleVariant((long)7), COleVariant((long)2), COleVariant(_T("电⼒系统")));68 range.put_Item(COleVariant((long)7), COleVariant((long)3), COleVariant(_T("50")));69 range.put_Item(COleVariant((long)7), COleVariant((long)4), COleVariant(_T("难")));70 range.put_Item(COleVariant((long)7), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));7172 range.AttachDispatch(sheet.get_UsedRange());//加载已使⽤的单元格73 range.put_WrapText(COleVariant((long)1)); //设置⽂本⾃动换⾏7475//5.设置对齐⽅式76//⽔平对齐:默认 1 居中 -4108,左= -4131,右=-415277//垂直对齐:默认 2 居中 -4108,左= -4160,右=-410778 range.put_VerticalAlignment(COleVariant((long)-4108));79 range.put_HorizontalAlignment(COleVariant((long)-4108));80//6.设置字体颜⾊81 CFont0 ft;82 ft.AttachDispatch(range.get_Font());83 ft.put_Name(COleVariant(_T("楷体"))); //字体84 ft.put_ColorIndex(COleVariant((long)1));//颜⾊ //⿊⾊85 ft.put_Size(COleVariant((long)12)); //⼤⼩8687 range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);88 ft.AttachDispatch(range.get_Font());89 ft.put_Name(COleVariant(_T("华⽂⾏楷")));90 ft.put_Bold(COleVariant((long)1));91 ft.put_ColorIndex(COleVariant((long)5)); //颜⾊92 ft.put_Size(COleVariant((long)18)); //⼤⼩93 Book.SaveCopyAs(COleVariant(strExcelFile)); //保存9495 Book.put_Saved(TRUE);96//8.释放资源97 range.ReleaseDispatch();98 sheet.ReleaseDispatch();99 sheets.ReleaseDispatch();100 Book.ReleaseDispatch();101 Books.ReleaseDispatch();102 App.ReleaseDispatch();编译后,我们点调试-开始执⾏。
MFC通用控件使用详解MFC(Microsoft Foundation Classes)是微软提供的一套用于开发Windows应用程序的C++类库,其中包括了许多常用的控件类,称为MFC通用控件。
本文将详细介绍MFC通用控件的使用。
例如,要使用按钮控件,首先需要在对话框资源中添加一个按钮控件,然后在对话框类的头文件中声明一个按钮变量:```cppCButton m_btnOK;```接下来,在对话框的OnInitDialog(函数中,使用DDX_Control函数将按钮资源和按钮变量关联起来:```cppDDX_Control(pDX, IDOK, m_btnOK);```现在,就可以通过按钮变量来操作按钮控件了。
可以使用按钮变量的EnableWindow(函数来启用或禁用按钮,使用SetWindowText(函数来设置按钮文本,使用GetCheck(函数来获取按钮的选中状态等等。
除了上述通用控件类,MFC还提供了专用的控件类,用于创建自定义的控件。
通过继承这些类,并重写相应的虚函数,可以创建具有自定义样式和功能的控件。
例如,通过继承CButton类,可以创建一个具有不同外观和动画效果的自定义按钮。
在使用MFC通用控件时,还需要注意以下几点。
首先,要注意控件的相对位置和大小,以便能够正确地布局和对齐。
其次,要使用合适的控件样式和扩展样式,以满足特定的需求。
例如,可以使用BS_RADIOBUTTON样式来创建单选按钮,使用LBS_MULTIPLESEL样式来创建多选列表框等等。
最后,要注意处理控件的消息和事件,以便能够及时响应用户的操作。
mfc调用控件的函数 -回复一个MFC程序中常常需要调用控件的函数来完成特定的功能。
控件是MFC中窗口中的一部分,可以是按钮、编辑框、列表框等等。
调用控件的函数可以使程序更加灵活,实现更多的功能。
在本文中,我将详细介绍如何在MFC 中调用控件的函数。
首先,我们需要在M FC的框架中加入控件。
控件可以通过资源编辑器添加到对话框上,也可以手动在代码中创建。
在资源编辑器中,我们可以选择各种不同的控件,例如按钮、编辑框、列表框等等。
选择一个合适的控件后,我们可以设置其ID和其它属性。
在代码中创建控件需要使用MFC提供的相关函数,例如CButton、CEdit等。
一旦我们在对话框中创建了一个控件,我们就可以在代码中调用它的函数了。
要调用控件的函数,我们首先需要获取该控件的指针。
在MFC中,可以通过类成员变量和GetDlgItem函数来获取控件的指针。
如果我们使用类成员变量来获取控件的指针,我们需要在类中声明一个成员变量来保存该控件的指针。
例如,如果我们在对话框上添加了一个按钮,可以在对话框类的头文件中声明一个成员变量来保存该按钮的指针。
然后,在对话框类的OnInitDialog函数中使用GetDlgItem函数来获取按钮的指针并将其保存到成员变量中。
这样,我们就可以在代码中使用该成员变量来调用按钮的函数了。
另一种获取控件指针的方法是使用GetDlgItem函数。
GetDlgItem函数可以通过对话框的句柄和控件的ID来获取控件的指针。
通过GetDlgIt em函数获取的指针是临时的,我们可以在需要的地方直接调用控件的函数。
例如,我们可以在某个按钮的点击事件处理函数中使用GetDlgItem函数获取另一个按钮的指针,然后调用该按钮的函数来实现一些特定的功能。
一旦我们获取了控件的指针,就可以调用它的函数了。
控件的函数可以用来设置控件的属性、获取控件的属性、响应控件的事件等等。
调用控件的函数的方法和调用普通函数的方法是相同的,我们可以使用指针来访问控件的函数。
在Microsoft Foundation Classes (MFC) 中,你可以使用类成员函数来调用控件的功能,这些控件通常是对话框中的按钮、文本框、列表框等。
以下是一些示例代码,展示了如何在MFC 中调用控件的函数:
假设你有一个对话框类CMyDialog,其中包含一个按钮控件和一个文本框控件。
你可以在类的成员函数中使用控件的ID 来操作它们。
调用按钮控件的函数:
假设你有一个按钮控件的ID 为IDC_BUTTON1,你可以在按钮的点击事件处理函数中调用它的函数,例如:
void CMyDialog::OnBnClickedButton1()
{
// 在按钮点击事件中执行操作
// 例如,显示一个消息框
MessageBox(_T("按钮被点击了!"));
}
设置文本框控件的内容:
假设你有一个文本框控件的ID 为IDC_EDIT1,你可以使用CWnd::SetDlgItemText 函数来设置文本框的内容,例如:
void CMyDialog::SetEditText(const CString& text)
{
GetDlgItem(IDC_EDIT1)->SetWindowText(text);
}
上述代码中,GetDlgItem(IDC_EDIT1) 用于获取文本框的指针,然后使用SetWindowText 设置文本内容。
这只是示例中的两种情况,你可以根据具体的控件类型和需要调用不同的函数来操作它们。
通常,MFC 提供了许多函数来管理和控制不同类型的控件,你可以查阅MFC 文档以获取更多详细信息和示例代码。
MFC控件使用说明MFC(Microsoft Foundation Class)是一套面向C++开发的框架,用于快速开发图形用户界面(GUI)应用程序。
MFC提供了一套丰富的控件(Controls),用于实现各种功能和交互效果。
本文将介绍一些常用的MFC控件的使用说明。
1. Button 控件:Button控件用于显示一个按钮,用户点击按钮时会触发相应的事件处理函数。
使用方式如下:-在对话框资源中添加一个按钮控件,并为其设置ID号。
- 在对话框类的变量中声明按钮控件的成员变量,使用CButton类型。
- 在OnInitDialog函数中使用GetDlgItem函数获取按钮控件的指针,并使用它调用相应的函数,如SetWindowText设置按钮的文本内容。
3. List Box 控件:List Box控件用于显示一个列表,用户可以选择其中的项。
使用方式如下:-在对话框资源中添加一个列表框控件,并为其设置ID号。
- 在对话框类的变量中声明列表框控件的成员变量,使用CListBox类型。
- 在OnInitDialog函数中使用GetDlgItem函数获取列表框控件的指针,并使用它调用相应的函数,如AddString添加项,SetCurSel设置选中项。
-在对话框资源中添加一个组合框控件,并为其设置ID号。
- 在OnInitDialog函数中使用GetDlgItem函数获取组合框控件的指针,并使用它调用相应的函数,如AddString添加项,SetCurSel设置选中项。
5. Check Box 控件:Check Box控件用于显示一个复选框,用户可以选中或取消选中。
-在对话框资源中添加一个复选框控件,并为其设置ID号。
- 在对话框类的变量中声明复选框控件的成员变量,使用CButton类型。
- 在OnInitDialog函数中使用GetDlgItem函数获取复选框控件的指针,并使用它调用相应的函数,如SetCheck设置选中状态。
mfc调用active控件
MFC(Microsoft Foundation Class)是一种用于开发Windows 应用程序的C++类库,而ActiveX控件是一种可重用的软件组件,通常用于在Web浏览器或其他容器应用程序中显示交互式内容。
在MFC中调用ActiveX控件可以通过以下步骤实现:
1. 首先,你需要在MFC应用程序中创建一个对话框或视图来容纳ActiveX控件。
你可以在资源编辑器中添加一个ActiveX控件,或者在代码中动态创建和添加ActiveX控件。
2. 然后,你需要在MFC应用程序中使用类向导来生成ActiveX 控件的包装类。
在Visual Studio中,你可以使用“添加类”对话框来生成包装类。
3. 生成包装类后,你可以在对话框或视图类的代码中实例化ActiveX控件的包装类对象,并调用其方法或设置其属性。
例如,你可以使用Create函数创建ActiveX控件的实例,并使用其提供的方法来实现所需的功能。
4. 最后,在MFC应用程序的消息映射函数中处理ActiveX控件
的事件,例如按钮点击事件或文本框内容改变事件。
你可以通过包装类提供的事件映射功能来实现对ActiveX控件事件的处理。
总的来说,MFC调用ActiveX控件涉及到创建包装类、实例化控件对象、调用控件方法和处理控件事件等步骤。
通过这些步骤,你可以在MFC应用程序中有效地使用ActiveX控件实现丰富的交互式功能。
MFC控件使用说明MFC(Microsoft Foundation Classes)是一套C++的类库,用于开发Windows应用程序。
MFC提供了丰富的控件(control)来实现图形界面(GUI)。
下面是MFC控件的使用说明。
1.控件概述:2.控件的创建:在MFC应用程序的对话框资源中可以选择并拖拽控件到界面上。
MFC 提供了DIALOG控件类表示对话框,并通过类向导(Class Wizard)自动生成控件的成员变量。
3.控件的属性和事件:每个控件都有一些属性,如字体、颜色、大小等,可以通过修改这些属性来改变控件的外观。
每个控件也都有一些事件,如鼠标点击、按键按下等,可以通过响应这些事件来处理用户的操作。
4.控件的操作:MFC提供了一系列的成员函数来操作控件,如设置文本、获取选择的项、显示隐藏控件等。
可以通过控件的成员变量来调用这些函数。
5.控件的布局和对齐:在对话框资源中可以使用布局与对齐工具来自动排列和对齐控件。
也可以通过代码来动态调整控件的位置和大小。
6.控件的自定义:如果MFC提供的控件不能满足需求,可以继承自原有控件类,并重写其成员函数来实现自定义的控件。
7.控件的扩展库:除了MFC提供的控件,还可以使用第三方控件库来增加更多的控件。
常见的控件库有DevExpress、Telerik等,提供了更丰富的控件和功能。
8.控件的样式和外观:9.控件的国际化和本地化:MFC提供了多语言支持,可以使用资源文件来实现对不同语言的支持。
通过在资源文件中提供不同语言的字符串,可以使控件显示适合不同语言环境的文本。
10.控件的错误处理:在使用MFC控件时,可能会出现一些错误,如控件无法创建、控件响应事件失败等。
可以通过正确处理这些错误,如捕获异常、输出错误信息等来保证程序的稳定性和可靠性。
总结:MFC控件提供了丰富的功能和灵活的扩展方式,可以满足大部分GUI应用程序的需求。
通过掌握MFC控件的使用,可以快速开发出功能强大、界面友好的Windows应用程序。
使用MFC操作EXCEL文件一、加载1、在VC6.0里创建一个MFC工程2、打开MFC ClassWizard窗口(查看—>建立类向导),选择Automation,单击Add Class 按钮,选择From a type library...,弹出文件选择对话框,之后定位到C:\ProgramFiles\Microsoft Office\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图。
3、返回编辑器,查看工程文件,可发现多了EXCEL.H及EXCEL.CPP两个文件,拷贝出来,放在VS2005需要使用excel的工程文件中。
4. 打开stdafx.h头文件确保包含如下头文件:#include <afxdisp.h>(这个一般有了)#include "excel.h" (手动添加这个即可)5. 打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:if( !AfxOleInit() ){AfxMessageBox("初始化Ole出错!");return FALSE;}为保证编译时不产生重复定义错误(可以验证一下是否成功加载,没有也能正常执行),我编译时出现了很多“类重复定义”异常,打开excel.h文件,在文件开始位置加入如下代码:#if !defined _HEAD_FILE_EXCEL9_#define _HEAD_FILE_EXCEL9_相应的,在文件末尾加入:#endif成功二、操作EXCEL文件1. 新建一个excel表,并填充两个单元格的实例void CTestExcelDlg::OnButton1(){//Workbooks—>Workbook —>Worksheets—>Worksheet —>Range_Application app; //Excel应用程序接口Workbooks books; //工作薄集合_Workbook book; //工作薄Worksheets sheets; //工作表集合_Worksheet sheet; //工作表Range range; //Excel中针对单元格的操作都应先获取其对应的Range对象Font font;Range cols;/*COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用VARIANT数据类型进行参数传递。
PWIN98/95下演练VC5中的COMMON一族辽宁省铁岭市委办公室(112000)宋立波中文PWIN98/95之所以深受广大计算机用户的青睐,除其在32位多任务、多线程和系统稳固性等核心技术的重要改进之外,更主要的还是其优秀的用户交互界面。
这就给程序设计人员提出了新的课题,如何在自己开发的应用程序中充分利用WIN98/95支持的各种高级通用控制和视,这也是学习VC编程所必须掌握的基本内容,本文将通过实例来具体演练VC5中的这些控件,其中常用的COMMON一族主要成员包括:1.表头控制 Header Control2.图像列表控制 Image List3.列表控制和视 List Control&List View4.树控制和视 Tree Control&Tree View5.标签控制和视 Tab Control&Tab View6.工具条控制 Toolbar Control7.进度条控制 Progress Control8.滑动条控制 Slider Control9.旋转按钮控制 Spin Button Control10.状态条控制 Status Bar Control其中,绝大部分通用控制在MFC类库中都存在两种封装形式,即控制类和视类,控制类主要是供直接使用控制而提供的,而视类则是通过间接使用控制而提供的,视类可以更好地把控制类集成到MFC结构中,并且使用视类可以利用引用直接对嵌套在其中的控制进行各种操作。
两者在使用方法上没有太大区别,就拿列表控制类和视类来说,当创建列表视后可通过CListCtrl& ctrlList = GetListCtrl()成员函数取得视类引用ctrlList之后,就可以利用列表视的视函数对视进行各项操作(ctrlList.Add等)。
一、PWIN98/95下演练CHeadCtrl表头控制(CHeaderCtrl)通常应用在窗口中的文本或数据的列表之上。
mfc 调用ole控件的方法
在MFC(Microsoft Foundation Classes)中调用OLE控件的方法,通常涉及到COM(Component Object Model)编程。
以下是一个基本的步骤指南:
1. 创建COM对象:首先,你需要创建一个COM对象。
这通常通过调用`CoCreateInstance`实现。
2. 获取接口:通过COM对象,你可以获取到所需接口的指针。
这通常通过调用`QueryInterface`实现。
3. 调用方法:有了接口指针之后,你就可以调用该接口的方法了。
下面是一个简单的示例代码,展示如何在MFC应用程序中调用一个简单的OLE控件方法:
```cpp
include <>
include <>
class CMyMFCApp : public CWinApp
{
public:
virtual BOOL InitInstance() override
{
CWinApp::InitInstance();
// 创建COM对象
CLSID clsid;
CLSIDFromProgID(L"YourOleControlProgID", &clsid); IYourOleControlPtr pControl; // 假设你的OLE控件名称为YourOleControl
(clsid);
// 调用方法
pControl->YourMethod(); // 假设你要调用的方法名为YourMethod
return TRUE;
}
};
CMyMFCApp theApp;
```
请注意,上述代码只是一个示例,并且假设你已经知道OLE控件的ProgID。
在实际应用中,你需要根据具体的OLE控件和其接口来编写代码。
此外,
还需要处理COM对象的生命周期管理,例如在适当的时候调用`Release`来避免内存泄漏。