我是新手,遇见如下问题,望前辈们给以指导。我在一个窗体放了一个panel,panel占了整个窗体的90%面积。运行后必须在panel之外的窗体上点击一下,之后才能响应鼠标的其他事件。如果不在panel之外点一下,在panel上不管怎么点都没有。不知道是什么原因。望给位前辈给以指点。

解决方案 »

  1.   

    不太明白楼主的意思,鼠标事件是Panel的,还是窗体的?如果是窗体的,当然不会在panel上响应。除非你把Panel也加上事件。
    或者是,所谓的其他事件,是否如滚轮事件?那就需要你欲响应事件的控件取得焦点,具体怎么处理,大概就是想办法让它取得焦点吧。
      

  2.   

    这是小弟的第一个C#程序。几个问题一起请教一下前辈。1.焦点问题,为了在窗体建立后能马上panel1相应的鼠标事件,在form1_load函数最后面加了panel1.focus(),还是不起作用,不知道是否还需要在其他地方处理?
    2.当窗体纵向尺寸慢慢变小的时候,一切正常。如果快速变小时,会出现无不希望的窗体纵向滚动条(纵向我只需要panel滚动条)。请问怎么解决?我在窗体拖了两个panel,其余部分的代码如下:namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            private Int16 UnitWidth=30;
            private Int16 LatiNum = 160;
            private Graphics FabricGDI;
            private Int32[] Fabdata ;        public Form1()
            {
                InitializeComponent();
                Fabdata = new Int32[LatiNum+5];
                Fabdata[0] = LatiNum;
                for (int i = 1; i <=LatiNum; i++)
                    Fabdata[i] = 0x0;
            }        private void Form1_Load(object sender, EventArgs e)
            {
                this.Width = 800;
                this.Height = 600;
                this.AutoScroll = true;            panel2.AutoScroll = true;
                panel2.Parent = this;
                panel1.Height = LatiNum * UnitWidth;
                panel1.Width = this.Width - 30;
                panel1.Parent = panel2;
                panel2.Location = new Point(0, 50);
                panel1.Location = new Point(0, 0);            FabricGDI = panel1.CreateGraphics();
                ReSiz(sender,e);
                for (int i = 1; i < 23; i++)
                {
                    Button buttonx = new Button();
                    buttonx.Top = 20;
                    buttonx.Left = 50 + i * UnitWidth;
                    buttonx.Text = i.ToString();
                    buttonx.Width = UnitWidth + 2;
                    buttonx.Parent = this;            }            for (int i = 1; i <= LatiNum; i++)
                {
                    Label buttonx = new Label();
                    buttonx.Top = (LatiNum - i) * UnitWidth;
                    buttonx.Left = 50;
                    buttonx.Text = i.ToString();
                    buttonx.BackColor = Color.Yellow;
                    buttonx.Width = 30;
                    buttonx.Height = UnitWidth-3;
                    buttonx.Parent = panel1;
                }
                this.Resize += new System.EventHandler(ReSiz);
                this.Show();
                Fab_GDI(sender,e);
                panel1.Focus();
            }        private void ReSiz(object sender, EventArgs e)
            {
                if (this.Width > (18 * UnitWidth + 200))
                {
                    panel1.Width = this.Width - 30;
                    panel2.Width = this.Width - 10;
                }
                panel2.Height = this.Height - 100;
                Fab_GDI(sender, e);
            }        private void Fab_GDI(object sender, EventArgs e)
            {
                int Width = UnitWidth - 2;
                int Height = UnitWidth - 2;
                for (int i = 1; i <= LatiNum; i++)
                {
                    int Top = (LatiNum - i) * UnitWidth ;
                    int data = Fabdata[i];
                    for (int j = 1; j < 19; j++)
                    {
                        int Left = 50 + j * UnitWidth;
                        if ((data&1)==1)
                             FabricGDI.FillRectangle(Brushes.Black, Left, Top, Width, Height);
                        else FabricGDI.FillRectangle(Brushes.White, Left, Top, Width, Height);
                        data >>= 1;
                    }
                }
                panel1.Show();
                panel2.Show();
                this.Show();
               // panel1.Focus();
            }        protected void DataChange(object sender,MouseEventArgs e)
            {
                int i = LatiNum - e.Y / UnitWidth;
                if (e.X < (50+UnitWidth))
                    return;            int j = (e.X - 50) / UnitWidth-1;
                if (j < 18)
                {
                    int  = 1 <<j;
                    Fabdata[i] |= ;
                }
                Fab_GDI(sender, e);
            }
            protected override void OnClick(EventArgs e)
            {
                base.OnClick(e);
                panel1.MouseClick += DataChange;
            }        private void panel2_Paint(object sender, PaintEventArgs e)
            {        }        private void panel1_Paint(object sender, PaintEventArgs e)
            {
                Fab_GDI(sender, e);
            }
        }
    }
      

  3.   

    昏~~
    1、panel1.MouseClick += DataChange这一句放在OnClick里当然得点一下主窗体才会为panel1绑定Click事件了,把这一句放到Form1_Load里去!或是在panel1的事件列表里选择MouseClick事件把DataChange复制进去回车使之在初始化的时候就绑定事件。2、this.AutoScroll = true——有这一句主窗体就会在恰当的时候出现滚动条,如果不想让主窗体出现滚动条就把这句去掉。
      

  4.   

    多谢5楼解答。
    第一个问题已完全解决,谢谢!
    第二问题。我希望窗体的横向滚动条在适当的时候出现,纵向滚动条永远不出现(纵向滚动条由panel2来实现)。如果把this.AutoScroll = true去掉,横向滚动条就没有了。我试了this.vscroll=false,但不起作用。
    望前辈继续给以指点,如果实现窗体只有横向滚动条,而没有纵向滚动条。
      

  5.   

    设置AutoScroll为true之后,在Form1_Load里加上这两句:
    this.HScroll = true;
    this.VScroll = false;
    这样就行了,两个都要,缺一不可。
      

  6.   

    回7楼:根据你的建议我在设置AutoScroll为true之后加了this.HScroll = true; this.VScroll = false; 但是结果还是一样。纵向滚动条仍然存在,纵向和横向滚动条好像完全受控于AutoScroll。请问你用该办法调试过吗?是不是我还有其他地方没有设置啊?
    另外请教一下各位前辈,我4楼的代码是不是有明显的不妥之处啊?显示延时很明显。我的应用当中还要加很多显示,加了以后拖动纵向滚动条显示延时就更明显了。有没有什么办法解决啊?
      

  7.   

    this.HScroll = true;
    this.VScroll = false;
    这个我是加在Form的Load事件里的,测试过了没问题。无论你是在设计器里设置AutoScroll为true还是在这两句代码之前或之后手动设置为true效果都一样。你检查一下是不是加错地方了。4楼的代码我没仔细分析,太长了,懒得分析是什么思路,想实现什么效果。你想实现的是什么效果,描述一下你程序的思路。如果是画个什么东西觉得闪得厉害延时严重的可以试试双缓冲。
      

  8.   

    panel是一个容器,就一个范围,用其他控件响应吧
      

  9.   

    多谢10楼前辈指点,我把那两句放在Form的Load里面还是不起作用,我用的是VS2005,你用是2008吗?我想实现的是类似EXCEL的表格。拖动纵向滚动条时,要求最上面一行标题(在EXCEL中以A、B、C来表示)保持原位不动;
    拖动横向滚动条时,要求最上面一行标题跟着表格内容一起动。表格的行号滚动效果最好也能如EXCEL一样。表格内容共有22列,行数不确定。其中18列是全黑或全白的方格,鼠标点一下由白变黑;另外4列是数字,要求可以改动。请问如何实现最佳?关键滚动条,不知道如何实现滚动。
      

  10.   

    依然十分感谢你的解答。由于现在的问题与标题大相径庭,先结贴另开。
    http://topic.csdn.net/u/20080808/10/048b87dc-086b-4f85-86c2-3355dc275221.html