DirectUI技术开发界面的好奇 今天想到 怎么不让winform也那样了,使用html 做 ui ,大家都知道 使用div +css布局是一件非常容易的事情;
光说不练是假打,所以花了一个把小时尝试把winform的界面做成 webui
一:
大家都知道 winform 中有个控件叫 webBrowser 如果你不知道具体怎么用 详细看msdn 都知道了; 这里的它就是主角;
准备:
现在 我们新建一个winform项目 在上面放一个webBrowser 名称默认 停靠父窗口 在新建一个html 网页 名称 html.htm
#region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.moveContron1 = new MoveControns.MoveContron(this.components); this.webBrowser1 = new System.Windows.Forms.WebBrowser(); this.SuspendLayout(); // // moveContron1 // this.moveContron1.form = this; this.moveContron1.MoveBorder = true; // // webBrowser1 // this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; this.webBrowser1.IsWebBrowserContextMenuEnabled = false; this.webBrowser1.Location = new System.Drawing.Point(2, 2); this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20); this.webBrowser1.Name = "webBrowser1"; this.webBrowser1.ScrollBarsEnabled = false; this.webBrowser1.Size = new System.Drawing.Size(375, 258); this.webBrowser1.TabIndex = 1; this.webBrowser1.Url = new System.Uri("file:///E:/visual%20studio/WebUi/WebUi/HTML.htm", System.UriKind.Absolute); this.webBrowser1.WebBrowserShortcutsEnabled = false; // // MianWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.SystemColors.ActiveCaptionText; this.ClientSize = new System.Drawing.Size(379, 262); this.Controls.Add(this.webBrowser1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "MianWindow"; this.Opacity = 0.9D; this.Padding = new System.Windows.Forms.Padding(2); this.Text = "Form_Test"; this.Paint += new System.Windows.Forms.PaintEventHandler(this.MianWindow_Paint); this.ResumeLayout(false); } #endregion private MoveControns.MoveContron moveContron1; private System.Windows.Forms.WebBrowser webBrowser1;
html的内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title></title> </head> <body style="background-color: Silver; 100%; height: 100%; margin: 0; padding: 0"> <div> <span onmousedown="window.external.WinApiMoveEvent()" onmouseover="this.style.cursor = 'move';" onmouseout="this.style.cursor='default'">11111111</span> <span style="float: right"> <input id="Button2" type="button" value="最大化" onclick="max()" /> <input id="Button3" type="button" value="CloseMe" onclick="closewin()" /></span> </div> <table border="1" cellspacing="0" cellpadding="0" width="100%" height="100%"> <tr> <td align="right"> </td> </tr> <tr> <td> </td> </tr> <tr> <td> </td> </tr> </table> </body> </html> <script type="text/javascript"> // 给Winform调用的方法 function ShowAlert(msg) { alert(msg); } function closewin() { window.external.CloseMe() } function max() { var val = document.getElementById('Button2').value; if (val = '最大化') { document.getElementById('Button2').value = '最小化' } else { document.getElementById('Button2').value = '最大化' }; window.external.MaxWin(); } </script>
为了 使网页能够 与winform 交互 所以 的把 com 的看见行 设置为真
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")] [ComVisible(true)] // 将该类设置为com可访问 public partial class MianWindow : GlassForm {}
为了 更好看 我们把 winform的 边框 去掉
这里 的代码 是 处理 移动窗口 我们使用 winApi
#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; this.MouseDown += new MouseEventHandler(WinApiMoveEvent); 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现在 演示 怎么让js 调用 winform的方法
/// <summary> /// 给WebBrowser中Web的JS调用的方法 关闭自己 /// </summary> /// <param name="msg"></param> public void ShowMsg(string msg) { } void Form1_AeroGlassCompositionChanged(object sender, AeroGlassCompositionChangedEventArgs e) { // When the desktop composition mode changes the window exclusion must be changed appropriately. if (e.GlassAvailable) { Invalidate(); } else { this.BackColor = Color.Teal; } } public void CloseMe() { if (MessageBox.Show("你确定要关闭吗?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { Close(); } }
///最大化和最小化的处理
public void MaxWin() { if (this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; } else { this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height); this.WindowState = FormWindowState.Maximized; } }如果是winform 要调用 web中的js 看这里
webBrowser1里有 document. InvokeScript("这里是js 的函数名", 这里是参数);
现在 基本完成 ,
现在 基本完成 ,
本人 不善表达 如有不明白 这里下源码看
作者:qq283868910 发表于2012-1-5 17:25:32 原文链接
阅读:441 评论:0 查看评论