所见即所得壁纸切割器






4.47/5 (6投票s)
创建一个简单的工具来正确地获取壁纸。
引言
我们能够用宝剑从恶龙、骗子和其他恶棍手中拯救我们所爱的人的时代已经一去不复返了。现在,当我们的妻子在使用她的上网本电脑遇到麻烦时,我们来拯救她。 我妻子的最爱 (一份成功的情人节礼物) 有一个 1024 x 600 像素的小屏幕,显然她希望在桌面上放上她自己制作的宝宝照片。自从 95 年以来,Windows 提供了三个选项:拉伸、平铺和居中。第一个会扭曲我们的宝宝,而另外两个会显示图片的一小部分。显然不够用。
我的第一次尝试是建议缩小图像 (请参阅 我之前的帖子),以便它能够使用居中选项完全显示出来。她看了一眼我的眼神,让我明白这并非解决方案:她的“宽屏”背景的左右两侧会有黑条。没错。回到绘图板。现在,Vista 配备了一个工具 (Windows 照片库),允许我们裁剪图像。但是,固定的预定义宽高比不包括 1024x600。而且,自定义的那个不显示结果的大小。感谢微软给了我这次机会真正闪耀!我不能修理她的车,也不能为她写诗或画她的肖像。但是,我可以剪切图像。因为我有一个名叫 WPF 的朋友。
寻找解决方案时,起初,我一直在盒子里思考:让一个固定宽高比的矩形显示在图像之上;允许它移动和变大变小等等。但后来,我突然想到,理想情况下,我会直接在墙上编辑图像(桌面背景) - 最佳的 WYSIWYG。我将使用鼠标移动图片,使用鼠标滚轮更改大小(就像在 DeepEarth 和 Google Maps 中一样)。但是,我们不能编辑壁纸图像,对吧?
是的,我们可以!如果我们将应用程序做成类似信息亭应用程序(全屏)!开始了。实际上,配置应用程序以填充整个屏幕非常容易。图像位于一个 Panel
中,其 Stretch
属性设置为“Fill
”,因为我们不想有任何失真。移动图像是通过设置此面板的 Margin
来实现的,而调整大小是通过更改 Panel
的 Width
来完成的。所以,基础知识非常简单。
mainGrid.MouseMove += new MouseEventHandler(mainGrid_MouseMove);
mainGrid.MouseWheel += new MouseWheelEventHandler(mainGrid_MouseWheel);
mainGrid.MouseDown += new MouseButtonEventHandler(mainGrid_MouseDown);
mainWindow.KeyDown += new KeyEventHandler(Window_KeyDown);
private void mainGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
_startDragPosition = e.GetPosition(null);
_startMarginLeft = imgPanel.Margin.Left;
_startMarginTop = imgPanel.Margin.Top;
e.Handled = true;
}
private void mainGrid_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Point position = e.GetPosition(null);
double xDrag = position.X - _startDragPosition.X;
double yDrag = position.Y - _startDragPosition.Y;
Move(xDrag, yDrag, /* adjust */ true);
_startDragPosition = position;
}
e.Handled = true;
}
private void Move(double x, double y)
{
Move(x, y, /* adjust */ false);
}
private void Move(double x, double y, bool adjust)
{
Thickness currentMargin = imgPanel.Margin;
if (adjust)
{
if (currentMargin.Left < 0) x *= 2;
if (currentMargin.Top < 0) y *= 2;
}
double newMarginLeft = currentMargin.Left + x;
double newMarginTop = currentMargin.Top + y;
imgPanel.Margin = new Thickness(newMarginLeft, newMarginTop, 0, 0);
}
private void mainGrid_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (e.Delta < 0)
{
DecreaseSize();
}
if (e.Delta > 0)
{
IncreaseSize();
}
e.Handled = true;
}
就这些吗?
嗯,是的。基本上。简单是一个特性!当然,我们需要一种方法来
- 获取图像的原始大小(以设置
imgPanel
的宽度和高度), - 抓取屏幕内容,
- 设置桌面背景,
所以我们需要某种控制面板。好的,这在 WPF 中很容易 (参见顶部的截图)。使其透明,添加一些动画,使按钮圆润...我们就有了 21 世纪的外观和感觉。作为一个实验,我将常用按钮上的字体大小设置得比不常用按钮上的字体大小大。这有意义吗?请告诉我。
对于不想用壁纸覆盖整个桌面背景的用户,有一个裁剪选项和用于屏幕剩余部分的颜色选择器。
剩下的要做
- 按钮是静态的。如果它们能动起来就好了。
- 如果按钮在更大的屏幕上更大就好了。
最后的评论
我妻子的上网本配备了 Windows XP,因此我需要在上面安装 .NET 3.5。
当然,该应用程序不仅限于上网本。我自己的笔记本电脑不支持像 国家地理 这样的热门壁纸网站支持的屏幕分辨率,因此我有时也需要一些裁剪支持。
我尝试在选择图像后关闭菜单(控制面板)。但这不起作用 - 事件处理程序未添加。我怀疑是 OpenFileDialog
,但我不确定。如果有人知道,请告诉我。
历史
- 2009 年 3 月 5 日:初始版本。