在ActiveX控件中引入窗体技术

暮雪白头老i

暮雪白头老i

2016-02-19 14:05

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的在ActiveX控件中引入窗体技术教程,一起来看看吧!超容易上手~
一、引入Dialog技术
  
  下面介绍在制作ActiveX控件时引入有模式对话框技术,制作步骤如下:
  
  创建一新的MFC ActiveX ControlWizard项目,取名为Hello,其他用缺省选项;
   
  在ResourceView页中新增一对话框资源,命名为IDD_HELLODIALOG,可以在对话框上放自己的控件;
   
  为对话框资源IDD_HELLODIALOG创建新类CHelloDialog,从CDialog继续;
   
  确认在HelloCtrl.h中已加入语句#include "HelloDialog.h",为CHelloCtrl类添加成员变量CHelloDialog m_helloDialog;
   
  用ClassWizard在Automation页中为CHelloCtrl添加一方法void DoHello(),外部名亦为DoHello;
  
  void CHelloCtrl::DoHello() { // 显示对话框 m_helloDialog.DoModal(); }
  
  可以用ActiveX Control Test Container测试Hello Control的DoHello方法。
  
  下面介绍在制作ActiveX控件时引入无模式对话框技术,制作步骤如下:
  
  在上面工作的基础上,用ClassWizard为CHelloCtrl添加WM_CREATE的处理函数OnCreate,在此创建无模式对话框;
   
  修改DoHello代码,在此显示对话框;
  
  int CHelloCtrl::OnCreate (LPCREATESTRUCT lpCreateStruct) {
   if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
   // 创建对话框
   m_helloDialog.Create(IDD_HELLODIALOG);
   return 0;
  }
  void CHelloCtrl::DoHello() {
   // 显示对话框
   m_helloDialog.ShowWindow(SW_SHOW);
  }
  下面介绍制作以对话框作为界面的ActiveX控件技术,制作步骤如下:
  
  在上面工作的基础上,设置对话框资源IDD_HELLODIALOG属性的Style页为Style:Child、Border:Dialog Frame、Title Bar:unchecked;设置More Style页为Visible:checked;Control:checked;设置Extended Styles页为Static Edge:checked;
   
  在CHelloCtrl::OnCreate中写入m_helloDialog.Create(IDD_HELLODIALOG,this)语句;
   
  在CHelloCtrl::OnDraw中写入m_helloDialog.MoveWindow(rcBounds,TRUE);
  
  int CHelloCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
   // 创建对话框
   m_helloDialog.Create(IDD_HELLODIALOG,this);
   return 0;
  }
  void CHelloCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
   // 定位Hello对话框
   m_helloDialog.MoveWindow(rcBounds,TRUE);
  }
  二、引入FormView技术
  
  下面介绍在制作ActiveX控件时引入FormView技术,制作步骤如下:
  
  在上面工作的基础上,在ResourceView页中新增一对话框资源,命名为IDD_HELLOFORMVIEW,可以在对话框上放自己的控件;
   
  设置对话框资源IDD_HELLODIALOG属性的Style页为Style:Child、Border:Dialog Frame、Title Bar:unchecked;设置More Style页为Visible:checked;Control:checked;设置Extended Styles页为Static Edge:checked;
   
  为对话框资源IDD_HELLOFORMVIEW创建新类CHelloFormView,从CFormView继续;
   
  在HelloFormView.h中将CHelloFormView的构造函数CHelloFormView()和析构函数virtual ~CHelloFormView()从protected改为public;
   
  在HelloFormView.h中对CHelloFormView类加入public friend class CHelloCtrl;
  
  确认在HelloCtrl.h中已加入语句#include "HelloFormView.h",为CHelloCtrl类添加成员变量CHelloFormView m_helloFormView;
   
  修改CHelloCtrl::OnCreate函数,在此创建m_helloFormView;
   
  修改DoHello代码,在此显示FormView;
  
  int CHelloCtrl::OnCreate (LPCREATESTRUCT lpCreateStruct) {
   if (COleControl::OnCreate(lpCreateStruct) == -1) return -1;
   // 创建FormView
   m_helloFormView.Create(NULL,NULL,AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL);
   return 0;
  }
  void CHelloCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
   // 定位Hello对话框
   m_helloFormView.MoveWindow(rcBounds,TRUE);
  }
  三、引入Document/View结构技术
  
  下面介绍在制作ActiveX控件时引入Document/View技术,制作步骤如下:
  
  在上面工作的基础上,在Hello工程中用ClassWizard添加一新类CPrintFrame,取其父类为CFrameWnd;
   
  在PrintFrame.h中将CPrintFrame的构造函数CPrintFrame()和析构函数virtual ~CPrintFrame()从protected改为public;
   
  在Hello工程中用ClassWizard添加一新类CPrintView,取其父类为CView;
   
  在PrintView.h中将CPrintView的构造函数CPrintView()和析构函数virtual ~CPrintView()从protected改为public;
   
  在Hello工程中用ClassWizard添加一新类CPrintDoc,取其父类为CDocument;
   
  在PrintDoc.h中将CPrintDoc的构造函数CPrintDoc()和析构函数virtual ~CPrintDoc()从protected改为public;
   
  在Hello工程中用ClassWizard添加一新类CPrintThread,取其父类为CWinThread;
   
  在HelloCtrl.h文件中为CHelloCtrl类添加成员变量CPrintThread* m_pPrintThread,确认在HelloCtrl.h中已加入语句#include "PrintThread.h";
  
  void CHelloCtrl::DoHello() { // 创建打印线程 m_pPrintThread = (CPrintThread*) AfxBeginThread(RUNTIME_CLASS(CPrintThread), THREAD_PRIORITY_NORMAL, CREATE_SUSPENDED, NULL); m_pPrintThread- ResumeThread();}
   
  在PrintThread.h中添加新成员变量
  
  CPrintDoc* m_pPrintDoc和CPrintFrame* m_pPrintFrame,并在构造函数和析构函数中完成对它们的初始设置和清除,确认在PrintThread.h中已加入语句#include "PrintDoc.h"和#include "PrintFrame.h";
  
  
   CPrintThread::CPrintThread(){
   m_pPrintDoc=NULL;
   m_pPrintFrame=NULL;
  }
  CPrintThread::~CPrintThread(){
   if (m_pPrintDoc!=NULL)
  delete m_pPrintFrame;
   if (m_pPrintFrame!=NULL)
  delete m_pPrintDoc;
  }
  在PrintThread.cpp的CPrintThread::InitInstance中,进行创建窗体CPrintFrame,确认在PrintThread.cpp中已加入语句#include "PrintFrame.h";
  
  BOOL CPrintThread::InitInstance(){
   // 创建文档/视图框架
   CPrintFrame* pFrame = new CPrintFrame;
   m_pMainWnd = pFrame;
   m_pPrintFrame=pFrame;
   m_pPrintDoc=new CPrintDoc;
   CCreateContext context;
   context.m_pCurrentDoc = m_pPrintDoc;
   context.m_pNewViewClass = RUNTIME_CLASS(CPrintView);
   pFrame- Create(NULL,"打印主窗体", WS_OVERLAPPEDWINDOW,CRect(0,0,100,100), NULL,NULL,0,&context);
   pFrame- InitialUpdateFrame(m_pPrintDoc, TRUE);
   return TRUE;
  }
  在PrintView.h的CPrintView中,添加成员函数CPrintDoc* GetDocument(),确认在PrintView.h中已加入语句#include "PrintDoc.h";
  
  CPrintDoc* CPrintView::GetDocument(){
   ASSERT(m_pDocument- ISKINdOf (RUNTIME_CLASS(CPrintDoc)));
   return (CPrintDoc*)m_pDocument;
  }
  四、实现ActiveX打印预览技术
  
  下面介绍利用上面的技术成果来实现ActiveX的打印预览技术,实现步骤如下:
  
  在上面工作的基础上,用ClassWizard对CPrintView类实现OnPreparePrinting函数,如下:
  
  BOOL CPrintView::OnPreparePrinting(CPrintInfo* pInfo) { // 预备打印 return DoPreparePrinting(pInfo);}
  用ClassWizard在Automation页中为CHelloCtrl添加一方法void DoPreview(),外部名亦为DoPreview;
  
  void CHelloCtrl::DoPreview() {
   // 进行打印预览
   ::PostMessage(m_pPrintThread- m_pPrintFrame- GetActiveView()- m_hWnd,WM_USER_PREVIEW,0,0);
  }
  在PrintView.h中添加#define WM_USER_PREVIEW WM_USER+10
   
  在PrintView.cpp中的消息映射中添加ON_MESSAGE(WM_USER_PREVIEW, DoPreview),形成如下:
  
  BEGIN_MESSAGE_MAP(CPrintView, CView)ON_MESSAGE(WM_USER_PREVIEW, DoPreview)
  //
  {{AFX_MSG_MAP(CPrintView)
  //
  }}
  AFX_MSG_MAPEND_MESSAGE_MAP()
  为类CPrintView添加成员函数LRESULT DoPreview(WPARAM wParam, LPARAM lParam)
   
  实现CPrintView::DoPreview如下:
  
  LRESULT CPrintView::DoPreview(WPARAM wParam, LPARAM lParam){
   // 进入打印预览
   OnFilePrintPreview();
   return 0;
  }
  为CPrintView添加public成员变量COleControl* m_pControlPreview,并初始化如下:
  
  CPrintView::CPrintView(){
   m_pControlPreview=NULL;
   // 初始化要预览的ActiveX控件类为空
  }
  在CPrintView::OnDraw中对控件内容进行显示:
  
  void CPrintView::OnDraw(CDC* pDC){
   if (m_pControlPreview==NULL)
  pDC-TextOut(0,0,"No Preview View");
   else {
  CRect controlRect;
  m_pControlPreview- GetClientRect(&controlRect);
  CRect previewRect(0,0,controlRect. Width(),controlRect.Height());
  m_pControlPreview- OnDraw (pDC,controlRect,controlRect);
   }
  }
  用ClassWizard在Automation页中为CHelloCtrl添加一方法void SetPreviewControl(),外部名亦为SetPreviewControl,对其实现如下:
  
  
   void CHelloCtrl::SetPreviewControl() {
   // 设置要预览的View
   CView* pView=m_pPrintThread- m_pPrintFrame- GetActiveView();
   CPrintView* pPrintView=(CPrintView*)pView;
   pPrintView- m_pControlPreview=this;
  }
  在ActiveX Control Test Container测试,激活方法次序为DoHello、SetPreviewControl、DoPreview。
展开更多 50%)
分享

猜你喜欢

在ActiveX控件中引入窗体技术

编程语言 网络编程
在ActiveX控件中引入窗体技术

在BCB中轻松使用ActiveX控件

编程语言 网络编程
在BCB中轻松使用ActiveX控件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在Delphi中巧改窗体文件实现控件数组

编程语言 网络编程
在Delphi中巧改窗体文件实现控件数组

激活 ActiveX 控件

Web开发
激活 ActiveX 控件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Activex控件的应用

设计软件 平面设计软件 广告设计软件
Activex控件的应用

在Delphi中巧改窗体文件实现控件数组化

Delphi
在Delphi中巧改窗体文件实现控件数组化

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何自定义提示窗口(Hint Window)

如何自定义提示窗口(Hint Window)

Word 2007技巧:设置标题行重复显示

Word 2007技巧:设置标题行重复显示
下拉加载更多内容 ↓