自定义默认输入?

时间:2014-07-12 13:14:47

标签: c# .net winforms skin

我想知道是否有可能自定义我的C#应用​​程序(winforms)以获得更好的设计,我制作了一个PSD(photoshop文档),所以我可以生成png jpeg ...图片,如果我需要它们。 / p>

我想要的表格示例:

link

2 个答案:

答案 0 :(得分:1)

确实正如评论中指出的那样,很容易使用WPF(indows Presentation Foundation)来实现这一结果,但是如果你真的需要它必须在Windows窗体中制作,我可以帮助你...

ControlBox和Border

确定您的表单没有控件框(最小化,最大化和关闭按钮) 实现你可以设置

form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None

我不确定你表单背后的那个星系是否是应用程序的一部分,所以我会考虑它不是 为了实现形式的不规则形状,我们必须在这里做一个解决方法

表格的不规则形状

我们要将Color设置为TransparentKey,因此表单中所有特定颜色的内容都是透明的,就像它不存在一样(如果你点击那部分,它会进入桌面或你背后的任何应用程序)在你的形式) 因此,让我们使用一种我们可能不会在表格中使用的特定颜色

form.TransparencyKey = Color.FromArgb(111, 111, 111); //You can do it by the editor

因此,为了制作白色部分,我们将使用面板的面板 PictureBox 外部来尝试复制图像的形状

程式化输入

为了让它变得更容易和可重复使用,我将在这个中创建一个userControl 用户控件将具有

  • 一个名为 HighLightPanel 的面板,其dock属性将设置为Fill
  • 一个名为 BackColorPanel 的小组,它将位于 HighLightPanel
  • 一个名为 InputPicture 的PictureBox,其dock属性将设置为Left,它将位于 BackColorPanel 内,并且其acessor将为public
  • 一个名为 TextBox 的TextBox,其dock属性将设置为fill,它将在 BackColorPanel 内,BorderStyle属性设置为None,你应该设置大小和你最鄙视这个字体的字体,我将使用 Segoe UI; 15,75pt 及其继承人将公开

现在我们必须在UserControl中创建一些属性,使其无需在其他控件中工作

首先在 HighLightPanel 的SizeChanged事件中,我们将使BackColorPanel在每个方向上的两个点更小,并且它的位置为1; 1,这样我们就可以看到 HighLightPanel

 private void HighlightPanel_SizeChanged(object sender, EventArgs e)
 {
         this.BackColorPanel.Size = new Size(
              HighlightPanel.Width - 2, 
              HighlightPanel.Height - 2);
 }

现在我们将创建两个属性来处理Highlight Color

public Color HighlightBorderColor { get; set; }
public Color NonHighlightBorderColor { get; set; }

TextBox 的Enter和Leave属性中,我们将更改 HighlightPanel

private void TextBox_Enter(object sender, EventArgs e)
{
    HighlightPanel.BackColor = HighlightBorderColor;
}
private void TextBox_Leave(object sender, EventArgs e)
{
    HighlightPanel.BackColor = NonHighlightBorderColor;
}

所以现在每次用户输入输入时,输出都会显示指定颜色的边框 现在为了增强它对开发人员的可用性,我们将在其控件中创建一些包装器,以便在编辑器中更轻松地更改子控件的属性

public Image InputImage
{
    get { return InputPicture.Image; }
    set { InputPicture.Image = value; }
}
public PictureBoxSizeMode InputImageLayout
{
    get { return InputPicture.SizeMode; }
    set { InputPicture.SizeMode = value; }
}
public char PasswordCharacter
{
    get { return TextBox.PasswordChar; }
    set { TextBox.PasswordChar = value; }
}
public bool ShowInputImage
{
    get { return InputPicture.Visible; }
    set { InputPicture.Visible = value; }
}

在InputImage中为用户和密钥设置所需的图片 将两个控件插入您喜欢的位置

表格的位置

如果您希望您的表单在没有边框的情况下可移动,则必须使用此代码段,在WPF中更容易

#region MoveForm
Point LastPoint;
bool ShouldMove;
private void form_MouseDown(object sender, MouseEventArgs e)
{
    LastPoint = e.Location;
    ShouldMove = true;
    this.TransparencyKey = Color.FromArgb(111, 111, 111);
}
private void form_MouseUp(object sender, MouseEventArgs e)
{
    ShouldMove = false;
}
private void form_MouseMove(object sender, MouseEventArgs e)
{
    if (ShouldMove)
    {
        this.Location = new Point(
             this.Location.X - LastPoint.X + e.X, 
             this.Location.Y - LastPoint.Y + e.Y);
    }
}
#endregion

答案 1 :(得分:-1)

如果你需要很多特殊的图形效果,学习WPF确实会是一个合理的投资。

如果您想要的只是登录屏幕,那么在Winforms中它是微不足道的,并且在您被告知时不会采取任何可怕的黑客攻击。

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.BackColor = System.Drawing.Color.LavenderBlush;
this.TransparencyKey = System.Drawing.Color.LavenderBlush;
this.ControlBox = false;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Text= "";

这七行是表单透明所需的全部内容。我从Designer代码中复制了它们;您只需在属性网格中设置7个属性即可。

现在添加一个面板,将其停靠在底部并赋予其正确的颜色;添加一个图片框和其他控件,你就可以了。

要创建两个输入组,您还需要一些常规控件,只需几行简单的代码:

您放置一个面板BorderStyle = FixedSingle;并向其添加标签和文本框。标签有AutoSize = False;ImageAlignTextAlign都设置为MiddleLeft。您将图像分配给标签Image,并在Text前面添加足够的空白以使其不重叠。显然你应该为第二个TextBox定义一个PasswordChar。现在,您只需编写EnterLeave事件的脚本,即可更改相应面板之间的BackColor,例如SystemColors.ControlSystemColors.MenuHighlight。调整标签大小几乎填满面板,你就完成了。比WPF版本更少的代码,我敢打赌。

如果您需要一次又一次地输入控件,只需为您需要的每种类型创建Usercontrol!

以下是您将会遇到的限制的示例:为图像添加阴影效果会不会很好?它在Winforms中是可行的。但它会涉及到绘画的效果;这将需要至少15或20行所涉及的代码,而不是简单地使用(估计的)1-3个简单的行来改变效果。

你需要任何漂亮的悬停效果吗?不容易,至少可以说..

这些限制将会到处都是,所以这实际上取决于您的要求有多花哨。

也许您应该使用此示例作为首发来比较这两种技术并使您热衷于WPF?