WPF界面设计
WPF仿360卫士9.0界面设计
Chrome插件——一键保存网页为PDF1.0http://www.cnblogs.com/bdstjk/p/3163723.html |
仿照网上的一个代码写的,地址找不到了。
将窗体,控件什么的都封装到一个类库里面了,方便以后使用。
源码下载:http://download.csdn.net/detail/bdstjk/5679651
界面效果:

窗体模板,主要是实现一个无边框窗体,并添加阴影效果。
<Style TargetType="DazzleWPF:DazzleWindow"> <Setter Property="AllowsTransparency" Value="true"/> <Setter Property="Background" Value="Transparent"/> <!--<Setter Property="ResizeMode" Value="CanResizeWithGrip"/>--> <Setter Property="WindowStyle" Value="None"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="DazzleWPF:DazzleWindow"> <Grid Margin="5"> <Rectangle Fill="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" > <Rectangle.Effect> <DropShadowEffect BlurRadius="10" ShadowDepth="0"/> </Rectangle.Effect> </Rectangle> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Margin}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> <ContentPresenter /> </Border> </Grid> </ControlTemplate> </Setter.Value> </Setter></Style> |
窗体类,代码也很简单,调用一下类WindowBehaviorHelper 的方法,实现缩放操作的修复,避免最大化覆盖任务栏等。
再添加一下鼠标左键按下的拖动支持。
就OK了。
public class DazzleWindow : Window{ public DazzleWindow() { this.DefaultStyleKey = typeof(DazzleWindow); //缩放,最大化修复 WindowBehaviorHelper wh = new WindowBehaviorHelper(this); wh.RepairBehavior(); this.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(DazzleWindow_MouseLeftButtonDown); } void DazzleWindow_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { this.DragMove(); }} |
窗体行为修复,主要代码来了:
public class WindowBehaviorHelper { private const int WM_NCHITTEST = 0x0084; //测试消息 private const int WM_GETMINMAXINFO = 0x0024;//大小变化 private Window WindowTarget; //目标窗口 private int WidthCorner = 3; //拐角宽度 private int ThicknessTransparentBorder = 5; //阴影宽度 private int ThicknessBorder = 4; //边框宽度 private Point PointMouse = new Point(); //鼠标坐标 public enum HitTest : int //测试句柄 { #region 测试句柄 HTERROR = -2, HTTRANSPARENT = -1, HTNOWHERE = 0, HTCLIENT = 1, HTCAPTION = 2, HTSYSMENU = 3, HTGROWBOX = 4, HTSIZE = HTGROWBOX, HTMENU = 5, HTHSCROLL = 6, HTVSCROLL = 7, HTMINBUTTON = 8, HTMAXBUTTON = 9, HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13, HTTOPRIGHT = 14, HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17, HTBORDER = 18, HTREDUCE = HTMINBUTTON, HTZOOM = HTMAXBUTTON, HTSIZEFIRST = HTLEFT, HTSIZELAST = HTBOTTOMRIGHT, HTOBJECT = 19, HTCLOSE = 20, HTHELP = 21 #endregion } //构造函数 public WindowBehaviorHelper(Window window) { this.WindowTarget = window; } //修复行为 public void RepairBehavior() { if (WindowTarget == null) return; this.WindowTarget.SourceInitialized += delegate { IntPtr handle = (new WindowInteropHelper(WindowTarget)).Handle; HwndSource hwndSource = HwndSource.FromHwnd(handle); if (hwndSource != null) { hwndSource.AddHook(WindowProc); } }; } //消息循环 private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case WM_NCHITTEST: if (WindowTarget.WindowState != WindowState.Normal) { break; } this.PointMouse.X = (lParam.ToInt32() & 0xFFFF); this.PointMouse.Y = (lParam.ToInt32() >> 16); //窗口左上角 if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder && this.PointMouse.X <= this.WindowTarget.Left + this.ThicknessTransparentBorder + this.WidthCorner && this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder && this.PointMouse.Y <= this.WindowTarget.Top + this.ThicknessTransparentBorder + this.WidthCorner) { handled = true; return new IntPtr((int)HitTest.HTTOPLEFT); } //窗口左下角 else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder && this.PointMouse.X <= this.WindowTarget.Left + this.ThicknessTransparentBorder + this.WidthCorner && this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder && this.PointMouse.Y >= this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder - this.WidthCorner) { handled = true; return new IntPtr((int)HitTest.HTBOTTOMLEFT); } //窗口右上角 else if (this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder && this.PointMouse.X >= this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder - this.WidthCorner && this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder && this.PointMouse.Y <= this.WindowTarget.Top + this.ThicknessTransparentBorder + this.WidthCorner) { handled = true; return new IntPtr((int)HitTest.HTTOPRIGHT); } //窗口右下角 else if (this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder && this.PointMouse.X >= this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder - this.WidthCorner && this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder && this.PointMouse.Y >= this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder - this.WidthCorner) { handled = true; return new IntPtr((int)HitTest.HTBOTTOMRIGHT); } //窗口左侧 else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder && this.PointMouse.X <= this.WindowTarget.Left + this.ThicknessTransparentBorder + this.ThicknessBorder && this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder && this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder) { handled = true; return new IntPtr((int)HitTest.HTLEFT); } //窗口右侧 else if (this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder && this.PointMouse.X >= this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder - this.ThicknessBorder && this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder && this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder) { handled = true; return new IntPtr((int)HitTest.HTRIGHT); } //窗口上方 else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder && this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder && this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder && this.PointMouse.Y <= this.WindowTarget.Top + this.ThicknessTransparentBorder + this.ThicknessBorder) { handled = true; return new IntPtr((int)HitTest.HTTOP); } //窗口下方 else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder && this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder && this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder && this.PointMouse.Y >= this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder - this.ThicknessBorder) { handled = true; return new IntPtr((int)HitTest.HTBOTTOM); } //其他消息 else { break; } case WM_GETMINMAXINFO: WmGetMinMaxInfo(hwnd, lParam); handled = true; break; default: break; } return IntPtr.Zero; } //更改最小化最大化时窗口位置大小 private void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam) { MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); int MONITOR_DEFAULTTONEAREST = 0x00000002; IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero) { MONITORINFO monitorInfo = new MONITORINFO(); GetMonitorInfo(monitor, monitorInfo); RECT rcWorkArea = monitorInfo.rcWork; RECT rcMonitorArea = monitorInfo.rcMonitor; mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left) - 3; mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top) - 3; mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left) + 6; mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top) + 6; mmi.ptMinTrackSize.x = (int)this.WindowTarget.MinWidth; mmi.ptMinTrackSize.y = (int)this.WindowTarget.MinHeight; } Marshal.StructureToPtr(mmi, lParam, true); } [DllImport("user32")] internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); [DllImport("User32")] internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); #region Nested type: MINMAXINFO [StructLayout(LayoutKind.Sequential)] internal struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; } #endregion #region Nested type: MONITORINFO [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] internal class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor; public RECT rcWork; public int dwFlags; } #endregion #region Nested type: POINT [StructLayout(LayoutKind.Sequential)] internal struct POINT { public int x; public int y; public POINT(int x, int y) { this.x = x; this.y = y; } } #endregion #region Nested type: RECT [StructLayout(LayoutKind.Sequential, Pack = 0)] internal struct RECT { public int left; public int top; public int right; public int bottom; public static readonly RECT Empty; public int Width { get { return Math.Abs(right - left); } } public int Height { get { return bottom - top; } } public RECT(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } public RECT(RECT rcSrc) { left = rcSrc.left; top = rcSrc.top; right = rcSrc.right; bottom = rcSrc.bottom; } public bool IsEmpty { get { return left >= right || top >= bottom; } } public override string ToString() { if (this == Empty) { return "RECT {Empty}"; } return "RECT { left : " + left + " / top : " + top + " / right : " + right + " / bottom : " + bottom + " }"; } public override bool Equals(object obj) { if (!(obj is Rect)) { return false; } return (this == (RECT)obj); } public override int GetHashCode() { return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode(); } public static bool operator ==(RECT rect1, RECT rect2) { return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom); } public static bool operator !=(RECT rect1, RECT rect2) { return !(rect1 == rect2); } } #endregion } |
WPF界面设计的更多相关文章
- WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心
原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...
- WPF界面设计技巧(10)-样式的继承
原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...
- WPF界面设计技巧(9)—使用UI自动化布局
原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...
- WPF界面设计技巧(8)—自制山寨版CheckListBox
原文:WPF界面设计技巧(8)-自制山寨版CheckListBox 近年来IT市场山寨横行啊,我们今天也来发扬一下山寨精神,搞个自制的CheckListBox出来. 喏,CheckListBox 就是 ...
- WPF界面设计技巧(7)—模拟电梯升降的缓动动画
原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...
- WPF界面设计技巧(6)—玩玩数字墨水手绘涂鸦
原文:WPF界面设计技巧(6)-玩玩数字墨水手绘涂鸦 想让你的程序支持鼠标及手写笔涂鸦吗?只要敲入“<InkCanvas/>”这几个字符,你就会领悟什么叫“很好很强大”,今天我们来做一个手 ...
- WPF界面设计技巧(5)—自定义列表项呈现内容
原文:WPF界面设计技巧(5)-自定义列表项呈现内容 接续上次的程序,稍微改动一下原有样式,并添加一个数据模板,我们就可以达成下面这样的显示功能: 鼠标悬停于文件列表项上,会在工具提示中显示图像缩略图 ...
- WPF界面设计技巧(4)—自定义列表项样式
原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...
- WPF界面设计技巧(3)—实现不规则动画按钮
原文:WPF界面设计技巧(3)-实现不规则动画按钮 发布了定义WPF按钮的教程后,有朋友问能否实现不规则形状的按钮,今天我们就来讲一下不规则按钮的制作. 不规则按钮的做法实际上和先前我们做不规则窗体的 ...
- WPF界面设计技巧(2)—自定义漂亮的按钮样式
原文:WPF界面设计技巧(2)-自定义漂亮的按钮样式 上次做了个很酷的不规则窗体,这次我们来弄点好看的按钮出来,此次将采用纯代码来设计按钮样式,不需要 Microsoft Expression Des ...
随机推荐
- ASP.NET MVC 插件化
ASP.NET MVC 插件化机制 2015-03-14 22:25 by 杨康新, 1328 阅读, 15 评论, 收藏, 编辑 概述 nopCommerce的插件机制的核心是使用BuildMana ...
- 基于webrtc技术session border controler (SBC)
由于原来的文章 http://blog.csdn.net/voipmaker 转载注明出处. 我建了一个通信学习 交流群. 45211986, 欢迎增加. WebRTC技术致力于在浏览器端实现实时音 ...
- 网页动态切换母版页(MasterPage)
原文:网页动态切换母版页(MasterPage) 是否可以变更网页的母版页(MasterPage)呢?某.aspx在创建时,已经附加入某一母版页(MasterPage)了,现需要.aspx动态变更母版 ...
- Spring 之 第一个hellword
Rod Johnson在2002年编著的<Expert one to one J2EE design and development>一 书中,对Java EE正统框架臃肿.低效.脱离现实 ...
- .Net在线付款---Paydollar在线付款开发过程
原文:.Net在线付款---Paydollar在线付款开发过程 最近在做一个Web订单项目,项目有一个需求就是集成Paypal与Paydollar在线付款,一开始看到这个需求也是傻了眼,因为以前从来没 ...
- Robotium源码分析之运行原理
从上一章<Robotium源码分析之Instrumentation进阶>中我们了解到了Robotium所基于的Instrumentation的一些进阶基础,比如它注入事件的原理等,但Rob ...
- bat启动/停止oracle服务
原文:bat启动/停止oracle服务 自己的电脑比较慢,尤其装了oracle10g后,服务开启和关闭用bat文件操作省事点 开启服务 @echo offnet start OracleService ...
- oracle存储过程+游标处理select数据
create or replace PROCEDURE UPDATE_RECORDCODE is cursor location_data is select * from location wher ...
- UVA10537 Toll! Revisited
difkstra + 路径输出 The Toll! Revisited Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- 大约PF_RING/Intel 82599/透明VPN一些事
接近崩溃的边缘,如今,在医院这篇文章地方的想法,小病,我宁愿不吃药瓶.一台笔记本电脑,但无法上网,我不称职.想知道的东西.唯一可用3G,不开的热点.由于没人给我报销流程.这个周末,我只有一天,由于下雨 ...