none
如何实现与MSN 窗口的最小化,最大化,关闭一样风格的窗体按钮? (C# winform) RRS feed

  • 问题

  • 如题,我之前考虑了是把winform的边界隐藏掉,才窗体内部自己画一个定制的按钮模拟,但是遇到一个不能拖拽窗体的问题(托拽窗体是靠默认边框实现的)
    另外一个就是用win32 API 来实现,不过我不熟悉win32 编程,请问有没有好的办法实现啊,高手赐教阿,谢谢啦

    2010年1月27日 5:59

答案

全部回复

  • 你可用把窗体的FormBorderStyle设为NOne来自定义实现,你在窗体上放置一些按钮,如果想让效果好的话,用图片来实现

    托拽窗体你可以通过判断鼠标的事件来实现

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace ExportQuestion
    {
        public partial class Form8 : Form
        {
            public Form8()
            {
                InitializeComponent();
            }
            private bool isMouseDown = false;
            private Point FormLocation; //form的location 
            private Point mouseOffset; //鼠标的按下位置 
            private void Form8_MouseMove(object sender, MouseEventArgs e)
            {
                int _x = 0;
                int _y = 0;
                if (isMouseDown)
                {
                    Point pt = Control.MousePosition;
                    _x = mouseOffset.X - pt.X;
                    _y = mouseOffset.Y - pt.Y;
    
                    this.Location = new Point(FormLocation.X - _x, FormLocation.Y - _y);
                } 
    
            }
    
            private void Form8_MouseUp(object sender, MouseEventArgs e)
            {
                isMouseDown = false; 
            }
    
            private void Form8_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    isMouseDown = true;
                    FormLocation = this.Location;
                    mouseOffset = Control.MousePosition;
                } 
    
    
            }
        }
    }
    

    努力+方法=成功
    2010年1月27日 6:11
  • 调整窗体大小

     const int WM_NCHITTEST = 0x0084;
            const int HTLEFT = 10;
            const int HTRIGHT = 11;
            const int HTTOP = 12;
            const int HTTOPLEFT = 13;
            const int HTTOPRIGHT = 14;
            const int HTBOTTOM = 15;
            const int HTBOTTOMLEFT = 0x10;
            const int HTBOTTOMRIGHT = 17;
    
            protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                switch (m.Msg)
                {
                    case WM_NCHITTEST:
                        Point vPoint = new Point((int)m.LParam & 0xFFFF,
                            (int)m.LParam >> 16 & 0xFFFF);
                        vPoint = PointToClient(vPoint);
                        if (vPoint.X <= 5)
                            if (vPoint.Y <= 5)
                                m.Result = (IntPtr)HTTOPLEFT;
                            else if (vPoint.Y >= ClientSize.Height - 5)
                                m.Result = (IntPtr)HTBOTTOMLEFT;
                            else m.Result = (IntPtr)HTLEFT;
                        else if (vPoint.X >= ClientSize.Width - 5)
                            if (vPoint.Y <= 5)
                                m.Result = (IntPtr)HTTOPRIGHT;
                            else if (vPoint.Y >= ClientSize.Height - 5)
                                m.Result = (IntPtr)HTBOTTOMRIGHT;
                            else m.Result = (IntPtr)HTRIGHT;
                        else if (vPoint.Y <= 5)
                            m.Result = (IntPtr)HTTOP;
                        else if (vPoint.Y >= ClientSize.Height - 5)
                            m.Result = (IntPtr)HTBOTTOM;
                        break;
                }
            }

    努力+方法=成功
    2010年1月27日 6:15
  • 谢谢开心,问下,调整窗体的代码应该写在哪里呢?

    2010年1月27日 6:24
  • 放到你的Form窗体里面就可以了。上面两个放到同一个文件中,你试试就知道了
    努力+方法=成功
    2010年1月27日 6:26
  • 非常感谢!
    2010年1月27日 6:32