<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Mono Winforms 中的拖放 > 原文: [http://zetcode.com/gui/csharpwinforms/dragdrop/](http://zetcode.com/gui/csharpwinforms/dragdrop/) Mono Winforms 教程的這一部分將專門用于拖放操作。 在計算機圖形用戶界面中,拖放是單擊虛擬對象并將其拖動到其他位置或另一個虛擬對象上的動作(或支持以下動作)。 通常,它可用于調用多種動作,或在兩個抽象對象之間創建各種類型的關聯。 (維基百科) 拖放功能是圖形用戶界面最明顯的方面之一。 拖放操作使您可以直觀地完成復雜的事情。 ## 拖動按鈕 在第一個示例中,我們將在按鈕控件上執行拖放操作。 該示例在拖放&放置協議之外執行作業。 `dragbutton.cs` ```cs using System; using System.Drawing; using System.Windows.Forms; public class MForm : Form { private bool isDragging = false; private int oldX, oldY; private Button button; public MForm() { Text = "Drag & drop button"; Size = new Size(270, 180); button = new Button(); button.Parent = this; button.Cursor = Cursors.Hand; button.Text = "Button"; button.Location = new Point(20, 20); button.MouseDown += new MouseEventHandler(OnMouseDown); button.MouseUp += new MouseEventHandler(OnMouseUp); button.MouseMove += new MouseEventHandler(OnMouseMove); CenterToScreen(); } public static void Main() { Application.Run(new MForm()); } private void OnMouseDown(object sender, MouseEventArgs e) { isDragging = true; oldX = e.X; oldY = e.Y; } private void OnMouseMove(object sender, MouseEventArgs e) { if (isDragging) { button.Top = button.Top + (e.Y - oldY); button.Left = button.Left + (e.X - oldX); } } private void OnMouseUp(object sender, MouseEventArgs e) { isDragging = false; } } ``` 該代碼示例將一個常規按鈕控件放在表單容器上。 通過單擊按鈕表面并同時用鼠標拖動它,我們可以重新放置按鈕。 ```cs private bool isDragging = false; private int oldX, oldY; ``` 這些是我們示例的支持變量。 `isDragging`變量告訴我們是否正在拖動對象。 `oldX`和`oldY`變量在拖動過程開始之前存儲 x,y 坐標。 ```cs button.MouseDown += new MouseEventHandler(OnMouseDown); button.MouseUp += new MouseEventHandler(OnMouseUp); button.MouseMove += new MouseEventHandler(OnMouseMove); ``` 我們為按鈕插入了三種不同的鼠標處理器。 它們實現了拖放過程的三個不同階段。 當我們單擊按鈕時,過程開始。 這由`OnMouseDown()`方法處理。 第二部分是機芯。 這是當我們將對象移動到新位置時。 它以`OnMouseMove()`方法處理。 最后一部分是過程停止的時間。 當我們釋放鼠標按鈕時會發生這種情況。 適當的任務委托給`OnMouseUp()`方法。 ```cs private void OnMouseDown(object sender, MouseEventArgs e) { isDragging = true; oldX = e.X; oldY = e.Y; } ``` `OnMouseDown()`方法實現了過程的第一部分。 它設置了三個必要的變量。 ```cs private void OnMouseMove(object sender, MouseEventArgs e) { if (isDragging) { button.Top = button.Top + (e.Y - oldY); button.Left = button.Left + (e.X - oldX); } } ``` 在`OnMouseMove()`方法中,我們重新定位按鈕。 我們計算存儲的 x,y 坐標與鼠標指針的新坐標之間的差。 差異將添加到按鈕的`Top`和`Left`屬性中,從而將其移動到新位置。 ![Dragging a button](https://img.kancloud.cn/89/45/8945535f7cdb88680bc363de7d4b01e4_270x181.jpg) 圖:拖動按鈕 ## 拖動文字 在前面的示例中,我們確實拖放了控件。 接下來,我們將對文本數據進行拖放操作。 在這里,我們將使用 Winforms 庫提供的拖放協議。 拖放操作是 Winforms 中的標準通信協議。 我們有兩個基本對象。 拖動源和放置目標。 `dragtext.cs` ```cs using System; using System.Drawing; using System.Windows.Forms; public class MForm : Form { private TextBox textBox; private Button button; public MForm() { InitForm(); CenterToScreen(); } private void OnMouseDown(object sender, MouseEventArgs e) { TextBox txt = (TextBox) sender; txt.DoDragDrop(txt.Text, DragDropEffects.Copy); } private void OnDragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Copy; } private void OnDragDrop(object sender, DragEventArgs e) { Button button = (Button) sender; button.Text = (string) e.Data.GetData(DataFormats.Text); } private void InitForm() { Text = "Drag & drop"; button = new Button(); textBox = new TextBox(); SuspendLayout(); button.AllowDrop = true; button.Location = new Point(150, 50); textBox.Location = new Point(15, 50); button.DragDrop += new DragEventHandler(OnDragDrop); button.DragEnter += new DragEventHandler(OnDragEnter); textBox.MouseDown += new MouseEventHandler(OnMouseDown); ClientSize = new Size(250, 200); Controls.Add(button); Controls.Add(textBox); ResumeLayout(); } public static void Main(string[] args) { Application.Run(new MForm()); } } ``` 我們在表單上有兩個控件。 一個按鈕和一個文本框。 我們將文本從文本框中拖放到按鈕上。 ```cs InitForm(); ``` 表單的設置委托給`InitForm()`方法。 這通常在較大的應用中完成。 ```cs SuspendLayout(); ... ResumeLayout(); ``` 我們在這兩個方法調用之間布置控件。 這是一個優化。 它應該消除閃爍。 ```cs button.AllowDrop = true; ``` 我們將`AllowDrop`屬性設置為`true`。 默認情況下不啟用刪除。 ```cs button.DragDrop += new DragEventHandler(OnDragDrop); button.DragEnter += new DragEventHandler(OnDragEnter); textBox.MouseDown += new MouseEventHandler(OnMouseDown); ``` 同樣,拖放過程分為三個步驟。 對于每個特定步驟,我們有三種方法。 ```cs private void OnMouseDown(object sender, MouseEventArgs e) { TextBox txt = (TextBox) sender; txt.DoDragDrop(txt.Text, DragDropEffects.Copy); } ``` 在`OnMouseDown()`方法中,我們初始化了拖放過程。 我們使用`DoDragDrop()`方法啟動該過程。 `DragDropEffects.Copy`參數指定操作的類型。 實質上,我們可以在拖放操作期間復制文本或移動文本。 ```cs private void OnDragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Copy; } ``` 當鼠標指針進入放置目標控件的區域時,將啟動`DragEnter`事件。 必須設置`Effect`屬性。 拖動源和放置目標的`DragDropEffects`必須相等。 否則,該操作將無法進行。 ```cs private void OnDragDrop(object sender, DragEventArgs e) { Button button = (Button) sender; button.Text = (string) e.Data.GetData(DataFormats.Text); } ``` 最后,我們有`OnDragDrop()`方法。 在這里,我們從事件對象獲取數據并將其設置為按鈕`Text`屬性。 ![Drag & drop of text](https://img.kancloud.cn/f8/29/f82926d05d95f49995adf32d2c1f11c2_258x228.jpg) 圖:文本拖放 ## 拖動圖像 在最后一個示例中,我們將拖放圖像拖到窗體上。 `dragimage.cs` ```cs using System; using System.Drawing; using System.Windows.Forms; public class ImageDragDrop : Form { private bool isDragging; private int oldX, oldY; private Rectangle dropRect; private PictureBox picBox; private Bitmap image; private Brush brush; public ImageDragDrop() { ClientSize = new Size(350, 250); Text = "Dragging Image"; Paint += new PaintEventHandler(OnPaint); isDragging = false; dropRect = new Rectangle(10, 10, 200, 160); brush = Brushes.Gray; picBox = new PictureBox(); loadImage(); picBox.Parent = this; picBox.Location = new Point(100, 50); picBox.Size = new Size(image.Width, image.Height); picBox.Image = image; picBox.Cursor = Cursors.Hand; picBox.MouseDown += new MouseEventHandler(OnMouseDown); picBox.MouseUp += new MouseEventHandler(OnMouseUp); picBox.MouseMove += new MouseEventHandler(OnMouseMove); CenterToScreen(); } void loadImage() { try { image = new Bitmap("image.jpg"); } catch { Console.WriteLine("Error reading image"); Environment.Exit(1); } } public static void Main() { Application.Run(new ImageDragDrop()); } private void OnMouseDown(object sender, MouseEventArgs e) { isDragging = true; oldX = e.X; oldY = e.Y; } private void OnMouseMove(object sender, MouseEventArgs e) { if (isDragging) { picBox.Top = picBox.Top + (e.Y - oldY); picBox.Left = picBox.Left + (e.X - oldX); } } private void OnMouseUp(object sender, MouseEventArgs e) { isDragging = false; if(dropRect.Contains(picBox.Bounds)) { brush = Brushes.Gold; } else { brush = Brushes.Gray; } Refresh(); } private void OnPaint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.FillRectangle(brush, dropRect); } } ``` 在我們的示例中,我們有一個`PictureBox`,并繪制了一個灰色矩形。 如果將圖片放在矩形內,則矩形的顏色變為金色。 ```cs brush = Brushes.Gray; ``` `brush`變量保存矩形的筆刷。 默認情況下為灰色。 ```cs void loadImage() { try { image = new Bitmap("image.jpg"); } catch { Console.WriteLine("Error reading image"); Environment.Exit(1); } } ``` `loadImage()`加載`PictureBox`控件的位圖。 ```cs if (dropRect.Contains(picBox.Bounds)) { brush = Brushes.Gold; } else { brush = Brushes.Gray; } ``` 在`OnMouseUp()`方法中,我們確定矩形的筆刷。 如果圖片框的邊界在矩形內,則畫筆為金色;否則,畫筆為金色。 否則為灰色。 ```cs Refresh(); ``` 我們必須調用`Refresh()`方法來激活新的畫筆顏色。 本章專門使用 Mono Winforms 庫拖放操作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看