Winform FormBorderStyle設(shè)置為None后移動窗體 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【clearvueentertainment.com - 電腦資料】

   

    Winform. FormBorderStyle設(shè)置為None后移動窗體

    在C# Winform中,系統(tǒng)只帶的窗體樣式,不太好看,往往需要把FormBorderStyle設(shè)置為None,然后自己根據(jù)需求定制窗體的樣式,

Winform FormBorderStyle設(shè)置為None后移動窗體

。

    FormBorderStyle設(shè)置為NoneWinform后移動窗體主要有兩種方法。


第一種:通過鼠標(biāo)事件來模擬

先在窗體中激活三個事件:MouseDown,MouseUp,MouseMove. 然后利用 this.Location,Control.MousePosition,進(jìn)行模擬。

   

<code class="hljs" cs="">private bool flag1 = false;            //標(biāo)記鼠標(biāo)是否按下左鍵private bool flag2 = false;            //標(biāo)記鼠標(biāo)光標(biāo)是否進(jìn)入目的區(qū)域private Point FM, FL;private void Form1_MouseDown(object sender, MouseEventArgs e){    if (e.Button == MouseButtons.Left) //按下鼠標(biāo)左鍵    {        FM = Control.MousePosition;    //取鼠標(biāo)光標(biāo)相對于屏幕左上角的坐標(biāo)。         FL = this.Location;            //窗體左上角相對于屏幕的左上角的坐標(biāo)。        flag1 = true;                         /*            限制鼠標(biāo)光標(biāo)在目的區(qū)域(30,300)里才能讓窗體移動。            去掉if可實(shí)現(xiàn),鼠標(biāo)光標(biāo)在窗體的任何位置點(diǎn)擊都可移動窗體。        */        if ((FM.X - FL.X) <= 300 && (FM.Y - FL.Y) <= 30)        {            flag2 = true;        }    }}private void Form1_MouseUp(object sender, MouseEventArgs e){    // 鼠標(biāo)左鍵彈起時,重置判斷狀態(tài)。    flag1 = false;     flag2 = false;}private void Form1_MouseMove(object sender, MouseEventArgs e){    if (flag1 && flag2)    {        Point pt = Control.MousePosition;        int x = FM.X - pt.X;        int y = FM.Y - pt.Y;        Location = new Point(FL.X - x, FL.Y - y); // 繪制最新位置    }}</code>

第二種:重寫WndProc函數(shù)

當(dāng)重載窗體的 WndProc 方法時,可以截獲 WM_NCHITTEST 消息并改些該消息,

電腦資料

Winform FormBorderStyle設(shè)置為None后移動窗體》(http://clearvueentertainment.com)。 當(dāng)判斷鼠標(biāo)事件發(fā)生在客戶區(qū)時,改寫改消息,發(fā)送 HTCAPTION 給窗體。 這樣,窗體收到的消息就時 HTCAPTION ,在客戶區(qū)通過鼠標(biāo)來拖動窗體就如同通過標(biāo)題欄來拖動一樣。 注意:當(dāng)你重載 WndProc 并改寫鼠標(biāo)事件后,整個窗體的鼠標(biāo)事件也就隨之改變了。

<code class="hljs" cs="">private const int WM_NCHITTEST = 0x84;private const int HTCLIENT = 0x1;private const int HTCAPTION = 0x2;protected override void WndProc(ref Message id){    // 引用消息ID(ref Message ID)    switch (id.Msg)    {        case WM_NCHITTEST:            base.WndProc(ref id);            if ((int)id.Result == HTCLIENT)                id.Result = (IntPtr)HTCAPTION;            return;    }    base.WndProc(ref id);}</code>

總結(jié)

    使用第一種方法可以隨意的設(shè)置,鼠標(biāo)光標(biāo)在那個區(qū)域才可以實(shí)現(xiàn)窗體的移動,不過當(dāng)窗體的控件比較多的時候,窗體移動起來會有明顯的緩慢感覺。

    使用第二種方法,不能設(shè)置目的區(qū)域,鼠標(biāo)光標(biāo)在窗體的任意位置都可以移動,并且改變了整個鼠標(biāo)事件的機(jī)制。

最新文章