c# 使用webbrower做界面

直接使用webbrower,会发现其对js支持不友善,会弹出一些警告框,然后停止运行js,导致页面无法渲染成功.

在此要自己封装一次webbrower,对于这些js警告进行静默化

需要添加引用 Microsoft Internet control

    public class MyWebBrowser : System.Windows.Forms.WebBrowser
    {
        private SHDocVw.IWebBrowser2 Iwb2;

        protected override void AttachInterfaces(object nativeActiveXObject)
        {
            Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject;
            Iwb2.Silent = true;
            base.AttachInterfaces(nativeActiveXObject);
        }

        protected override void DetachInterfaces()
        {
            Iwb2 = null;
            base.DetachInterfaces();
        }
    } 

这样webbrower就不会弹出js警告框,因为关闭了调试模式


通常情况下 win7装的ie是 ie9 ,但是默认情况下webbrow会使用ie7的兼容模式来渲染页面,所以需要在html页面添加,后来自己升级ie9到ie11,页面明显快多了

		<!-- 强制使用最新版ie内核渲染 -->
	 <meta http-equiv="X-UA-Compatible" content="IE=edge">


如果把winform窗口设置为无边框模式,那么想实现拖动html界面,窗口同样跟着移动,实现方式如下

首先自定义一个拖动控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MoveControns
{
    public partial class MoveContron : Component
    {
        public MoveContron()
        {
            InitializeComponent();
        }

        public MoveContron(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }
        public void MoveEvent()
        {
            if (WinApiMove)
            {
                dropForm.MouseDown += new MouseEventHandler(WinApiMoveEvent);
            }
            else
            {
                dropForm.MouseDown += new MouseEventHandler(MouseDownEvent);
                dropForm.MouseMove += new MouseEventHandler(MouseMoveEvent);
                dropForm.MouseUp += new MouseEventHandler(MouseUpEvent);
            }
        }
        #region 变量声明
        private bool isMouse = false; //记录是否按下
        private int mousedownleft = 0;
        private int mousedowntop = 0;
        private System.Windows.Forms.Form dropForm = null;
        private bool WinApiMove = true;
        /// <summary>
        /// 移动的样式,当不为真时候立即移动
        /// </summary>
        [Category("Alignment"), Description("移动的样式,当不为真时候立即移动")]
        public bool MoveBorder
        {
            set { WinApiMove = value; }
            get { return WinApiMove; }
        }
        /// <summary>
        /// 需要移动的窗体 
        /// </summary>
        [Category("Alignment"), Description("需要移动的窗体")]
        public System.Windows.Forms.Form form
        {
            set { dropForm = value; }
            get { return dropForm; }
        }
        #endregion

        #region win32 api 移动窗体
        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;

        public void WinApiMoveEvent()
        {
            ReleaseCapture();
            SendMessage(dropForm.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
        public void WinApiMoveEvent(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(dropForm.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
        #endregion
        public void MouseDownEvent()
        {
            isMouse = true;
            mousedownleft = GetMouseXY().X - dropForm.Left;
            mousedowntop = GetMouseXY().Y - dropForm.Top;
        }
       private void MouseDownEvent(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            isMouse = true;
            mousedownleft = GetMouseXY().X - dropForm.Left;
            mousedowntop = GetMouseXY().Y - dropForm.Top;
        }
       public void MoveStarEvent()
       {
           if (isMouse == false)
           {
               return;
           }
           dropForm.Left = GetMouseXY().X - mousedownleft;
           dropForm.Top = GetMouseXY().Y - mousedowntop;
       }
       private void MouseMoveEvent(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            MoveStarEvent();
        }
       public void MouseUpEvent()
       {
           if (isMouse == true)  //如果还是真
           {
               isMouse = false;
           }
       }
        private void MouseUpEvent(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (isMouse == true)  //如果还是真
            {
                isMouse = false;
            }
        }
        /// <summary>
        /// 获取鼠标坐标
        /// </summary>
        /// <returns></returns>
        public System.Drawing.Point GetMouseXY()
        {
            System.Drawing.Point xy = new System.Drawing.Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y);
            return xy;
        }
    }
}

编译后拖到窗口中,如图设置



然后在html添加

        <span οnmοusedοwn="window.external.winmove()" οnmοuseοver="this.style.cursor =  'move';"
            οnmοuseοut="this.style.cursor='default'">11111111</span>

同时在窗体添加

        public MianWindow()
        {
            InitializeComponent();
            this.webBrowser1.ObjectForScripting = this;
            this.moveContron1.MoveEvent();
        }
        public void winmove()
        {
            this.moveContron1.WinApiMoveEvent();
        }


就可以实现拖动html的元素实现c#窗口的移动


c#和js的交互 网上有很多方法,详见附件

最终实现的一个效果如图



研究到这里,我也基本上就放弃了,因为存在一个严重的bug,就是webrower和其他窗口控件层级的问题,因为需要引用其他的一些控件,这些是没法嵌入html界面的

除非这个应用不会引入其他控件.


附件下载

http://download.csdn.net/detail/sc6231565/9550523

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值