摘要:本文主要向大家介绍了VC编程之使用vc+如何自定义菜单1,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
本文主要向大家介绍了VC编程之使用vc+如何自定义菜单1,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
你想在程序中,播放背景音乐吗?
你想在程序中,播放广告FLASH吗?
你想在程序中,显示WORD文件吗?
你想在程序中,显示PDF文件吗?
你想在程序中,显示图象文件吗?
你想在程序中,实现自动排版打印吗?
你想在程序中,实现美观的用户输入界面吗?
你想在程序中,简单实现以上功能的模板吗?
你想......只要在IE中能实现的功能,就能应用在自己的软件中。好了,Let'start......
一、首先,需要在你的程序中嵌入IE浏览器的窗口。有两种实现方法,其一,添加CHtmlView的视类;其二,添加IE浏览器的ActiveX控件。其实不管用什么方法,除了函数名称稍有区别外,它们最终都调用了微软的IWebBrowser2的接口。IWebBrowser2的功能非常强劲,使用它的技术叫DHTML(动态HTML,以后再给大家介绍)。在这篇文章中,先给大家举例介绍一些初级的使用,起到抛砖引玉的作用。更多功能可以参考MSDN。 例子程序是在对话窗中嵌入IE ActiveX为演示基础,使用CHtmlView可参照修改。VC6下编译运行通过。 二、方法和步骤: 1. 建立一个对话窗形式的MFC应用程序,注意在导航的第2页上,一定要选择ActiveX Controls。这也是默认的选择。 2. 向工程中添加 Microsoft Web 浏览器的ActiveX控件。 执行菜单 Project\Add To Project\Components And Controls... 选择Registered ActiveX Controls目录,找到Microsoft Web 浏览器,并Insert。这样MFC会给你产生一个IWebBrowser2的包装类CWebBrowser2。 3. 在对话窗资源编辑器中,把工具条上的IE控件放到你的对话窗中。启动ClassWizard,映射这个IE控件为CWebBrowser2的一个对象(在演示程序中的对象名称是m_ie) 三、演示程序中一些需要说明介绍的知识:(更多更详细的使用信息,请参考CHtmlView,IWebBrowser2的MSDN说明) 1. 显示浏览一个HTML文件(或ActiveX文档类型的文件,如Word,PDF等),请使用Navigate()/Navigate2()函数 2. 关于背景音乐、图象文件、FLASH等显示,其实是按照HTML的语法标记,直接写在HTML文件中的。 3. 打印功能,需要调用ExecWB()函数。这个函数的功能非常多,根据参数命令(OLECMDID),能够实现诸如打印、保存、剪贴版等30多个功能。 4. IE控件有一个非常重要的事件(当打开HTML的连接之前)。重载虚函数OnBeforeNavigate2()后,可以实现连接重定向;提取HTML中用户输入的表单数据等功能。在演示程序中,也给大家展示了如何取得数据,及安全数组的用法。 5. 演示程序中,为了突出重点。HTML模版文件都非常基本和简单。如果你有深厚的HTML知识的功底,那就尽情发挥吧。 VC中使用IE控件
由于本人在开发中经常要在程序中嵌入浏览器,为了符合自己的需求经常要对浏览器进行扩展和定制, 解决这些问题需在网上找资料和学习的过程,我想可能很多开发者或许会遇到同样的问题,特写此文,以供大家参考。
在MFC中使用浏览器
在MFC中微软为我们提供了CHtmlView、CDHtmlDialog类让我们的程序很方便的嵌入浏览器和进行浏览器的二次开发,这比直 接使用WebBrowser控件要方便很多,所以本文中讨论的浏览器的问题都是针对CHtmlView来讨论的。文中将提到一个类CLhpHtmlView, 它是CHtmlView的派生类,文中提及的扩展或定制都将在CLhpHtmlView类(或派生类)上实现。
怎样扩展或定制浏览器
浏览器定义了一些扩展接口(如IDocHostUIHandler可以定制浏览器界面有关的行为),以便开发者进行定制和扩展。浏览 器会在需要的时候向他的控制站点查询这些接口,在控制站点里实现相应的接口就可以进行相应的扩展。在MFC7.01类 库中,CHtmlView使用的控制站点是CHtmlControlSite的,在CHtmlControlSite类中 只实现了接口IDocHostUIHandler, 而要实现更多的扩展接口,必须用自定义的控制站类来取代CHtmlControlSite,在下文中提及的类CDocHostSite即为自定义 的控制站类。 如何使自定义的控制站点来替换默认的控制站点呢?在MFC7.0中只需重载CHtmlView的虚函数CreateControlSite即可:
BOOL CLhpHtmlView::CreateControlSite(COleControlContainer * pContainer, COleControlSite ** ppSite, UINT /nID/, REFCLSID /clsid/) { *ppSite = new CDocHostSite(pContainer, this);// 创建自己的控制站点实例 return (*ppSite) ? TRUE : FALSE; } VC6.0要替换控制站要复杂的多,这里就不讨论了,如需要6.0版本的请给我发邮件到yourshine@21cn.com。
定制鼠标右键弹出出菜单
要定制浏览器的鼠标右键弹出菜单,必须在自定义的控制站点类中实现IDocHostUIHandler2接口,并且IE的 版本是5.5或以上。在接口IDocHostUIHandler2的ShowContextMenu方法中调用浏览器类的OnShowContextMenu虚函数,我们 在浏览器类的派生类重载此虚函数即可实现右键菜单的定制,参见代码 HRESULT CDocHostSite::XDocHostUIHandler::ShowContextMenu(DWORD dwID, POINT * ppt, IUnknown * pcmdtReserved, IDispatch * pdispReserved) { METHOD_PROLOGUE(CDocHostSite, DocHostUIHandler); return pThis->m_pView->OnShowContextMenu( dwID, ppt, pcmdtReserved,pdispReserved ); }
HRESULT CLhpHtmlView::OnShowContextMenu(DWORD dwID, LPPOINT ppt, LPUNKNOWN pcmdtReserved, LPDISPATCH pdispReserved) { HRESULT result = S_FALSE;
switch(m_ContextMenuMode)
{case NoContextMenu: // 无菜单
result=S_OK;
break;case DefaultMenu: // 默认菜单
break;case TextSelectionOnly: // 仅文本选择菜单
if(!(dwID == CONTEXT_MENU_TEXTSELECT || dwID == CONTEXT_MENU_CONTROL))
result=S_OK;
break;case CustomMenu: // 自定义菜单
if(dwID!=CONTEXT_MENU_TEXTSELECT)
result=OnShowCustomContextMenu(ppt,pcmdtReserved,pdispReserved);
break;
}
return result;
}
在CLhpHtmlView中定义的枚举类型CONTEXT_MENU_MODE举出了定制右键弹出菜单的四种类型 enum CONTEXT_MENU_MODE // 上下文菜单 { NoContextMenu, // 无菜单 DefaultMenu, // 默认菜单 TextSelectionOnly, // 仅文本选择菜单 CustomMenu // 自定义菜单 }; 通过CLhpHtmlView的函数SetContextMenuMode来设置右键菜单的类型。如果设定的右键弹出菜单是“自定义菜单”类型, 我们只要在CLhpHtmlView的派生类中重载OnShowCustomContextMenu虚函数即可,如下代码 CDemoView是CLhpHtmlView的派生类 HRESULT CDemoView::OnShowCustomContextMenu(LPPOINT ppt, LPUNKNOWN pcmdtReserved,LPDISPATCH pdispReserved) { if ((ppt==NULL)||(pcmdtReserved==NULL)||(pcmdtReserved==NULL)) return S_OK;
HRESULT hr=0;
IOleWindow *oleWnd=NULL;
hr=pcmdtReserved->QueryInterface(IID_IOleWindow, (void**)&oleWnd);if((hr != S_OK)||(oleWnd == NULL))
return S_OK;
HWND hwnd=NULL;
hr=oleWnd->GetWindow(&hwnd);if((hr!=S_OK)||(hwnd==NULL))
{
oleWnd->Release();
return S_OK;
}
IHTMLElementPtr pElem=NULL;
hr = pdispReserved->QueryInterface(IID_IHTMLElement, (void**)&pElem);if(hr != S_OK)
{
oleWnd->Release();
return S_OK;
}
IHTMLElementPtr pParentElem=NULL;
_bstr_t tagID;
BOOL go=TRUE;
pElem->get_id(&tagID.GetBSTR());
while(go && tagID.length()==0)
{
hr=pElem->get_parentElement(&pParentElem);
if(hr==S_OK && pParentElem!=NULL)
{
pElem->Release();
pElem=pParentElem;
pElem->get_id(&tagID.GetBSTR());
}
else
go=FALSE;
};if(tagID.length()==0)
tagID="no id";
CMenu Menu,SubMenu;
Menu.CreatePopupMenu();
CString strTagID = ToStr(tagID);
if(strTagID == "red")
Menu.AppendMenu(MF_BYPOSITION, ID_RED, "您点击的是红色");else if(strTagID == "green")
Menu.AppendMenu(MF_BYPOSITION, ID_GREEN, "您点击的是绿色");else if(strTagID == "blue")
Menu.AppendMenu(MF_BYPOSITION, ID_BLUE, "您点击的是蓝色");else
Menu.AppendMenu(MF_BYPOSITION, ID_NONE, "你点了也白点,请在指定的地方点击");
int MenuID=Menu.TrackPopupMenu(TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON,ppt->x, ppt->y, this);switch(MenuID)
{case ID_RED:
MessageBox("红色");
break;case ID_GREEN:
MessageBox("红色");
break;case ID_BLUE:
MessageBox("红色");
break;case ID_NONE:
MessageBox("haha");
break;
}
oleWnd->Release();
pElem->Release();
return S_OK;
}
以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号