|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在实现ERP等高端的ASP应用时,用户需要提供核心的经营资料,需要ASP商有很高的信用度。楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。web|webbrowser控件正如VC++6.0的演示程序MFCIE所示,用使用程序导游创立一个具有Web导航才能的MFC使用可谓十拿九稳。本文在此基本上,进一步会商两个成绩:资本自包括的完成,高低文菜单和快速键的完整把持。
1、资本自包括及res协定
所谓的资本自包括,指的是在终极产物中HTML文档(包含相干资本如剧本、图片)成为实行文件的一部分,就象别的资本(如使用程序图标)一样,而不是以自力文件情势分发。
资本自包括不但使产物分发更加便利,并且在终极用户眼前埋没了更多的完成细节,具有必定的实际意义。
MFC类CHtmlView不但把WebBrowser控件的一切功效(如导航,用户接口设置等)从头收拾成为C++办法和MFC事务映照,还供应了很多“原创”的功效。个中之一即是从包括它的使用程序中读取Web页面的才能。完成这个义务的次要办法为CHtmlView::LoadFromResource(),其原型以下:
BOOLLoadFromResource(LPCTSTRlpszResource);//用字符串指定资本ID
BOOLLoadFromResource(UINTnRes);//用数字指定资本ID
LoadFromResource()依附于res://协定(IE在找不到URL指定的服务器时,所显现的毛病提醒页面即便用res协定引出。)res协定的URL和罕见的http或ftp协定所用URL格局分歧,它的完全语法为:
res://resource_file[/resource_type]/resource_id
个中resource_file为包括方针资本的实行文件名字。resource_type为资本范例,它大概用数字暗示,也大概用字符串暗示。当资本为定制或不间接撑持范例时用字符串指出资本范例(如GIF,JPEG等,可在.RC文件中界说);当资本为已知范例时该值常常用数字暗示(如位图为2,HTML为23)。已知资本范例的完全列表能够拜见winuser.h,它是一组RT_常量。
CHtmlView::LoadFromResource()老是假定方针资本地点的实行文件为以后模块。但在实践使用中,我们常常要把资本分类放在分歧文件中。为办理此成绩,能够界说一个派生类CHtmlViewEx掩盖此办法,只必要对原办法略作修正引进模块参数便可:
『清单1』
BOOLCHtmlViewEx::LoadFromResource(LPCTSTRlpszModule,LPCTSTRlpszResource)
{
CStringstrResourceURL;
strResourceURL.Format(_T("res://%s/%s"),lpszModule,lpszResource);
Navigate(strResourceURL,0,0,0);
returnTRUE;
}
2、高低文菜单和快速键把持
在实践使用中,为了不用户检察页面源文件或避免用户用快速键翻开以后页面的别的一个窗口,我们常常要对由WebBrowser控件供应的高低文菜单(在页面上按鼠标右键)或快速键(如Ctrl+N翻开新窗口)加以定制。
不管是WebBrowser控件仍是CHtmlView类都没有间接供应定制上述操纵的办法,因此必需经由过程完成IDocHostUIHandler接口来完成。在该接口中,能够完成高低文菜单和快速键把持的办法分离为ShowContextMenu()和TranslateAccelerator()。
因为利用MFC封装类CHtmlView比间接使用WebBrowser控件更加便利,因此能够思索把定制以后的接口撑持功效集成到MFC框架内。详细完成的基础思绪以下:
创立一个新的OLE客户站并在个中完成接口IDocUIHandler
在InitInstance()顶用一个新的办理类代替缺省设置以引进该客户站
基于以上思绪,我们能够从COleControlSite创立派生类CCustomWebBrowserSite,并在派生类中完成IDocHostUIHandler。COleControlSite在VC++的mfcsrcoccimpl.h中界说,用于封装控件客户站。新的客户站界说为:
『清单2』
classCCustomWebBrowserSite:publicCOleControlSite
{
public:
CCustomWebBrowserSite(COleControlContainer*pCnt):
COleControlSite(pCnt){}
protected:
DECLARE_INTERFACE_MAP();
BEGIN_INTERFACE_PART(DocHostUIHandler,IDocHostUIHandler)
STDMETHODIMPShowContextMenu(DWORD,POINT*,IUnknown*,IDispatch*);
STDMETHODIMPTranslateAccelerator(LPMSG,constGUID*,DWORD);
STDMETHODIMPGetHostInfo(DOCHOSTUIINFO);
STDMETHODIMPEnableModeless(BOOL);
STDMETHODIMPOnDocWindowActivate(BOOL);
STDMETHODIMPOnFrameWindowActivate(BOOL);
STDMETHODIMPResizeBorder(LPCRECT,IOleInPlaceUIWindow*,BOOL);
STDMETHODIMPGetOptionKeyPath(LPOLESTR*,DWORD);
STDMETHODIMPGetDropTarget(IDropTarget*,IDropTarget**);
STDMETHODIMPGetExternal(IDispatch**);
STDMETHODIMPTranslateUrl(DWORD,OLECHAR*,OLECHAR**);
STDMETHODIMPFilterDataObject(IDataObject*,IDataObject**);
STDMETHODIMPShowUI(DWORD,IOleInPlaceActiveObject*,
IOleCommandTarget*,IOleInPlaceFrame*,IOleInPlaceUIWindow*);
STDMETHODIMPHideUI(void);
STDMETHODIMPUpdateUI(void);
END_INTERFACE_PART(DocHostUIHandler)
};
如上所先容,在这个接口中我们感乐趣的办法次要有ShowContextMenu()和TranslateAccelerator()两个。以完整克制高低文菜单显现为例,在派生类CCustomWebBrowserSite中ShowContextMenu()的完成代码为:
『清单3』
STDMETHODIMPCCustomWebBrowserSite::XDocHostUIHandler::ShowContextMenu(
DWORD,POINT*,IUnknown*,IDispatch*)
{
METHOD_PROLOGUE(CCustomWebBrowserSite,DocHostUIHandler)
returnS_OK;//克制菜单显现
}
用相似的办法能够封闭由控件间接呼应的快速键:
『清单4』
STDMETHODIMPCustomWebBrowserSite::XDocHostUIHandler::TranslateAccelerator(LPMSGlpMsg,constGUID__RPC_FAR*pguidCmdGroup,DWORDnCmdID)
{
METHOD_PROLOGUE(CCustomWebBrowserSite,DocHostUIHandler)
returnS_OK;//封闭快速键
}
在IDocHostUIHandler接话柄现以后,我们还必要一个办理类CCustomOccManager来撑持CCustomWebBrowserSite,新的办理类CCustomOccManager从COccManager派生,COccManager也在mfcsrcoccimpl.h中界说:
『清单5』
classCCustomOccManager:publicCOccManager
{
public:
CCustomOccManager(){}
COleControlSite*CreateSite(COleControlContainer*pCC)
</p>无法实现跨操作系统的应用。当然这也是微软的理由之一,只有这样才能发挥ASP最佳的能力。可是我却认为正是Windows限制了ASP,ASP的概念本就是为一个能让系统运行于一个大的多样化环境而设计的; |
|