我的问题是这样的,我想制作一个类似“桌面天气秀”的软件,现在想实现他的界面界面效果,天气秀窗体的背景是一张半透明的PNG图片,程序运行后可以透过PNG图片看到桌面上的东西。现在我在csdn上面找到了类似的答案。
地址如下:http://topic.csdn.net/t/20051203/15/4435788.html
但是layered   windows后,无法添加控件,可以用另一个窗体来添加控件,但是如何能做到这两个窗体的同步移动呢?还请多各位高手多多帮忙!或者大家可以不用这种方式也可以,只要能实现这个功能就行!
ps:可以说是类似磁性窗体的这种效果

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4782/4782170.xml?temp=.9688684
      

  2.   

    你把第二个窗体的所有this.Owner设置为第一个,然后Form f = (Form)this.Owner;
                f.LocationChanged +=
      

  3.   

    我刚才发的一个答案:
      public partial class Form1 : Form
      {
        Form f2 = new Form2();    public Form1()
        {
          InitializeComponent();
        }    private void Form1_Load(object sender, EventArgs e)
        {
          f2.Show();
        }    protected override void WndProc(ref Message m)
        {
          const int WM_MOVE = 0x3;      if (m.Msg == WM_MOVE)
            f2.Location = new Point(this.Left + this.Width, this.Top);      base.WndProc(ref m);
        }
      }
      

  4.   

    to ymmzl(昵称暂无):
    谢谢你的代码,但是我是需要的是精确定位的那种,因为我想实现的效果就是一个窗体完全覆盖在另一个窗体之上,当上面的窗体移动时,下面的窗体和他同步移动,最后的效果还是一个窗体覆盖在另一窗体之上,你提供的代码虽然能够实现2个窗体的同步移动,但是却不能进行精确的移动。
    to kmblack1(black) :
    你提供的代码不全,我没有看懂,请见谅!能否提供一个详细的代码呢?
    总之,谢谢上面提到的两位朋友的热心帮助!
    希望广大的朋友在继续帮忙,先谢谢大家了!
      

  5.   

    Form1调用Form2时做下面的处理
    Form2 form2 = new Form2();
    form2.LocationChanged += new EventHandler(form2_LocationChanged);
    form2.Show();
    相应的事件
    void form2_LocationChanged(object sender, EventArgs e)
    {
           Form2 form2 = (Form2)sender;
            this.Location = form2.Location;
    }
      

  6.   

    public partial class Form1 : Form
        {
            private Form2 m_form2;        public Form1()
            {
                InitializeComponent();
                this.m_form2 = new Form2();
                this.m_form2.Owner = this;
            }        protected override void OnLoad(EventArgs e)
            {
                
                this.m_form2.Location = new Point(this.Location.X + this.Width,this.Location.Y );
                this.m_form2.Show();
                base.OnLoad(e);
            }
        }
      

  7.   

    public partial class Form2 : Form
        {
            private Form1 m_form1;
            
            public Form2()
            {
                InitializeComponent();
                this.StartPosition = FormStartPosition.Manual;
                this.WindowState = FormWindowState.Normal;
                
                
            }        private void form1_LocationChanged(object sender, EventArgs e)
            {
                this.Location = new Point(this.m_form1.Location.X + this.m_form1.Width, this.m_form1.Location.Y);
            }        protected override void OnLoad(EventArgs e)
            {
                this.m_form1 = (Form1)this.Owner;
                this.m_form1.LocationChanged += new EventHandler(form1_LocationChanged);
                base.OnLoad(e);
            }        
        }
      

  8.   

    如果是XP你要修改一下系统注册表 "在拖动时显示窗体内容"禁用,很费CUP和内存,在桌面右键-属性-效果中查看,
    注册表里也有相应的项,位置我记不太清了,改一下就好了
      

  9.   

    to kmblack1(black):
    非常感谢你的代码,按照你的代码指示,我已经能够完成这种效果,但是现在还有个小问题,就是如何能保证这两个窗体重叠在一起呢?
      

  10.   

    this.Location = new Point(this.m_form1.Location.X + this.m_form1.Width, this.m_form1.Location.Y);
    改为
     this.Location = new Point(this.m_form1.Location.X, this.m_form1.Location.Y);
    如果要重在一起,你要写另外的方法来分别显示两个窗体尽量使用事件完成的功能,当事件不能满足要求时才使用WndProc,比如你要监视光标和键盘消息等