winform之手繪矩形及游標字串與游標關聯顯示

wisdomone1發表於2012-07-16
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章