class keytest:Form
{
private Label lbl1;
//在窗体画多个矩形,每个矩形填充光标的不同形状
//光标移动到指定的代表光标不同形状的矩形时,显示对应的光标形状
//分析:要绘画多个矩形,且这些矩形之间有关系,什么关系
// 多少个光标状态就对应多少个矩形
// 绘画是个动态的过程,我想涉及到鼠标移动事件,此事件要记录,目前在哪个矩形中
// 即然要绘制矩形与对应的光标形状,用到二者对应的数组吧,一是光标形状对象数组,二是光标形状的名称数组;这个我想用于判断了
// 你想啊,判断什么,因为是动态的,你当时在移动鼠标时,落在哪个光标矩形,要显示对应的光标形状
// 这些矩形要画多少个解决了,但他们怎么画,我的意思是矩形之间如何排列,这个的逻辑关系?没太理清,要何确认
//此处为了弄明逻辑即可,就不写所有的光标对象形状了,仅列4个
private Cursor[] cursorcollection ={ Cursors.AppStarting,Cursors.Arrow,Cursors.Cross,Cursors.Default};
private string[] cursorstr ={ "AppStarting", "Arrow", "Cross", "Default" };
public keytest()
{
Graphics gp = CreateGraphics();
Text = "手绘矩形与光标对象";
}
static void Main()
{
Application.Run(new keytest());
}
//onmouseenter仅是一个瞬间的动作,马上结束
protected override void OnMouseEnter(EventArgs e)
{
}
//鼠标停留事件
protected override void OnMouseHover(EventArgs e)
{
// Cursor.Current = Cursors.Cross;
}
//鼠标称动时,确认当前在哪个矩形中,作实际工作
// 矩形图例,为了图示确认矩形坐标,我想这是个动态的过程,4个光标对象故有4个矩形吧,且我想固化到整个窗体工作区,也即每个矩形为1/4大小的工作区
// ----------
// | | |
// __________
// | | |
// __________
//画出以上矩形后,画矩形的工作就在初始构造函数进行吧,显示对应光标在鼠标移动中实现吧
//rectangle.fromltrb(左上角x坐标,左上角y坐标,右下角x坐标,右下角y坐标;进一步分析如下:
//在此我们是4个矩形,故每个矩形的宽度高度皆是clientsize/2,对吧;
//所以首个矩形坐标 (0, 0, 0+clientsize.x/2, 0+clientsize.y/2)
// 第二个矩形坐标(0+clientsize.x/2, 0, 0+client.x, 0+client.y/2)
// 第三个 (0, 0+clientsize.y/2, clientsize.x/2, clientsize.y)
// 第四个 (clientsize.x/2, clientsize.y/2, clientsize.x, clientsize.y)
//继续分析:以上坐标是我图化判断出来的,要找到坐标的规则,要用循环,在此我们是2行2列,故如下代码
// for(int i=0;i<2;i++)
// for(int i=0;j<2;j++) //代码是先处理内循环,然后再处理完大循环,故先是第一行的两个矩形,而后第二行的两个矩形
// Rectangle.FromLTRB(i*(client.x)/2,j*(clientsize.y)/2,(i+1)*client.x/2,(j+1)*(clientsize.y)/2);
protected override void OnMouseMove(MouseEventArgs e)
{
int x = Math.Max(0, Math.Min(1,e.X/(ClientSize.Width/2)));
int y = Math.Max(0, Math.Min(1, e.Y / (ClientSize.Height/ 2)));
Cursor.Current=cursorcollection[4*x+y];
}
protected override void OnPaint(PaintEventArgs e)
{
StringFormat sf=new StringFormat();
sf.Alignment=StringAlignment.Center;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) //代码是先处理内循环,然后再处理完大循环,故先是第一行的两个矩形,而后第二行的两个矩形
{
Rectangle rect = Rectangle.FromLTRB(i * (ClientSize.Width) / 2, j * (ClientSize.Height) / 2, (i + 1) * (ClientSize.Height) / 2, (j + 1) * ClientSize.Width / 2);
e.Graphics.DrawRectangle(new Pen(Color.Yellow), rect);
e.Graphics.DrawString(cursorstr[i+j],Font,new SolidBrush(ForeColor),rect,sf);//光标文字,共四个,这还要与上述的双for循环建立联系,不能就i,应是i与j的组合,结果是0,1,2,3 与(0,0),(0,1) (1,0) (1,1)
}
}
}
小结:自己的逻辑能力不足,要补习下.不然编程难以提升.
最其码达到温饱的水平
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-735602/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-735602/