1. 程式人生 > >c++builder如何通過滑鼠拖動改變無邊框窗體的大小(bsnone)

c++builder如何通過滑鼠拖動改變無邊框窗體的大小(bsnone)

在C++Builder中,將Form的BorderStyle設為bsNone以後該窗體將沒有邊框,不能改變窗體大小,也不能拖動窗體。那麼如何拖動及用滑鼠改變無邊框窗體大小呢?拖動無邊框窗體的解決方法很多,例如:
1. 向窗體傳送WM_NCLBUTTONDOWN訊息,LParam = HTCAPTION
2. 向窗體傳送WM_SYSCOMMAND訊息,LParam = SC_MOVE | HTCAPTION;
3. 截獲WM_NCHITTEST訊息,返回HTCAPTION讓系統認為滑鼠正在標題欄上
等等。更改窗體大小可以用API:SetWindowPos,那麼用拖動滑鼠來改變無邊框窗體大小呢?答案還是WM_NCHITTEST。


在Windows系統中所有滑鼠訊息都要靠WM_NCHITTEST來建立,任何滑鼠動作都會觸發WM_NCHITTEST,觸發次數和滑鼠驅動程式每秒鐘派發多少訊息有關。以下程式碼是在程式中截獲WM_NCHITTEST,ccrun(老妖)用C++Builder的方法實現的,通過過載WndProc來截獲窗體訊息,當然,還可以通過訊息對映或接管WindowProc等來實現。另外特別說明的是:麻煩抄襲本站文章不愛留名的人不要搞錯了,這不是純C++的方法,請不要在抄襲的文章中用類似“C++中如何拖動無邊框視窗”這樣的標題來誤導別人。類似的事情發生的太多了,順便BS一下天極網抄襲不但不留原作者名字還篡改作者名字以及程式碼中的版權註釋。

本程式碼應用在Delphi中的話,將語法略改變一下就可以了。

在單元檔案的.h檔案中加入:

private:    // User declarations
void__fastcall WndProc(TMessage &Msg);

在單元檔案的.cpp檔案中加入:
// 過載窗體的WndProc實現截獲窗體訊息
void__fastcall TForm1::WndProc(TMessage &Msg)
{
switch(Msg.Msg)
    {
case WM_NCHITTEST: //
    {
// 分解當前滑鼠的座標
int nPosX = LOWORD(Msg.LParam); 
int nPosY = HIWORD(Msg.LParam);

if(nPosX >= Left + Width - 2 && nPosY >= Top + Height - 2)
        {
// 滑鼠位置在窗體的右下角附近
            Msg.Result = HTBOTTOMRIGHT;
return;
        }        
elseif(nPosX >= Left + Width -2)
        {
// 滑鼠位置在窗體右側
            Msg.Result = HTRIGHT;
return;
        }
elseif(nPosY >= Top + Height - 2)
        {
// 滑鼠位置在窗體下方
// 本文轉自 C++Builder研究 - http://www.ccrun.com/article.asp?i=990&d=70jx1b
            Msg.Result = HTBOTTOM;
return;
        }
// 以上只判斷滑鼠位置是否在右側,右下角,下方,所以僅僅當滑鼠指標在這三個位置時才會改變成改變大小的形狀,拖動後可改變大小。
break;
    }
default:
break;
    }
    TForm::WndProc(Msg);
}
效果如圖,為了方便大家看的清楚一些,ccrun(老妖)在窗體上放了一個Align=alClient的TShape,邊框黑色,背景灰色。

相關推薦

c++builder如何通過滑鼠改變邊框窗體大小bsnone

在C++Builder中,將Form的BorderStyle設為bsNone以後該窗體將沒有邊框,不能改變窗體大小,也不能拖動窗體。那麼如何拖動及用滑鼠改變無邊框窗體大小呢?拖動無邊框窗體的解決方法很多,例如:1. 向窗體傳送WM_NCLBUTTONDOWN訊息,LParam = HTCAPTION2. 向窗

在執行時通過滑鼠移動控制元件位置(c#)

前些日子因為工作需要想了解有關於在C#下實現執行時滑鼠移動控制元件的方法,Google了一下還真找到了一個帖子,粗略看去程式碼還真不少,感覺有點複雜的樣子,因為當時手頭上還有點別的事情,沒來得及細看,就把帖子轉到了自己的blog裡面收藏。週末晚上沒事,抽時間看了一下程式,發現

C# WPF實現滑鼠的程式碼片

C# WPF實現滑鼠拖動的程式碼片 ///可表示實時拖動 void xxx_PreviewMouseLeftButtonUp(System.Object sender, System.Windows.Input.MouseButtonEventArgs e) { IsMous

c# 實現用滑鼠沒有標題欄的視窗(窗體的任何部分都可實現效果)

上面形式的窗體,實現窗體的任何部分都可實現拖動 首先需要引入非託管程式碼,直接呼叫windows api         public const int WM_NCLBUTTONDOWN = 0xA1;         public const int HT_CAPT

C# WinForm 改變邊框窗體尺寸

c# 透明winform上建立了自定義邊框後,需要拖動自定義邊框達到改變窗體尺寸的效果。使用了很多方法發現有些程式碼只能橫向拉伸,有些程式碼會造成無法拖動。 最後才找到這個切實可行的辦法。 const int Guying_HTLEFT = 10;

C# WinForm開發系列之自定義邊框窗體(最大化,最小化,關閉,拉伸和移動的相關知識)

        ////重寫系統WndProc函式,使無邊框窗體可移動         protected override void WndProc(ref Message m)         {             switch (m.Msg)             {              

RecyclerView /滑動多選的實現2

方案三: AndroidDragSelect 前文說到,方案三就是分析了方案一的缺點之後,給出了自己的基於 OnItemTouchListener 的實現方案,耦合度低,可以很容易整合進現有的專案當中。 從自定義 RecyclerView 的方案中可以看到,

C#窗體屬性FormBordeStyle設定為none後,通過程式碼實現窗體滑鼠功能

備註:使用的是visual studio2013版本 1、新建C#窗體應用程式,初始化的程式預設FormBordeStyle屬性為Sizable,修改屬性FormBordeStyle為none (1)修改前 (2)修改後 2、F5除錯程式後,此時窗體沒有邊框、

C#Winform實現邊框窗體滑鼠

在有時候我們為了實現軟體的美觀,我們需要把窗體的邊框隱藏,但是問題也會隨之而來,在屬性中設定了FormBorderStyle應該為None,邊框便可以隱藏,但是我們在使用軟體時卻無法拖動窗體,

C# 鼠標點擊移動窗體代碼,可以實現邊框窗體

點擊 obj cat += tar sender see sed false private static bool IsDrag = false; private int enterX; private int enterY;

WPF邊框視窗滑鼠縮放大小

通常,我們會 通過AllowsTransparency=”True”、 WindowStyle=”None” 這兩個屬性將wpf視窗的邊框去掉,由於邊框沒了,我們就不能通過滑鼠指標懸停在某一邊上拖動改變視窗的大小,此時若要能調整視窗大小,官方倒也提供了個屬性:R

c# WPF 中圖片縮放功能,滑鼠位置

<Window x:Class="LJDX.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://sc

邊框對話方塊改變大小的實現總結

UINT CTestDlg::OnNcHitTest( CPoint point ) { CPoint ptCur; CRect rect; GetCursorPos( &ptCur ); GetWindowRect( &rect ); if( CRect(rect.left, rect.

C# winfrom縮放圖片並且可以滑鼠

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text

Android:圖片中疊加文字,支持改變位置

ear nal format wrap trace ast 分享 gravity ica 之所以做了這麽一個Demo,是由於近期項目中有一個奇葩的需求:用戶拍攝照片後,分享到微信的同一時候加入備註,想獲取用戶在微信的彈出框輸入的內容。保存在自己的server上。而其實,

pyqt5_控件_自定義邊框窗體

spa 窗體拖動 ica 定義 event sta track gets button from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sy

矩形拽移動,四個角改變大小

http enter pos 變化 tails per posit ems sca 原創是https://blog.csdn.net/liujava621/article/details/30495103,我這裏做了修改,侵權刪。 上幹貨:這裏首先要註意操作四個角的時候,框

QT練手專案二:滑鼠視窗

     對於一個沒有邊框的視窗,滑鼠是無法將它拖動的,於是我們就需要自己重寫滑鼠的點選、移動和釋放事件來跟蹤滑鼠,從而 達到使用滑鼠拖動視窗,這裡我們就簡單的使用一個mainwindow來演示。這個小專案程式碼非常少,適合用來入門QT。 &nb

C++ Builder中實現放功能

在C++ Builder中實現拖放功能 關鍵字:實現拖放功能,DockSite,DragKind,DragMode Windows中的拖放功能大家一定很熟悉了,如檔案的移動,拷貝等操作用滑鼠輕輕一拖即可,在編寫程式中有時也用到拖放,那麼如何實現呢?現以C++ Builder5(簡稱C

WPF 自定義窗體實現邊框改變窗體大小2種方法

方式一:呼叫user32.dllAPI 這種方式在網上有很多,這裡只是按步驟重新建立一次。讀者只需要跟著做就行。 第一步:建立一個WPF專案:WpfResizeWithoutBorder,右鍵專案檔案---->新增----->資源字典,並命名為:WindowsResizeBord