OCX 界面对话框 无法显示webBrower 大家帮忙看看?

etaonirs 2010-06-28 03:32:10
我需要在一个OCX里面显示一个浏览器的对话框,
1 先资源视图先向工程里插入了一个IDD_FORMVIEW的非模态对话框 (IDD_FORMVIEW)
2 类向导为这个对话框创建了对应了一个类CMyDlg
3 在对话框上导入了Registered ActiveX Controls里面的“Microsoft Web 浏览器” (IDC_EXPLORER1)并且在对话框类CMyDlg中关联了一个 成员变量m_Explores
4 在CxxxCtrl(向导生成的类)中添加了WM_CREATE的消息处理函数
int CTestOcxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;

m_pDialog = new CMyDlg(); //CMyDlg* m_pDialog
//Check if new succeeded and we got a valid pointer to a dialog object
if(m_pDialog != NULL)
{
BOOL ret = m_pDialog->Create(IDD_FORMVIEW,this);
if(!ret) //Create failed.
{
AfxMessageBox(_T("Error creating Dialog"));
return -1;
}
m_pDialog->ShowWindow(SW_SHOW);
}
else
AfxMessageBox(_T("Error Creating Dialog Object"));

return 0;
}

6 在CMyDlg::OnInitDialog中添加如下代码
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();

//AfxMessageBox("Enter CMyDlg OnInitDialog");
CString strURL =_T( "http://www.sina.com.cn");
m_varURL = (_variant_t)(LPCTSTR)strURL;
m_Explorer.Navigate2(&m_varURL, NULL, NULL, NULL, NULL);
//m_Explorer.SetVisible(TRUE);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}


编译可通过,可是程序运行起来却无法显示出来我嵌入到对话框中的WebBrower而且,程序起来后,出几个提示框后,会自动异常退出
调试跟进去后发现
执行完 m_pDialog = new CMyDlg(); 该语句后调试窗口m_pDialog的Value 以红色字体标出0x04581450
hWnd=0x00000000
执行完 BOOL ret = m_pDialog->Create(IDD_FORMVIEW,this);后ret = 0

这是怎么回事呢?

如果我把跟WebBrower 相关的全都删除掉,程序能正确的进行下去(可以显示一个空白的面板),所以我考虑应该是WebBrower没设置好,高人们帮帮忙看看我的问题到底出那里,会不会我是我的COM库没有初始化。
...全文
162 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjingmmc 2012-10-19
  • 打赏
  • 举报
回复
在初始化对话框函数OnInitDialog()中加AfxEnableControlContainer();
etaonirs 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 loong460 的回复:]
引用 11 楼 etaonirs 的回复:
原因我找到了,整个逻辑没有问题,就是CTestOcxCtrl类创建个无模式的对话框,然后在对话矿上在创建个浏览器插件,原因出在,我应该让我的这个CTestOcxCtrl类支持“控件容器”
就是在 CTestOcxCtrl类的InitInstance()函数里面加上AfxEnableControlContainer();就可以了
唉!

请问“C……
[/Quote]
就是CXXXXCtrl 这个类里面的一个函数
loong460 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 etaonirs 的回复:]
原因我找到了,整个逻辑没有问题,就是CTestOcxCtrl类创建个无模式的对话框,然后在对话矿上在创建个浏览器插件,原因出在,我应该让我的这个CTestOcxCtrl类支持“控件容器”
就是在 CTestOcxCtrl类的InitInstance()函数里面加上AfxEnableControlContainer();就可以了
唉!
[/Quote]
请问“CTestOcxCtrl类的InitInstance()函数”在哪里呢?怎么添加的?
etaonirs 2010-07-18
  • 打赏
  • 举报
回复
原因我找到了,整个逻辑没有问题,就是CTestOcxCtrl类创建个无模式的对话框,然后在对话矿上在创建个浏览器插件,原因出在,我应该让我的这个CTestOcxCtrl类支持“控件容器”
就是在 CTestOcxCtrl类的InitInstance()函数里面加上
AfxEnableControlContainer();就可以了
唉!
蒋晟 2010-06-30
  • 打赏
  • 举报
回复
m_pDialog = new CMyDlg(); //CMyDlg* m_pDialog
//Check if new succeeded and we got a valid pointer to a dialog object
if(m_pDialog != NULL)
{
BOOL ret = m_pDialog->Create(IDD_FORMVIEW,this);
加这个干什么?要得到父窗口的话GetParent就行了
etaonirs 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiangsheng 的回复:]
为什么MyDlg上放ActiveX,ActiveX创建的时候又新建MyDlg呢?这不是死循环了?你到底要几个MyDlg对象?
[/Quote]

MyDlg上放的是WebBrowser(这个ActiveX),(ActiveX)创建的时候,创建的是上面有含有WebBrowser的一个对话框,逻辑上没有错误吧?
etaonirs 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiangsheng 的回复:]
为什么MyDlg上放ActiveX,ActiveX创建的时候又新建MyDlg呢?这不是死循环了?你到底要几个MyDlg对象?
[/Quote]

我的那行代码是您说的:“ActiveX创建的时候又新建MyDlg呢?”
etaonirs 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiangsheng 的回复:]
为什么MyDlg上放ActiveX,ActiveX创建的时候又新建MyDlg呢?这不是死循环了?你到底要几个MyDlg对象?
[/Quote]

不是你说的这样啊,我自建Active控件上有个IDD_FORMVIEW的对话框,它的上面需要一个WebBrowser控件,就是这么样一个需求,怎么能死循环呢
lsupper 2010-06-29
  • 打赏
  • 举报
回复
movewindow到对应的显示区域
蒋晟 2010-06-29
  • 打赏
  • 举报
回复
为什么MyDlg上放ActiveX,ActiveX创建的时候又新建MyDlg呢?这不是死循环了?你到底要几个MyDlg对象?
Eleven 2010-06-28
  • 打赏
  • 举报
回复
CString strURL =_T( "http://www.baidu.com");
COleVariant var(strURL);
m_Explorer.Navigate2(&var, NULL, NULL, NULL, NULL);
Eleven 2010-06-28
  • 打赏
  • 举报
回复
m_Explorer.Navigate(_T( "http://www.sina.com.cn"), NULL, NULL, NULL, NULL);
雪影 2010-06-28
  • 打赏
  • 举报
回复
需要初始化COM库的,你先初始化一下试一试再说

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧