我想自己做一个对话框,代替MessageBox。我现在的做法是添加一个windows窗体,在上面放了一个label,把窗体的FormBorderStyle设置成FixedSingle,但是这样就限制了窗体的大小,我想实现和MessageBox一样的功能要怎么做呢?要求是:
1、弹出的提示框大小随着提示框内容大小变化,没有最大化最小化和那个X。
2、点击OK或者Cancel能释放对话框资源,请问在这响应函数里面要调用什么?就一个Dispose能满足条件吗?希望大家帮下忙,不要让我去看书,现在没有时间看。我不是C#语言使用者,所以对C#很不熟悉,希望大家能讲得详细一点,谢谢了。

解决方案 »

  1.   

    用自动大小的label,窗体跟着label变
      

  2.   

    能不能给我代码呢?我真的不会C#、、、是不是要用函数获得label的大小?label自动大小是不是直接设置属性中的autosize就可以了?
    但是窗体跟着label改变大小怎么做到?
      

  3.   

    label 的autosize属性是自动大小的,autosize=true,lable在大小会根据lable内容长度自动变化的
    在弹出窗体的form_load事件里判断label的长度,然后再设置窗体的大小的,大概如下this.Wiedth = lable.Width + 20;
      

  4.   

    label1.autosize=true;
    form.autosize=true;
      

  5.   

    我以前做GIS系统的时候自己做过一个,不过代码不知道还能否找得到;
    思路就是:用Label控件,这个控件本身可以实现随内容变化大小;
    在鼠标移动事件里调用方法,显示提示框;比较麻烦的是处理:如果鼠标在界面的某个边界,尤其是下边界和右边界,需要处理提示框的显示位置;我回去找找,如果能找到的话就把源码给你;不过这种源码在网上很多的,我那时就是刚开始学习编程,在网上找了1个,自己琢磨了两天弄出来的
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace WindowsApplication1
    {
        public partial class AutoDeleteMessageBox : Form
        {
            [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
            private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);        [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);        public const int WM_CLOSE = 0x10;        public AutoDeleteMessageBox()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                StartKiller();
                MessageBox.Show("3秒钟后自动关闭MessageBox窗口", "MessageBox");
            }        private void StartKiller()
            {
                Timer timer = new Timer();
                timer.Interval = 3000; //3秒启动
                timer.Tick += new EventHandler(Timer_Tick);
                timer.Start();
            }        private void Timer_Tick(object sender, EventArgs e)
            {
                KillMessageBox();
                //停止Timer
                ((Timer)sender).Stop();
            }        private void KillMessageBox()
            {
                //按照MessageBox的标题,找到MessageBox的窗口
                IntPtr ptr = FindWindow(null, "MessageBox");
                if (ptr != IntPtr.Zero)
                {
                    //找到则关闭MessageBox窗口
                    PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
                }
            }
        }
    }
    文章出自
    不知道那个风语者是不是咱们.net的风语者
      

  7.   


    哪我给你写一个,运行后form变得很宽
    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 WindowsFormsApplication31
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            Label L = new Label();
                L.Parent = this;
                L.AutoSize = true;            this.AutoSize = true;            for (int i = 0; i < 1000; i++)
                    L.Text += "A";
            }
        }
    }
      

  8.   

    这个自己做的对话框要怎么退出呢?
    我的意思是在提示框上面加了一个按钮,点击这个按钮怎么释放掉new这个提示框所占用的资源?
    在这个按钮的响应函数里面加this.Dispose();this.Close();就可以了吗?
    这个this.Dispose();有什么作用?我尝试了下不要这句和添加这句,好像没有什么分别、、、另外我怎么将这个提示框上点击按钮的信息反馈呢?就像我们用messagebox的时候,可以判断上面点击的是“确定”还是“取消”?
      

  9.   

    释放资源是只要 close就可以了,窗体会自己释放的
      

  10.   

    Close()会调用Dispose(),不用自己调用,其实设置确定按钮的DialogResult=DialogResult.OK就可以,不用自己close,系统自己会处理
     
      

  11.   

    用这个的前提是form是ShowDialog的
      

  12.   

    我现在的做法是在提示框上拖一个按钮控件,在里面关闭窗口,并改变一个static的变量,这个变量就是判断提示框点击的是哪个按钮:
    [code=C]
            static int retype=0;        public MyBox(string str)
            {
                InitializeComponent();
                retype = 0;
                Label L = new Label();
                L.Parent = this;
                L.AutoSize = true;
                this.AutoSize = true;
                L.Text = str;
                this.Width = L.Width + 20;
                L.Location = new System.Drawing.Point(this.Location.X + ((this.Width - L.Width) / 2), (this.Location.Y + this.Height-50) / 2);            
            }        public int showmybox()
            {
                this.ShowDialog();
                return retype;
            }        private void button1_Click(object sender, EventArgs e)//这个是提示框上其中一个按钮响应函数
            {
                retype = 1;
                this.Close();
            }[code]
    这样的话,如果需要的是几个按钮,就要在提示框上拖几个按钮(确定、取消),构造函数接收多一个参数,用来确定按钮的数量,显示的时候,根据这个参数来显示某些按钮,隐藏某些按钮,这样好像不是很方便,能不能像Label一样,把按钮也放在构造函数里面动态new出来?这样new出来的按钮怎么动态添加其点击响应函数?
    另外我现在是使用一个static变量来判断点击的是什么按钮,有没有好点的方法呢?谢谢大家的回答,希望能再解决这两个问题,谢谢了
      

  13.   

    用个类写进函数再调用它试试using System;
    using System.Text;public class MessageBox
    {
        private MessageBox()
        {  }        public static void ShowConfirm(System.Web.UI.WebControls.WebControl Control, string msg)
        {
            Control.Attributes.Add("onclick", "return confirm('" + msg + "');");
        }    public static void Show(System.Web.UI.Page page, string msg)
        {      }    public static void ShowAndRedirect(System.Web.UI.Page page, string msg, string url)
        {      }    public static void ResponseScript(string script)
        {      }
    }
      

  14.   

    我现在的做法是添加一个windows窗体,在上面放了一个label,把窗体的FormBorderStyle设置成FixedSingle,但是这样就限制了窗体的大小,我想实现和MessageBox一样的功能要怎么做呢?
    能不能说的再清楚些?我不是很懂你说的什么意思?有个主窗体,准备怎样跳出messagebox,是随着时间,还是点击什么?label里面是固定的 还是什么?
      

  15.   

    要求是:
    写一个窗体,比如名字叫MyMessageBox。
    使用的时候就添加下面的代码MyMessageBox Mybox = new MyMessageBox("输入字符串",按钮类型);
    Mybox.showMybox();原因是我要把MessageBox上面的按钮变成英文的,所以自己做一个MessageBox。
    我现在已经做的是:
    用了11楼的方法,在构造函数里面new了个label,然后设置这个label的位置和内容,代码如下:public MyBox(string str)
    {
         InitializeComponent();
         retype = 0;
         Label L = new Label();
         L.Parent = this;
         L.AutoSize = true;
         this.AutoSize = true;
         L.Text = str;
         this.Width = L.Width + 20;
         L.Location = new System.Drawing.Point(this.Location.X + ((this.Width - L.Width) / 2), (this.Location.Y + this.Height-50) / 2); 
    }然后我要在提示框上添加按钮,所以这个构造函数要加一个参数作为第二个参数,用来判断按钮要怎么显示(即:显示一个yes按钮还是yes和cancel两个按钮)。
    有两个问题:
    1、按钮如果直接拖上去,要根据构造函数的第二个参数来判断是显示一个按钮还是显示两个按钮(还要设置按钮的位置等等)。能不能在构造函数里面直接用new的方法创建按钮呢?如果可以那么如何添加其响应函数呢?
    2、在点击按钮后,提示框关闭并释放资源,那么怎么知道点击的是什么按钮呢(如果有两个按钮)?这个问题wartim在15楼给了我答案,直接修改DialogResult,我开始不知道有这个参数(第一次接触C#)现在我有一个新的问题,MessageBox是怎么实现返回点击哪个按钮的?或者你说用DialogResult判断,我想知道DialogResult是不是一个static的呢?因为我现在的理解是这样:MessageBox.ShowDialog()这个函数显示了窗体,并在点击按钮的时候销毁窗体、释放资源,然后返回一个数值,既然销毁窗体、释放资源,那么返回的这个变量应该是static的?不知道我这样理解是不是正确的?
      

  16.   

    MessageBox ??以下几点需要做到
    不仅仅是显示窗体那么简单哈,还要在调用的那个线程被阻止,如果这个作为Msgbox的窗体不消失,那个调用的线程是不能退出的,(多线程处理)
    还要 某些窗体过程的处理,比如,移动窗体,但不能被最大/小化(窗体过程处理)等
    返回值,你可以定义为MessageBox的返回值
    跟目标窗体关联哈,
    其实C#的MessageBox做得够好了,但有所欠缺,比如,在限定的时候之后,自动关闭,这个系统是没有提供方法的,需要算法来实现,或者自己写一个,俺之后就打算这么写一个,但看上去挺简单,其实实现起来很麻烦
      

  17.   

    label1.autosize=true;
    form.autosize=true;