65.9K
CodeProject 正在变化。 阅读更多。
Home

所见即所得壁纸切割器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (6投票s)

2009 年 3 月 6 日

CPOL

3分钟阅读

viewsIcon

42877

downloadIcon

550

创建一个简单的工具来正确地获取壁纸。

引言

我们能够用宝剑从恶龙、骗子和其他恶棍手中拯救我们所爱的人的时代已经一去不复返了。现在,当我们的妻子在使用她的上网本电脑遇到麻烦时,我们来拯救她。 我妻子的最爱 (一份成功的情人节礼物) 有一个 1024 x 600 像素的小屏幕,显然她希望在桌面上放上她自己制作的宝宝照片。自从 95 年以来,Windows 提供了三个选项:拉伸、平铺和居中。第一个会扭曲我们的宝宝,而另外两个会显示图片的一小部分。显然不够用。

我的第一次尝试是建议缩小图像 (请参阅 我之前的帖子),以便它能够使用居中选项完全显示出来。她看了一眼我的眼神,让我明白这并非解决方案:她的“宽屏”背景的左右两侧会有黑条。没错。回到绘图板。现在,Vista 配备了一个工具 (Windows 照片库),允许我们裁剪图像。但是,固定的预定义宽高比不包括 1024x600。而且,自定义的那个不显示结果的大小。感谢微软给了我这次机会真正闪耀!我不能修理她的车,也不能为她写诗或画她的肖像。但是,我可以剪切图像。因为我有一个名叫 WPF 的朋友。

寻找解决方案时,起初,我一直在盒子里思考:让一个固定宽高比的矩形显示在图像之上;允许它移动和变大变小等等。但后来,我突然想到,理想情况下,我会直接在墙上编辑图像(桌面背景) - 最佳的 WYSIWYG。我将使用鼠标移动图片,使用鼠标滚轮更改大小(就像在 DeepEarth 和 Google Maps 中一样)。但是,我们不能编辑壁纸图像,对吧?

是的,我们可以!如果我们将应用程序做成类似信息亭应用程序(全屏)!开始了。实际上,配置应用程序以填充整个屏幕非常容易。图像位于一个 Panel 中,其 Stretch 属性设置为“Fill”,因为我们不想有任何失真。移动图像是通过设置此面板的 Margin 来实现的,而调整大小是通过更改 PanelWidth 来完成的。所以,基础知识非常简单。

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 日:初始版本。
© . All rights reserved.