• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > m_ProxyDlgDoModal的问题

m_ProxyDlgDoModal的问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 m_ProxyDlgDoModal的问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: m_ProxyDlgDoModal的问题
描述:

CProxyDlg m_ProxyDlg;
m_ProxyDlg.DoModal()
我编一个ActiveX控件,但在这个控件里再显示一个窗体,如上面的语句就会出错,有什么好办法。我用属性页可以,但我不喜欢,因下面总有系统按钮。
这个控件要结束引用它的上级窗体怎么做。


解决方案1:

在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页中为CH

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-05 一个很简单的问题
  • 2017-06-05 Win98下调用DLL非法操作,大家帮帮忙看一下DLL代码有无问题
  • 2017-06-05 为什么要自己实现QueryInterface,为什么不能由某种系统调用来确定所有的接口地址呢?
  • 2017-06-04 能屏蔽掉ie的刷新按扭吗
  • 2017-06-04 怎么向isapi传递参数?
  • 2017-06-04 我想做一个组态软件(基于activex控件),可我不知道怎样将数据在运行模式下动态传入一个控件。请各位高手指点
  • 2017-06-05 怎么使用CWinThread类来进行多线程编程?
  • 2017-06-05 很奇怪:关于线程结束
  • 2017-06-04 现在我们老大做了一个程序使用的是com,使用com打开了一个excel进程,但是关闭不了这个excel进程.
  • 2017-06-05 请推荐一本怎么用VC6或者VCnet写DLL的书籍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 属性化ATL的问题
    • ActiveX中的IPersistStorage问题。
    • 请大家帮我看看,为什么我不能调到我写的DLL中的函数!
    • 如何编程实现用热键将当前窗口最小化,解决100分,欢迎讨论
    • ATL中使用ADO连接SQL数据库问题。
    • 初次使用COM,请教一个BSTR的类型转换问题
    • 实现接口出错
    • 已知一个快捷方式的目标,怎么用ShellExecute来实现双击此快捷方式的效果?
    • 不依赖扩展名,如何在vc中判断一个文件的格式
    • ActiveX控件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有