ITPub博客

首页 > Linux操作系统 > Linux操作系统 > winform之手绘矩形及光标字符串与光标关联显示

winform之手绘矩形及光标字符串与光标关联显示

原创 Linux操作系统 作者:wisdomone1 时间:2012-07-16 14:04:43 0 删除 编辑
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb qq: 305076427 微博: wisdomone9

注册时间:2008-04-04

  • 博文量
    2164
  • 访问量
    11694067