★33°空間‰


                                 ----★七彩服飾  【最潮拜☆日單精品】【Esprit】【Hotwind】滿150包郵-女裝-流行女裝    www.7color.hb.cn

                                 ----智力比知識重要,素質(zhì)比智力重要,覺悟比素質(zhì)更重要
          posts - 110,comments - 35,trackbacks - 0
          所謂“可拖動窗體”就是無需拖動標(biāo)題欄就可以拖動的窗體,這在一個沒有標(biāo)題欄的窗體上是一種非常有用的技術(shù)。關(guān)于這一方面的技巧,網(wǎng)上已經(jīng)有很多介紹,但都不是很詳盡,有些實(shí)現(xiàn)也不夠簡潔。最主要的,這些介紹大多是大片大片的源代碼,很少講解;初學(xué)者學(xué)期來恐怕要費(fèi)些力氣(我在學(xué)習(xí)這個技巧的時候就很痛苦)。在這里,我對這個技巧進(jìn)行了一個詳細(xì)的講解,相信各位初學(xué)者朋友可以學(xué)會如何制作可拖動窗體。

          ??? (注:本文期望的讀者是那些有一定用C#開發(fā)Windows程序基礎(chǔ)但暫時還不會制作可拖動窗體的朋友。)

          ??? 首先,我們來復(fù)習(xí)一下一個Windows窗體的組成。請看這張圖:


          圖1? Windows窗體構(gòu)成

          點(diǎn)擊查看原圖


          ??? 這是一個形式化的標(biāo)準(zhǔn)Windows窗體。首先,窗體的頂部是一個標(biāo)題欄,其余的部分是窗體的主體,包圍在窗體主體外圍的是一個邊框,邊框內(nèi)不就是我們放置控件或繪制圖形的用戶區(qū)。

          ??? 圖中還標(biāo)明了各種窗體構(gòu)造元素的尺寸的獲得方法。對于用戶區(qū),System.Windows.Forms.Form提供了實(shí)例屬性ClientSize,相信大家已經(jīng)很熟悉了。而要想活棋一般性的窗體構(gòu)造元素(如標(biāo)題欄、邊框等)的尺寸,我們可以使用.NET類庫中提供的一個類:System.Windows.Forms.SystemInformation,這個類提供了一些靜態(tài)屬性如表示標(biāo)題欄高度的CaptionHeight。有關(guān)SystemInformation類的信息可以在.NET SDK文檔目錄“ .NET Framework SDK -> 參考 -> 類庫 -> System.Windows.Forms -> SystemInformation 類 ”處找到(注:這里的超鏈接只在您安裝了.NET Framework 1.1簡體中文版并且安裝了配套文檔時才有效)。這是一個很有用的類,希望大家能夠記住它(可能您早就知道了,可我是才知道的-_-汗~~)。

          ??? 接下來,我們來看看如何在在用戶區(qū)拖動鼠標(biāo)時移動窗體。請看下面這張圖:


          圖2? 窗體的移動

          點(diǎn)擊查看原圖


          ??? 我們來觀察鼠標(biāo)在窗體內(nèi)的位置和窗體的移動,很容易可以發(fā)現(xiàn):在窗體被拖動的過程中,鼠標(biāo)在窗體內(nèi)的相對位置是始終不變的!那么,我們只要檢測到鼠標(biāo)在屏幕中的移動并修改窗體的位置就可以達(dá)到拖動窗體的目的!

          ??? 我們知道,在鼠標(biāo)消息/事件處理中,只能得到鼠標(biāo)相對于窗體的位置。那么,如何知道鼠標(biāo)在屏幕中的位置呢?這里又要提到一個類:System.Windows.Forms.Control類。也許你會很吃驚:這不是所有控件的基類么?呵呵~是這樣di。不過,盡管是這樣,Control類卻沒有像其他廣泛使用的基類那樣被聲明為抽象類,而且它提供了一個靜態(tài)屬性:MousePosition,通過這個屬性可以得到鼠標(biāo)相對于屏幕的位置。有關(guān)Control類的信息可以在.NET Framework文檔目錄“ .NET Framework SDK -> 參考 -> 類庫 -> System.Windows.Forms -> Control 類 ”處找到(注:這里的超鏈接只在您安裝了.NET Framework 1.1簡體中文版并且安裝了配套文檔時才有效)。

          ??? 知道了如何獲取這些信息之后,制作移動窗體實(shí)際上就成了一個很簡單的問題了?;具^程是這樣的:首先,在鼠標(biāo)(左鍵或一個你喜歡的鍵)按下時,記錄鼠標(biāo)位置;由于在移動的過程中,鼠標(biāo)的屏幕坐標(biāo)發(fā)生變化但窗體相對坐標(biāo)不變,我們可以推算出窗體位置的變化為(假設(shè)mousePosition具有System.Drawing.Point類型,表示鼠標(biāo)在窗體中的相對坐標(biāo)):

          // 示例代碼1
          Form.Top = Control.MousePosition.Y - mousePosition.Y;
          Form.Left = Control.MousePosition.X - mousePosition.X;

          ??? 這樣還不行,因為我們的mousePosition表示的是鼠標(biāo)在窗體用戶區(qū)內(nèi)的相對坐標(biāo),但在移動窗體的時候還要考慮窗體標(biāo)題欄和邊框的尺寸。在上面的基礎(chǔ)上,我們將代碼修正為:

          // 示例代碼2
          Form.Top = Control.MousePosition.Y - mousePosition.Y
          ?????????? - SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;
          Form.Left = Control.MousePosition.Y - mousePosition.Y
          ??????????? - SystemInformation.FrameBorderSize.Width;

          ??? 也就是說,在高度上(縱坐標(biāo))要減去標(biāo)題欄的高度和邊框的高度,而在寬度上(橫坐標(biāo))要減去邊框的寬度。然而,當(dāng)制作一個既沒有標(biāo)題欄也沒有邊框的可拖動窗體時,使用“示例代碼1”所示的代碼就可以了。

          ??? 上面的代碼只是一個示范性代碼。具體的操作如下:

          ??? 首先,為窗體添加一個私有域:

          private System.Drawing.Point mousePoint;

          ??? 然后,為窗體添加鼠標(biāo)按下事件處理方法(我這里是MainForm_MouseDown,別忘了將該方法鏈接到MainForm.MouseDown事件,這不用多說了吧?):

          private void MainForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
          ??? if(e.Button == MouseButtons.Left) {
          ??????? this.mousePosition.X = e.X;
          ??????? this.mousePosition.Y = e.Y;
          ??? }
          }

          ??? 在這里注意對鼠標(biāo)按鍵進(jìn)行篩選。

          ??? 接下來,為窗體添加鼠標(biāo)移動事件處理方法(我這里是MainForm_MouseMove):

          private void MainForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
          ??? if(e.Button == MouseButtons.Left) {
          ??????? Form.Top = Control.MousePosition.Y - mousePosition.Y
          ?????????????????? - SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;
          ??????? Form.Left = Control.MousePosition.Y - mousePosition.Y
          ??????????????????? - SystemInformation.FrameBorderSize.Width;
          ??? }
          }

          ??? 這里,如果窗體沒有標(biāo)題欄,可以去掉“-SystemInformation.CaptionHeight”;如果窗體沒有邊框,還可以去掉“-SystemInformation.FrameBorderSize.Height”和“-SystemInformation.FrameBorderSize.Width”。

          ??? 現(xiàn)在,您是不是已經(jīng)很清楚地明白如何用C#制作可拖動窗口了?祝賀您!最后,送您一個小禮物—— 桌面時鐘 。很簡潔、很有意思哦~~~

          ??? 另外贈送小技巧三則:

          • 如何制作不規(guī)則窗體

          ??? 這個技巧我掌握的還不是很豐富,現(xiàn)在介紹一種最簡單的方法——通過設(shè)置窗體的Region屬性。首先,聲明一個System.Drawing.Drawing2D.GraphicsPath變量,在這個變量中添加您期望作為窗體輪廓的形狀組合;之后,從這個變量生成一個System.Drawing.Region實(shí)例,并賦給窗體的Region屬性即可。如:

          GraphicsPath gp = new GraphicsPath();
          gp.AddEllipse(0, 0, 120, 120);
          Region r = new Region(gp);
          this.Region = r;

          ??? 將上述代碼添加到窗體的構(gòu)造函數(shù)中,我們就能夠得到一個自定義的窗體了,這個窗體是一個直徑為120像素的圓形(也是我的時鐘的外觀哦)。

          • 如何生成沒有邊框的窗體

          ??? 將窗體的FormBorderStyle設(shè)置為None即可。這很簡單事么?那么

          • 如何生成有邊框但沒有標(biāo)題欄的窗體

          ??? 首先將窗體的ControlBox屬性設(shè)置為false,也就是不要控制按鈕(窗體圖標(biāo)、最大最小化按鈕和關(guān)閉按鈕)。按說這時就不應(yīng)該有標(biāo)題欄了,但我們還能看到它很煩人地待在那里,因此,我們要把窗體的Text屬性設(shè)置為空(注意是String.Empty,而不是null)。

          posted on 2006-09-20 11:39 圣域飛俠 閱讀(275) 評論(0)  編輯  收藏 所屬分類: C#文章
          主站蜘蛛池模板: 华阴市| 林口县| 门头沟区| 巴青县| 台东市| 咸丰县| 闽清县| 富宁县| 台中市| 开江县| 怀柔区| 镇赉县| 潍坊市| 商河县| 阜阳市| 兴国县| 榆树市| 诸城市| 嵊泗县| 朝阳市| 黄骅市| 江城| 温泉县| 鄂温| 陆丰市| 乌海市| 台南县| 望江县| 嘉义县| 临海市| 措美县| 沭阳县| 平塘县| 大埔县| 两当县| 桦川县| 崇州市| 巴里| 寿宁县| 荣昌县| 长阳|