WinFormWebBrowser资料

上传人:沈*** 文档编号:155556090 上传时间:2022-09-23 格式:DOC 页数:51 大小:275.50KB
收藏 版权申诉 举报 下载
WinFormWebBrowser资料_第1页
第1页 / 共51页
WinFormWebBrowser资料_第2页
第2页 / 共51页
WinFormWebBrowser资料_第3页
第3页 / 共51页
资源描述:

《WinFormWebBrowser资料》由会员分享,可在线阅读,更多相关《WinFormWebBrowser资料(51页珍藏版)》请在装配图网上搜索。

1、C# WinForm WebBrowser (一) MSDN资料 1、主要用途:使用户可以在窗体中导航网页。2、注意:WebBrowser控件会占用大量资源。使用完该控件后一定要调用Dispose方法,以便确保及时释放所有资源。必须在附加事件的同一线程上调用Dispose方法,该线程应始终是消息或用户界面 (UI) 线程。3、WebBrowser使用下面的成员可以将控件导航到特定 URL、在导航历史记录列表中向后和向前移动,还可以加载当前用户的主页和搜索页:1.URL属性:可读、可写,用于获取或设置当前文档的 URL。WebBrowser控件维护浏览会话期间访问的所有网页的历史记录列表。设置U

2、rl属性时,WebBrowser控件导航到指定的 URL 并将该 URL 添加到历史记录列表的末尾。WebBrowser控件在本地硬盘的缓存中存储最近访问过的站点的网页。每个页面都可以指定一个到期日期,指示页面在缓存中保留的时间。当控件定位到某页时,如果该页具有缓存的版本,则直接显示缓存中的内容而不必重新下载该页,从而节省了时间。使用Refresh方法强制WebBrowser控件通过下载来重新加载当前页,从而确保控件显示最新版本。注意:即使已请求了另一个文档,该属性也包含当前文档的 URL。如果设置该属性的值,然后立即再次检索该值,要是WebBrowser控件尚未来得及加载新文档,则检索到的值

3、可能与设置的值不同。2.Navigate方法:将指定位置的文档加载到WebBrowser控件中。3.GoBack方法:如果导航历史记录中的上一页可用,则将WebBrowser控件导航到该页。如果导航成功,则返回true;如果导航历史记录中的上一页不可用,则返回false。WebBrowser控件维护浏览会话期间访问的所有网页的历史记录列表。可以使用GoForward方法实现一个“后退”按钮。使用CanGoBack属性确定导航历史记录是否可用以及是否包含上一页。处理CanGoBackChanged事件,在CanGoBack属性值更改时接收通知。4.GoForward方法:如果导航历史记录中的下一

4、页可用,则将WebBrowser控件导航到该页。如果导航成功,则返回true;如果导航历史记录中的下一页不可用,则返回false。WebBrowser控件维护浏览会话期间访问的所有网页的历史记录列表。可以使用GoForward方法实现一个“前进”按钮.使用CanGoForward属性确定导航历史记录是否可用以及是否包含当前页之后的页。处理CanGoForwardChanged事件,在CanGoForward属性值更改时接收通知5.GoHome方法:将WebBrowser控件导航到当前用户的主页。6.GoSearch方法:将WebBrowser控件导航到当前用户的默认搜索页。默认搜索页存储在注册

5、表的HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainSearch Page注册表项下。若要使用其他搜索页而不是默认搜索页,请调用Navigate方法或指定Url属性。7.Refresh方法:重新加载当前显示在WebBrowser控件中的文档。8.Stop方法:取消所有挂起的导航并停止所有动态页元素(如背景声音和动画)。如果导航不成功,则显示一页指示出现的问题。使用这些成员中的任何一个进行导航都会导致在导航的不同阶段发生Navigating、Navigated和DocumentCompleted事件。4、ObjectForScript

6、ing 属性:获取或设置一个对象,该对象可由显示在WebBrowser控件中的网页所包含的脚本代码访问。使用该属性启用WebBrowser控件承载的网页与包含WebBrowser控件的应用程序之间的通信。使用该属性可以将动态 HTML (DHTML) 代码与客户端应用程序代码集成在一起。为该属性指定的对象可作为window.external对象(用于主机访问的内置 DOM 对象)用于网页脚本。可以将此属性设置为希望其公共属性和方法可用于脚本代码的任何 COM 可见的对象。可以通过使用ComVisibleAttribute对类进行标记使其成为 COM 可见的类。若要从客户端应用程序代码调用网页中

7、定义的函数,请使用可从Document属性检索的HtmlDocument对象的HtmlDocument.InvokeScript方法。5、AllowNavigation属性:获取或设置一个值,该值指示控件在加载其初始页之后是否可以导航到其他页。6、AllowWebBrowserDrop属性:获取或设置一个值,该值指示WebBrowser控件是否导航到拖放到它上面的文档。7、WebBrowserShortcutsEnabled属性:是否启用WebBrowser自带的快捷键。8、ScriptErrorsSuppressed 属性:获取或设置一个值,该值指示出现脚本错误时,WebBrowser控件是

8、否显示错误对话框。9、IsWebBrowserContextMenuEnabled属性:是否启用右键菜单。源:MSDNC#WinForm WebBrowser (二) 实用方法总结 实用方法1:获取状态栏信息void webBrowser1_StatusTextChanged(object sender, EventArgs e) label1.Text = webBrowser1.StatusText;实用方法2:页面跳转后改变地址栏地址/在Navigated事件处理函数中改变地址栏地址是最恰当的:private void webBrowser1_Navigated(object sende

9、r, WebBrowserNavigatedEventArgs e) textBox1.Text = webBrowser1.Url.ToString();实用方法3:设置单选框/建议使用执行单击事件的方式来设置单选框,而不是修改属性:webBrowser1.Document.GetElementById(RBT_A).InvokeMember(click);实用方法4:设置联动型下拉列表/比较常见的联动型多级下拉列表就是省/市县选择了,这种情况下直接设置选择项的属性不会触发联动,需要在最后执行触发事件函数才能正常工作:foreach (HtmlElement f in s.GetElemen

10、tsByTagName(option) if (f.InnerText = 北京) f.SetAttribute(selected, selected); else f.SetAttribute(selected, ); s.RaiseEvent(onchange);以上四种方法转于:实用方法一:在WinForm中相应Web事件假设HTML源代码如下: HtmlDocument htmlDoc = webBrowser.Document; HtmlElement btnElement = htmlDoc.AllbtnClose; if (btnElement != null) btnEleme

11、nt.click += new HtmlElementEventHandler(HtmlBtnClose_Click); /很简单吧?那么稍稍高级一点的我们都知道一个HTML元素可能有很多各种各样的事件,而HtmlElement这个类只给出最常用、共通的几个。那么,如何响应其他事件呢?这也很简单,只需要调用HtmlElement的AttachEventHandler就可以了:btnElement.AttachEventHandler(onclick,newEventHandler(HtmlBtnClose_Click);/这一句等价于上面的btnElement.click+=newHtmlEl

12、ementEventHandler(HtmlBtnClose_Click);对于其他事件,把onclick换成该事件的名字就可以了。例如:formElement.AttachEventHandler(onsubmit, new EventHandler(HtmlForm_Submit); 实用方法二:模拟表单自动填写和提交假设有一个最简单的登录页面,输入用户名密码,点“登录”按钮即可登录。已知用户名输入框的id(或Name,下同)是username,密码输入框的id是password,“登录”按钮的id是submitbutton,那么我们只需要在webBrowser的DocumentCompl

13、eted事件中使用下面的代码即可:HtmlElement btnSubmit = webBrowser.Document.Allsubmitbutton; HtmlElement tbUserid = webBrowser.Document.Allusername; HtmlElement tbPasswd = webBrowser.Document.Allpassword; if (tbUserid = null | tbPasswd = null | btnSubmit = null) return; tbUserid.SetAttribute(value, smalldust); tbP

14、asswd.SetAttribute(value, 12345678); btnSubmit.InvokeMember(click);关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的submit方法:HtmlElement formLogin = webBrowser.Document.FormsloginForm; / formLogin.InvokeMember(submit); 本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的submit方法,这

15、些验证代码就得不到执行,有可能会引起错误。实用方法三:调用脚本首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript:function DoAdd(a, b) return a + b;那么,我们要在WinForm调用它,只需如下代码即可:object oSum = webBrowser.Document.InvokeScript(DoAdd, new object 1, 2 );int sum = Convert.ToInt32(oSum);其次,如果我们想执行一段Web页面中原本没有的脚本,该怎么做呢?这次.Net的类没有提供,看来还要依靠COM了。IHTM

16、LWindow2可以将任意的字符串作为脚本代码来执行。string scriptline01 = function ShowPageInfo() ;string scriptline02 = var numLinks = document.links.length; ;string scriptline03 = var numForms = document.forms.length; ;string scriptline04 = var numImages = document.images.length; ;string scriptline05 = var numScripts = do

17、cument.scripts.length; ;string scriptline06 = alert(网页的统计结果:rn链接数: + numLinks + ;string scriptline07 = rn表单数: + numForms + ;string scriptline08 = rn图像数: + numImages + ;string scriptline09 = rn脚本数: + numScripts);string scriptline10 = ShowPageInfo();string strScript = scriptline01 + scriptline02 + scr

18、iptline03 + scriptline04 + scriptline05 + scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;win.execScript(strScript, Javascript); 以上三种实用方法转于:最后:在脚本中调用WinForm里的代码,这个可能吗? 呵呵,当然是可能的。下面的代码示例演示如何使用ObjectForScrip

19、ting属性。在该示例中,ObjectForScripting属性被设置为当前窗体。view sourceprint?using System; using System.Windows.Forms; using System.Security.Permissions; PermissionSet(SecurityAction.Demand, Name=FullTrust) System.Runtime.InteropServices.ComVisibleAttribute(true) public class Form1 : Form private WebBrowser webBrowse

20、r1 = new WebBrowser(); private Button button1 = new Button(); STAThread public static void Main() Application.EnableVisualStyles(); Application.Run(new Form1(); public Form1() button1.Text = call script code from client code; button1.Dock = DockStyle.Top; button1.Click += new EventHandler(button1_Cl

21、ick); webBrowser1.Dock = DockStyle.Fill; Controls.Add(webBrowser1); Controls.Add(button1); Load += new EventHandler(Form1_Load); private void Form1_Load(object sender, EventArgs e) webBrowser1.AllowWebBrowserDrop = false; webBrowser1.IsWebBrowserContextMenuEnabled = false; webBrowser1.WebBrowserShor

22、tcutsEnabled = false; webBrowser1.ObjectForScripting = this; / Uncomment the following line when you are finished debugging. /webBrowser1.ScriptErrorsSuppressed = true; webBrowser1.DocumentText = + function test(message) alert(message); + + call client code from script code + ; public void Test(Stri

23、ng message) MessageBox.Show(message, client code); private void button1_Click(object sender, EventArgs e) webBrowser1.Document.InvokeScript(test, new String called from client code ); /该代码实例源于:MSDNC# WinForm WebBrowser (三) 编辑模式 一、启用编辑模式、 浏览模式 及 自动换行 / / 编辑模式 / public void EditMode() if (this.webBrow

24、ser.Document != null) mshtml.IHTMLDocument2 doc = this.webBrowser.Document.DomDocument as mshtml.IHTMLDocument2; if (doc != null) doc.designMode = on; / / 启用浏览模式 / public void BrowseMode() if (this.webBrowser.Document != null) mshtml.IHTMLDocument2 doc = this.webBrowser.Document.DomDocument as mshtm

25、l.IHTMLDocument2; if (doc != null) doc.designMode = off; / / 设置自动换行 / / public void SetAutoWrap(bool value) mshtml.HTMLDocument doc = this.webBrowser.Document.DomDocument as mshtml.HTMLDocument; if (doc != null) mshtml.HTMLBody body = doc.body as mshtml.HTMLBody; if (body != null) body.noWrap = !val

26、ue; 在编辑模式下,可以使用: this.webBrowser.Document.ExecCommand(string,bool,object);方法来操作WebBrowser中的HTML。其中第一个字符串类型的参数为:要执行的命令的名称。第二个布尔类型的参数为:是否向用户显示命令特定的对话框或消息框。第三个Object类型的参数为:要使用该命令分配的值。并非适用于所有命令。常见的命令有: private const string HTML_COMMAND_BOLD = Bold; /加粗 private const string HTML_COMMAND_UNDERLINE = Under

27、line; /下划线 private const string HTML_COMMAND_ITALIC = Italic; /斜体 private const string HTML_COMMAND_SUBSCRIPT = Subscript; /下标 private const string HTML_COMMAND_SUPERSCRIPT = Superscript; /上标 private const string HTML_COMMAND_STRIKE_THROUGH = StrikeThrough; /删除线 private const string HTML_COMMAND_FON

28、T_NAME = FontName; /字体 private const string HTML_COMMAND_FONT_SIZE = FontSize; /字号 private const string HTML_COMMAND_FORE_COLOR = ForeColor; /字体前景色 private const string HTML_COMMAND_BACK_COLOR = BackColor; /字体背景色 private const string HTML_COMMAND_INSERT_FORMAT_BLOCK = FormatBlock; /加粗 private const

29、string HTML_COMMAND_REMOVE_FORMAT = RemoveFormat; /清楚样式 private const string HTML_COMMAND_JUSTIFY_LEFT = JustifyLeft; /文本左对齐 private const string HTML_COMMAND_JUSTIFY_CENTER = JustifyCenter; /文本中间对齐 private const string HTML_COMMAND_JUSTIFY_RIGHT = JustifyRight; /文本右对齐 private const string HTML_COMM

30、AND_JUSTIFY_FULL = JustifyFull; /文本两端对齐 private const string HTML_COMMAND_INDENT = Indent; /增大缩进量 private const string HTML_COMMAND_OUTDENT = Outdent; /减小缩进量 private const string HTML_COMMAND_INSERT_LINE = InsertHorizontalRule;/插入分割符 private const string HTML_COMMAND_INSERT_LIST = Insert0List; / rep

31、lace with (Un)Ordered 插入项目符号或项目编号 private const string HTML_COMMAND_INSERT_IMAGE = InsertImage; /插入图像 private const string HTML_COMMAND_INSERT_LINK = CreateLink; /插入链接 private const string HTML_COMMAND_REMOVE_LINK = Unlink; /移除链接 private const string HTML_COMMAND_TEXT_CUT = Cut; /剪切 private const st

32、ring HTML_COMMAND_TEXT_COPY = Copy; /复制 private const string HTML_COMMAND_TEXT_PASTE = Paste; /粘贴 private const string HTML_COMMAND_TEXT_DELETE = Delete; /删除 private const string HTML_COMMAND_TEXT_UNDO = Undo; /撤销 private const string HTML_COMMAND_TEXT_REDO = Redo; /恢复 private const string HTML_COMM

33、AND_TEXT_SELECT_ALL = SelectAll; /全选 private const string HTML_COMMAND_TEXT_UNSELECT = Unselect; /取消选择 private const string HTML_COMMAND_TEXT_PRINT = Print; / 打印 private const string HTML_COMMAND_EDITMODE = EditMode; / 编辑模式 private const string HTML_COMMAND_BROWSEMODE = BrowseMode; / 浏览模式 private co

34、nst string HTML_COMMAND_OVERWRITE = OverWrite; /转换插入、覆写模式/ 更多的命令请参见:C# WinForm WebBrowser (四) 自定义操作【转】 由于本人在开发中经常要在程序中嵌入浏览器,为了符合自己的需求经常要对浏览器进行扩展和定制, 解决这些问题需在网上找资料和学习的过程,我想可能很多开发者或许会遇到同样的问题,特写此文,以供大家参考。在MFC中使用浏览器在MFC中微软为我们提供了CHtmlView、CDHtmlDialog类让我们的程序很方便的嵌入浏览器和进行浏览器的二次开发,这比直 接使用WebBrowser控件要方便很多,所

35、以本文中讨论的浏览器的问题都是针对CHtmlView来讨论的。文中将提到一个类CLhpHtmlView, 它是CHtmlView的派生类,文中提及的扩展或定制都将在CLhpHtmlView类(或派生类)上实现。怎样扩展或定制浏览器浏览器定义了一些扩展接口(如IDocHostUIHandler可以定制浏览器界面有关的行为),以便开发者进行定制和扩展。浏览 器会在需要的时候向他的控制站点查询这些接口,在控制站点里实现相应的接口就可以进行相应的扩展。在MFC7.01类 库中,CHtmlView使用的控制站点是CHtmlControlSite的,在CHtmlControlSite类中 只实现了接口ID

36、ocHostUIHandler, 而要实现更多的扩展接口,必须用自定义的控制站类来取代CHtmlControlSite,在下文中提及的类CDocHostSite即为自定义 的控制站类。关于接口的介绍请参考: 如何使自定义的控制站点来替换默认的控制站点呢?在MFC7.0中只需重载CHtmlView的虚函数CreateControlSite即可:BOOL CLhpHtmlView:CreateControlSite(COleControlContainer * pContainer, COleControlSite * ppSite, UINT /*nID*/, REFCLSID /*clsid*

37、/)*ppSite = new CDocHostSite(pContainer, this);/ 创建自己的控制站点实例return (*ppSite) ? TRUE : FALSE;VC6.0要替换控制站要复杂的多,这里就不讨论了,如需要6.0版本的请给我发邮件到yourshine。定制鼠标右键弹出出菜单要定制浏览器的鼠标右键弹出菜单,必须在自定义的控制站点类中实现IDocHostUIHandler2接口,并且IE的 版本是5.5或以上。在接口IDocHostUIHandler2的ShowContextMenu方法中调用浏览器类的OnShowContextMenu虚函数,我们 在浏览器类的派

38、生类重载此虚函数即可实现右键菜单的定制,参见代码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 CLhpHtm

39、lView: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 = CON

40、TEXT_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,/ 默认菜单Text

41、SelectionOnly,/ 仅文本选择菜单CustomMenu/ 自定义菜单;通过CLhpHtmlView的函数SetContextMenuMode来设置右键菜单的类型。如果设定的右键弹出菜单是“自定义菜单”类型, 我们只要在CLhpHtmlView的派生类中重载OnShowCustomContextMenu虚函数即可,如下代码 CDemoView是CLhpHtmlView的派生类 HRESULT CDemoView:OnShowCustomContextMenu(LPPOINT ppt, LPUNKNOWN pcmdtReserved,LPDISPATCH pdispReserved)i

42、f (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

43、S_OK;IHTMLElementPtrpElem=NULL;hr = pdispReserved-QueryInterface(IID_IHTMLElement, (void*)&pElem);if(hr != S_OK)oleWnd-Release();return S_OK;IHTMLElementPtrpParentElem=NULL;_bstr_ttagID;BOOL go=TRUE;pElem-get_id(&tagID.GetBSTR();while(go & tagID.length()=0)hr=pElem-get_parentElement(&pParentElem);if

44、(hr=S_OK & pParentElem!=NULL)pElem-Release();pElem=pParentElem;pElem-get_id(&tagID.GetBSTR();elsego=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 = gre

45、en)Menu.AppendMenu(MF_BYPOSITION, ID_GREEN, 您点击的是绿色);else if(strTagID = blue)Menu.AppendMenu(MF_BYPOSITION, ID_BLUE, 您点击的是蓝色);elseMenu.AppendMenu(MF_BYPOSITION, ID_NONE, 你点了也白点,请在指定的地方点击);int MenuID=Menu.TrackPopupMenu(TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON,ppt-x, ppt-y, this);switch(MenuID)cas

46、e 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;实现脚本扩展(很重要的external接口)在你嵌入了浏览器的工程中,如果网页的脚本中能调用C+代码,那将是一件很惬意的事情,要实现这种交互,就必须实现脚本扩展。实现脚本扩展就是在程序中实现一个IDispatch接口,通过CHtmlView

47、类的OnGetExternal虚函数返回此接口指针,这样就可以在脚本中通过window.external.XXX(关键字window可以省略)来 引用接口暴露的方法或属性(XXX为方法或属性名)。在MFC中从CCmdTarget派生的类都可以实现自动化,而不必在MFC工程中引入繁杂的ATL。从CCmdTarget派生的类实现自动化接口的时候不要忘了在构造函数中调用EnableAutomation函数。要使虚函数OnGetExternal发挥作用必须在 自定义的控制站点类中实现IDocHostUIHandler,在接口IDocHostUIHandler的GetExternal方法中调用浏览器类的

48、OnGetExternal虚函数,我们在浏览器类的派生类重载OnGetExternal虚函数, 通过参数lppDispatch返回一个IDispatch指针,这样脚本中引用window.external时就是引用的返回的接口,参见代码 HRESULT CDocHostSite:XDocHostUIHandler:GetExternal(IDispatch * ppDispatch)METHOD_PROLOGUE(CDocHostSite, DocHostUIHandler);return pThis-m_pView-OnGetExternal( ppDispatch );CLhpHtmlVie

49、w:CLhpHtmlView(BOOL isview).EnableAutomation();/ 允许自动化HRESULT CLhpHtmlView:OnGetExternal(LPDISPATCH *lppDispatch)*lppDispatch = GetIDispatch(TRUE);/ 返回自身的IDispatch接口return S_OK; 请注意上面代码中,在OnGetExternal返回的是自身IDispatch接口, 这样就不比为脚本扩展而另外写一个从CCmdTarget派生的新类, CLhpHtmlView本身就是从CCmdTarget派生,直接在上面实现接口就是。下用具体

50、示例来说明怎样实现脚本扩展示例会在网页上点击一个按钮而使整个窗口发生抖动从CLhpHtmlView派生一个类CDemoView,在类中实现IDispatch, 并通过IDispatch暴露方法WobbleWnd -文件 DemoView.h-.class CDemoView : public CLhpHtmlView.DECLARE_DISPATCH_MAP() / 构建dispatch映射表以暴露方法或属性.void WobbleWnd();/ 抖动窗口;-文件 DemoView.cpp-./ 把成员函数映射到Dispatch映射表中,暴露方法给脚本BEGIN_DISPATCH_MAP(CDemoView, CLhpHtmlView)DISP_FUNCTION(CDemoView, WobbleWnd, WobbleWnd, VT_EMPTY, VTS_NONE)END_DISPATCH_MAP().void CDemoView:WobbleWnd()/ 在这里实现抖动窗口.-

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!