在C#重要做一个圆形或者其他形状的窗口珍视太简单了:
1、用图形软件画出所要的窗口形状,比如你的圆形,把要透明的部分用你程
序中不使用的颜色进行填充。
2、如果你的窗口是固定大小,你的图片尺寸做成和窗口大小一致,把这张图片设成窗口的背景图片。如果你的窗口是可变大小的,在窗口放入一个PicturnBox控件,控件的Dock设成fill,控件的image属性设成你画的图片,空间的sizeMode设成stretchMode。
3、把窗口的transparencyKey属性设成你填充的颜色。执行程序看看是不是达到你要的效果。如果你把窗口的标题栏页去掉了,你必须自己来实现鼠标的拓动等操作。

解决方案 »

  1.   

    To:niwalker
    为什么我试的话不成功?如果不放图片,只将透明色设为窗体背景色,那么是可以达到目的的。但设置了背景图片就不成功了,我用BMP、JPEG和GIF都试了,不行,是不是对图片有什么特殊要求?
      

  2.   

    要透明的部分一定要用纯色填充,窗体的透明部分一定要和填充色的RGB匹配(一致)我试过了,没有问题的。
      

  3.   

    窗体属性如下设置:
    this.Opacity=100;
    this.BackColor=Color.White;
    this.TransparencyKey=Color.White;
    this.FormBorderStyle=FormBorderStyle.None;添加PictureBox,再加一张画有圆形的图片,
    private int BeginX;
    private int BeginY;
    private bool mousedown;private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    this.mousedown=true;
    this.beginX=e.X;
    this.beginY=e.Y;
    } private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    this.mousedown=false;
    } private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (this.mousedown)
    {
    this.Left+=e.X-this.beginX;
    this.Top+=e.Y-this.beginY;
    } }
      

  4.   

    不知我这里为什么就是不行,我用的是中文版,但我想应该不是版本的问题吧!开始以为是图片没有做好的缘故,后来界面上简单到只放个pictureBox,将其背景色设为白色,然后设置窗体透明色为白色。这样运行也不行。但如果是设置窗体的背景色为白色则可以??
      

  5.   

    to snewxf(心疤) :我不知道你需要什么代码,不规则的窗体设计方式你可以按照我回贴中的步骤做,不需要手工编码,至于鼠标部分,楼上德已经给出了PictureBox方式的代码,如果你使用的是窗体背景图方式,只需将PictureBox鼠标的事件改为窗体的相印的鼠标事件,另外可以取消MouseUP事件,楼上的代码可以进一步的优化,以下借用一下楼上兄弟的变量定义:private int beginX;
    private int beginY;
    private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
          beginX=e.X;
          beginY=e.Y;
    }private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
       if (e.Button=MouseButtons.Left)
       {
          Left+=e.X-beginX;
          Top+=e.Y-beginY;
       }
    }注:楼上的代码中BeginX和BeingY应该改为:beginX和beginY,注意大小写。
      

  6.   

    to  waki(不老先生): 不会是版本的问题,你能肯定你选的是白色吗?如果回答肯定,那么可能是系统的调色板不一致。
      

  7.   

    感谢使用微软产品。下面这篇文章详细介绍了如何创建非长方形的Windows Forms and Controls用Visual Studio .NET。
    值得一看。http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchshapedwindowsformscontrolsinvisualstudionet.asp- 微软全球技术中心 VC技术支持本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
      

  8.   

    MSDN上已经说了,显示器只能设置低于24位真彩色。难怪我两台机设的都是32位的,就显示不出来了。
    TO:ahchiee(脚印满天) 我自己做了个透明背景的图片(GIF格式),保证透明,在浏览器下试过。可如果显示器是设置32位的,就不行了,你能把你试验成功的图片发到我信箱来吗?谢谢[email protected]
      

  9.   

    那WinXP下mediaplayer的那些形状复杂的skin在32bit下也可以显示,他们是怎么做的?
      

  10.   

    可以使用API函数来实现,只不过.Net提供的方法太简单和方便了,让人都不想再用API函数了。可就是总有点小BUG。
      

  11.   

    我来总结一下,如果不对,请各位指正。
    1。当客户机上的显卡设置为24位真彩或以下时,设置Form的TransparencyKey值为透明颜色值就可实现窗体中所有此颜色都将为透明,不管是PictureBox或是其它控件。
    2。当客户机上显卡设置为24位以上时,如32位。则以上设置中,PictureBox中的图片不会变成透明,而是会成黑色背景。如果没有设置Form的背景图,则Form的背景色是可以透明的,但一旦设置了Form的bgImage,就背景图不透明。
    3。不管客户机如何设置,都让它成为一个不规则窗口的方法。
       首先做一个透明的GIF图片文件,不管此GIF文件的透明色是什么颜色,只要透明就行了。
       其次将窗体的背景设为此图片,然后将TransparencyKey设置为黑色!一定是黑色,不能是其它颜色!!!再将边框设置为NONE,就可得到一个不规则窗体。
       一般来讲,如果将图片设为窗体的背景,我们不好控制它的行为,更常见的是加多个PictureBox控件,然后将PictureBox的背景设为图片。这种情况中要注意一个问题,设为PictureBox的背景图可以,设为PictureBos.image对象就不行。大家可以验证一下我写的对不对。