为什么Panel 无法相应鼠标事件? 我是新手,遇见如下问题,望前辈们给以指导。我在一个窗体放了一个panel,panel占了整个窗体的90%面积。运行后必须在panel之外的窗体上点击一下,之后才能响应鼠标的其他事件。如果不在panel之外点一下,在panel上不管怎么点都没有。不知道是什么原因。望给位前辈给以指点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不太明白楼主的意思,鼠标事件是Panel的,还是窗体的?如果是窗体的,当然不会在panel上响应。除非你把Panel也加上事件。或者是,所谓的其他事件,是否如滚轮事件?那就需要你欲响应事件的控件取得焦点,具体怎么处理,大概就是想办法让它取得焦点吧。 这是小弟的第一个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); } }} 昏~~1、panel1.MouseClick += DataChange这一句放在OnClick里当然得点一下主窗体才会为panel1绑定Click事件了,把这一句放到Form1_Load里去!或是在panel1的事件列表里选择MouseClick事件把DataChange复制进去回车使之在初始化的时候就绑定事件。2、this.AutoScroll = true——有这一句主窗体就会在恰当的时候出现滚动条,如果不想让主窗体出现滚动条就把这句去掉。 多谢5楼解答。第一个问题已完全解决,谢谢!第二问题。我希望窗体的横向滚动条在适当的时候出现,纵向滚动条永远不出现(纵向滚动条由panel2来实现)。如果把this.AutoScroll = true去掉,横向滚动条就没有了。我试了this.vscroll=false,但不起作用。望前辈继续给以指点,如果实现窗体只有横向滚动条,而没有纵向滚动条。 设置AutoScroll为true之后,在Form1_Load里加上这两句:this.HScroll = true;this.VScroll = false;这样就行了,两个都要,缺一不可。 回7楼:根据你的建议我在设置AutoScroll为true之后加了this.HScroll = true; this.VScroll = false; 但是结果还是一样。纵向滚动条仍然存在,纵向和横向滚动条好像完全受控于AutoScroll。请问你用该办法调试过吗?是不是我还有其他地方没有设置啊?另外请教一下各位前辈,我4楼的代码是不是有明显的不妥之处啊?显示延时很明显。我的应用当中还要加很多显示,加了以后拖动纵向滚动条显示延时就更明显了。有没有什么办法解决啊? this.HScroll = true;this.VScroll = false;这个我是加在Form的Load事件里的,测试过了没问题。无论你是在设计器里设置AutoScroll为true还是在这两句代码之前或之后手动设置为true效果都一样。你检查一下是不是加错地方了。4楼的代码我没仔细分析,太长了,懒得分析是什么思路,想实现什么效果。你想实现的是什么效果,描述一下你程序的思路。如果是画个什么东西觉得闪得厉害延时严重的可以试试双缓冲。 panel是一个容器,就一个范围,用其他控件响应吧 多谢10楼前辈指点,我把那两句放在Form的Load里面还是不起作用,我用的是VS2005,你用是2008吗?我想实现的是类似EXCEL的表格。拖动纵向滚动条时,要求最上面一行标题(在EXCEL中以A、B、C来表示)保持原位不动;拖动横向滚动条时,要求最上面一行标题跟着表格内容一起动。表格的行号滚动效果最好也能如EXCEL一样。表格内容共有22列,行数不确定。其中18列是全黑或全白的方格,鼠标点一下由白变黑;另外4列是数字,要求可以改动。请问如何实现最佳?关键滚动条,不知道如何实现滚动。 依然十分感谢你的解答。由于现在的问题与标题大相径庭,先结贴另开。http://topic.csdn.net/u/20080808/10/048b87dc-086b-4f85-86c2-3355dc275221.html c#转换c++的一个结构体问题 前端显示 c#在自定义类的给窗体控件赋值问题 创建用户控件失败 .NET ReportView中的MSChart折线图如何绑定不定数量的折线数据? 关于报文接收的问题 关于深拷贝和浅拷贝的深入问题?!! 有没有高手知道如何能实现像office那样,点击帮助后在窗体的右侧打开帮助文档 请问各位,如何编写QQ登录程序?望给出代码~ 懂VB的兄弟帮帮忙 看看这条语句用C#怎么写? 急!历史曲线放大功能的问题!搞了好久还是不理想 如何实现带链接listbox
或者是,所谓的其他事件,是否如滚轮事件?那就需要你欲响应事件的控件取得焦点,具体怎么处理,大概就是想办法让它取得焦点吧。
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);
}
}
}
1、panel1.MouseClick += DataChange这一句放在OnClick里当然得点一下主窗体才会为panel1绑定Click事件了,把这一句放到Form1_Load里去!或是在panel1的事件列表里选择MouseClick事件把DataChange复制进去回车使之在初始化的时候就绑定事件。2、this.AutoScroll = true——有这一句主窗体就会在恰当的时候出现滚动条,如果不想让主窗体出现滚动条就把这句去掉。
第一个问题已完全解决,谢谢!
第二问题。我希望窗体的横向滚动条在适当的时候出现,纵向滚动条永远不出现(纵向滚动条由panel2来实现)。如果把this.AutoScroll = true去掉,横向滚动条就没有了。我试了this.vscroll=false,但不起作用。
望前辈继续给以指点,如果实现窗体只有横向滚动条,而没有纵向滚动条。
this.HScroll = true;
this.VScroll = false;
这样就行了,两个都要,缺一不可。
另外请教一下各位前辈,我4楼的代码是不是有明显的不妥之处啊?显示延时很明显。我的应用当中还要加很多显示,加了以后拖动纵向滚动条显示延时就更明显了。有没有什么办法解决啊?
this.VScroll = false;
这个我是加在Form的Load事件里的,测试过了没问题。无论你是在设计器里设置AutoScroll为true还是在这两句代码之前或之后手动设置为true效果都一样。你检查一下是不是加错地方了。4楼的代码我没仔细分析,太长了,懒得分析是什么思路,想实现什么效果。你想实现的是什么效果,描述一下你程序的思路。如果是画个什么东西觉得闪得厉害延时严重的可以试试双缓冲。
拖动横向滚动条时,要求最上面一行标题跟着表格内容一起动。表格的行号滚动效果最好也能如EXCEL一样。表格内容共有22列,行数不确定。其中18列是全黑或全白的方格,鼠标点一下由白变黑;另外4列是数字,要求可以改动。请问如何实现最佳?关键滚动条,不知道如何实现滚动。
http://topic.csdn.net/u/20080808/10/048b87dc-086b-4f85-86c2-3355dc275221.html