可视化OCX.docx
- 文档编号:9859910
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:10
- 大小:16.79KB
可视化OCX.docx
《可视化OCX.docx》由会员分享,可在线阅读,更多相关《可视化OCX.docx(10页珍藏版)》请在冰豆网上搜索。
可视化OCX
一、引入Dialog技术
----下面介绍在制作ActiveX控件时引入有模式对话框技术,制作步骤如下:
创建一新的MFCActiveXControlWizard项目,取名为Hello,其他用缺省选项;
在ResourceView页中新增一对话框资源,命名为IDD_HELLODIALOG,可以在对话
框上放自己的控件;
为对话框资源IDD_HELLODIALOG创建新类CHelloDialog,从CDialog继承;
确认在HelloCtrl.h中已加入语句#include"HelloDialog.h",为CHelloCtrl类
添加成员变量CHelloDialogm_helloDialog;
用ClassWizard在Automation页中为CHelloCtrl添加一方法voidDoHello(),外
部名亦为DoHello;
voidCHelloCtrl:
:
DoHello()
{
//显示对话框
m_helloDialog.DoModal();
}
----可以用ActiveXControlTestContainer测试HelloControl的DoHello方法。
----下面介绍在制作ActiveX控件时引入无模式对话框技术,制作步骤如下:
在上面工作的基础上,用ClassWizard为CHelloCtrl添加WM_CREATE的处理函数
OnCreate,在此创建无模式对话框;
修改DoHello代码,在此显示对话框;
intCHelloCtrl:
:
OnCreate
(LPCREATESTRUCTlpCreateStruct)
{
if(COleControl:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//创建对话框
m_helloDialog.Create(IDD_HELLODIALOG);
return0;
}
voidCHelloCtrl:
:
DoHello()
{
//显示对话框
m_helloDialog.ShowWindow(SW_SHOW);
}
----下面介绍制作以对话框作为界面的ActiveX控件技术,制作步骤如下:
在上面工作的基础上,设置对话框资源IDD_HELLODIALOG属性的Style页为
Style:
Child、Border:
DialogFrame、TitleBar:
unchecked;设置MoreStyle
页为Visible:
checked;Control:
checked;设置ExtendedStyles页为
StaticEdge:
checked;
在CHelloCtrl:
:
OnCreate中写入m_helloDialog.Create(IDD_HELLODIALOG,this)语句;
在CHelloCtrl:
:
OnDraw中写入m_helloDialog.MoveWindow(rcBounds,TRUE);
intCHelloCtrl:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(COleControl:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//创建对话框
m_helloDialog.Create(IDD_HELLODIALOG,this);
return0;
}
voidCHelloCtrl:
:
OnDraw(CDC*pdc,const
CRect&rcBounds,constCRect&rcInvalid)
{
//定位Hello对话框
m_helloDialog.MoveWindow(rcBounds,TRUE);
}
----二、引入FormView技术
----下面介绍在制作ActiveX控件时引入FormView技术,制作步骤如下:
在上面工作的基础上,在ResourceView页中新增一对话框资源,命名为
IDD_HELLOFORMVIEW,可以在对话框上放自己的控件;
设置对话框资源IDD_HELLODIALOG属性的Style页为Style:
Child、
Border:
DialogFrame、TitleBar:
unchecked;设置MoreStyle页为
Visible:
checked;Control:
checked;设置ExtendedStyles页为StaticEdge:
checked;
为对话框资源IDD_HELLOFORMVIEW创建新类CHelloFormView,从CFormView继承;
在HelloFormView.h中将CHelloFormView的构造函数CHelloFormView()和析
构函数virtual~CHelloFormView()从protected改为public;
在HelloFormView.h中对CHelloFormView类加入publicfriendclassCHelloCtrl;
确认在HelloCtrl.h中已加入语句#include"HelloFormView.h",为CHelloCtrl类
添加成员变量CHelloFormViewm_helloFormView;
修改CHelloCtrl:
:
OnCreate函数,在此创建m_helloFormView;
修改DoHello代码,在此显示FormView;
intCHelloCtrl:
:
OnCreate
(LPCREATESTRUCTlpCreateStruct)
{
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);
return0;
}
voidCHelloCtrl:
:
OnDraw(CDC*pdc,const
CRect&rcBounds,constCRect&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";
voidCHelloCtrl:
:
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)
deletem_pPrintFrame;
if(m_pPrintFrame!
=NULL)
deletem_pPrintDoc;
}
在PrintThread.cpp的CPrintThread:
:
InitInstance中,进行创建窗
体CPrintFrame,确认在PrintThread.cpp中已加入语句#include"PrintFrame.h";
BOOLCPrintThread:
:
InitInstance()
{
//创建文档/视图框架
CPrintFrame*pFrame=newCPrintFrame;
m_pMainWnd=pFrame;
m_pPrintFrame=pFrame;
m_pPrintDoc=newCPrintDoc;
CCreateContextcontext;
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);
returnTRUE;
}
在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函数,如下:
BOOLCPrintView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//准备打印
returnDoPreparePrinting(pInfo);
}
用ClassWizard在Automation页中为CHelloCtrl添加一方法voidDoPreview(),外
部名亦为DoPreview;
voidCHelloCtrl:
:
DoPreview()
{
//进行打印预览
:
:
PostMessage(m_pPrintThread->m_pPrintFrame->
GetActiveView()->m_hWnd,WM_USER_PREVIEW,0,0);
}
在PrintView.h中添加#defineWM_USER_PREVIEWWM_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_MAP
END_MESSAGE_MAP()
为类CPrintView添加成员函数LRESULTDoPreview(WPARAMwParam,LPARAMlParam)
实现CPrintView:
:
DoPreview如下:
LRESULTCPrintView:
:
DoPreview
(WPARAMwParam,LPARAMlParam)
{
//进入打印预览
OnFilePrintPreview();
return0;
}
为CPrintView添加public成员变量COleControl*m_pControlPreview,并初始化如下:
CPrintView:
:
CPrintView()
{
m_pControlPreview=NULL;//
初始化要预览的ActiveX控件类为空
}
在CPrintView:
:
OnDraw中对控件内容进行显示
voidCPrintView:
:
OnDraw(CDC*pDC)
{
if(m_pControlPreview==NULL)
pDC->TextOut(0,0,"NoPreviewView");
else{
CRectcontrolRect;
m_pControlPreview->GetClientRect(&controlRect);
CRectpreviewRect(0,0,controlRect.
Width(),controlRect.Height());
m_pControlPreview->OnDraw
(pDC,controlRect,controlRect);
}
}
用ClassWizard在Automation页中为CHelloCtrl添加一方法voidSetPreviewControl(),
外部名亦为SetPreviewControl,对其实现如下:
voidCHelloCtrl:
:
SetPreviewControl()
{
//设置要预览的View
CView*pView=m_pPrintThread->
m_pPrintFrame->GetActiveView();
CPrintView*pPrintView=(CPrintView*)pView;
pPrintView->m_pControlPreview=this;
}
----在ActiveXControlTestContainer测试,激活方法次序为DoHello、
SetPreviewControl、DoPreview
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可视化 OCX