Chrome插件——一键保存网页为PDF1.0

http://blog.csdn.net/bdstjk/article/details/9208313

仿照网上的一个代码写的,地址找不到了。

将窗体,控件什么的都封装到一个类库里面了,方便以后使用。

源码下载: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仿360卫士9.0界面设计的更多相关文章

  1. C# WPF仿360安全卫士11

    首先上效果图: 这是我的第一篇随笔,最近因为写一个播放器,开始学习WPF相关技术,随着不断入坑,播放器倒是做出来了,掉坑里了... 本着闲着也是闲着的精神,拿360开刀了: 主界面主要使用DMSkin ...

  2. android开发之-Android 开发之4.0界面设计原则-整理

    设计原则: 一.让人着迷: 1.给人惊喜:使用漂亮的界面.精心的动画.适时的音乐. 2.真实的对象比按钮和菜单更有趣   这句话的意思是:使用描述描述性的图标作为快捷方式,界面美观   当然这个快捷方 ...

  3. Qt实现360安全卫士10.0界面(编译时出现的一些问题)

    http://www.qtcn.org/bbs/read-htm-tid-57817.html 源码下载:https://git.oschina.net/zhjun5337/Qt360-10.0  或 ...

  4. DELPHI实现类似仿360桌面的程序界面

    1.窗体半透明: Alphablend属性为true;Alphablendvalue的值为100 2.窗体透明: formCreate: Self.TransparentColor := True;S ...

  5. WPF界面设计

    WPF仿360卫士9.0界面设计   Chrome插件——一键保存网页为PDF1.0 http://www.cnblogs.com/bdstjk/p/3163723.html 仿照网上的一个代码写的, ...

  6. 仿360手机卫士界面效果android版源码

    仿360手机卫士界面效果android版,这个今天一大早在源码天堂的那个网站上看到了一个那个网站最新更新的一个源码,所以就分享给大学习一下吧,布局还挺不错的,而且也很简单的,我就不把我修改的那个分享出 ...

  7. 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

    AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...

  8. WPF界面设计技巧(3)—实现不规则动画按钮

    原文:WPF界面设计技巧(3)-实现不规则动画按钮 发布了定义WPF按钮的教程后,有朋友问能否实现不规则形状的按钮,今天我们就来讲一下不规则按钮的制作. 不规则按钮的做法实际上和先前我们做不规则窗体的 ...

  9. WPF下的视频录制界面设计

    原文:WPF下的视频录制界面设计 在去年12月份,我曾经写过三篇文章讨论C#下视频录制.播放界面的设计.这三篇文章是:利用C#画视频录制及播放的界面(一) 利用C#画视频录制及播放的界面(二)利用C# ...

随机推荐

  1. hdu 1166 敌兵布阵(线段树单点更新,区间查询)

    题意:区间和 思路:线段树 #include<iostream> #include<stdio.h> using namespace std; #define MAXN 500 ...

  2. php 高效分页

    mysql.php 获取数据库中的记录,完全个人经验总结,仅供参考!<?php/***PHP+MYSQL数据库基本功能*http://blog.csdn.net/yown*/########## ...

  3. Jquery 操作页面中iframe自动跟随窗口大小变化,而页面不出现滚动条,只在iframe内部出滚动条

    很多时候大家需要iframe自适应所加载的页面高度而不要iframe滚动条,但是这次我需要的是页面不需要滚动条而iframe要滚动条,且iframe自动跟随窗口大小变化.自适应页面大小.下面是代码,下 ...

  4. Docker进入主流,PaaS大有可为(转)

    add by zhj: 文章简单的说了PaaS所使用的传统容器的缺点,而docker这个容器在一定程度上解决了这些问题,越来越多的PaaS平台使用docker作容器,实现应用的隔离.不过,由于dock ...

  5. 解决getOutputStream() has already been called for this response

    http://qify.iteye.com/blog/747842 —————————————————————————————————————————————————— getOutputStream ...

  6. 在VS2013中使用水晶报表

    又遇到了在B/S系统中打印,打印格式要求比较高,打印出的效果要求高大上.用VS2013中微软自带的报表,实在难以实现应用的效果,主要问题表现在: 1.不能插入用Word做好的打印模板,自己按照模板来做 ...

  7. OWA修改密码注意事项

    Exchange搭建参考 http://yuelei.blog.51cto.com/202879/76302 http://543925535.blog.51cto.com/639838/d-37/p ...

  8. 了解 JavaScript 中的内置对象

    所有编程语言都具有内部(或内置的)对象来创建 语言的基本功能.内部对象是 您编写自定义代码所用语言的基础, 该代码基于您的想象实现自定义功能.JavaScript 有许多 将其定义为语言的内部对象.本 ...

  9. python 加密解密

    1. 使用base64 s1 = base64.encodestring('hello world') s2 = base64.decodestring(s1) print s1, s2 结果 1 2 ...

  10. 编译安装-Apache

    一.配置选项说明 二.安装apache 1.环境准备 2.安装apr 3.安装apr-util 4.安装pcre 5.安装httpd 6.修改配置文件 7.开机自启动 8.注册为服务 9.测试 一.配 ...