VC编程之使用vc+如何自定义菜单1
小标 2019-01-15 来源 : 阅读 1371 评论 0

摘要:本文主要向大家介绍了VC编程之使用vc+如何自定义菜单1,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之使用vc+如何自定义菜单1,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之使用vc+如何自定义菜单1

你想在程序中,播放背景音乐吗?
你想在程序中,播放广告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频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程