我有一個無標題的視窗,可拖動,可任意調整大小,大家都知道任意拖動是
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Handle, wm_SysCommand, $F012, 0); // 拖動表單移動
end;
下面是任意調整大小的代碼,沒有用那種改變風格的代碼
procedure TForm1.WMNchist(var Msg: TMessage);
const
cOffset = 10;
var
vPoint: TPoint;
MouseX, MouseY: integer;
begin
inherited; //inherited就是呼叫祖先類的函式,如果不帶引數就是默認呼叫同名函式
MouseX := LOWORD(Msg.LParam);//滑鼠X
MouseY := HIWORD(Msg.LParam);//滑鼠Y
vPoint := ScreenToClient(Point(MouseX, MouseY));//螢屏轉客戶坐標
if PtInRect(Rect(0, 0, cOffset, cOffset), vPoint) then
Msg.Result := HTTOPLEFT //在左上角
else if PtInRect(Rect(Width - cOffset, Height - cOffset, Width, Height), vPoint) then
Msg.Result := HTBOTTOMRIGHT //在邊界右下腳
else if PtInRect(Rect(Width - cOffset, 0, Width, cOffset), vPoint) then
Msg.Result := HTTOPRIGHT//在右上角
else if PtInRect(Rect(0, Height - cOffset, cOffset, Height), vPoint) then
Msg.Result := HTBOTTOMLEFT // //在邊界左下腳
else if PtInRect(Rect(cOffset, 0, Width - cOffset, cOffset), vPoint) then
Msg.Result := HTTOP //在上邊界
else if PtInRect(Rect(0, cOffset, cOffset, Height - cOffset), vPoint) then
Msg.Result := HTLEFT//在左邊界
else if PtInRect(Rect(Width - cOffset, cOffset, Width, Height - cOffset), vPoint) then
Msg.Result := HTRIGHT //在右邊界
else if PtInRect(Rect(cOffset, Height - cOffset, Width - cOffset, Height), vPoint) then
Msg.Result := HTBOTTOM;//在一個視窗下面的水平邊界上
end;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
{WM_NCHITTEST訊息說明
該訊息用來描述,當關標移動或當按下或當釋放了滑鼠按扭的時候,
就會發送一個WM_NCHITTEST訊息給一個視窗若滑鼠未被捕獲,
則這條訊息發送給游標所在的視窗。
否則,這條訊息公布給捕獲滑鼠的視窗。
引數
xPos = LOWORD(Lparam);//LParam低位字的值。
指出游標的X坐標。該坐標值是相對于螢屏左上角的坐標。
yPos = HIWORD(LParam);//LParam高位字的值。指出游標的y坐標。
回傳值 DefWindowProc函式的回傳值是下列值之一,以指示游標熱點的位置
:
HTBORDER 游標熱點在一個視窗的邊界上,該視窗不具有可變大小的邊界
HBOTTOM 在一個視窗下面的水平邊界上
HBOTTOMLEFT 在一個視窗的邊界的左下角
HBOTTOMRIGHT 在邊界右下腳
HTCAPTION 在標題欄中
HTCLIENT 在客戶區
HTERROR 在螢屏北京或視窗之間的分界線上(與HTNOWHERE類似,
所不同的是DefWindowProc函式產生一個系統響鈴以指示出錯)
HTGROWBOX 在尺寸框中(與HTSIZE相同)
HTHSCROLL 在水平滾動欄
HTLEFT 在左邊界
HTMENU 在選單中
HTNOWHERE 在螢屏或視窗之間的分界線上
HTREDUCE 在一個最小化的按扭上
HTRIGHT 在視窗右邊界
HTSIZE 在尺寸框中
HTSYSMENU 在一個System選單或在一個子視窗的Close按扭中
HTTOP 在上邊界
HTTOPLEFT 在左上角
HTTOPRIGHT 在右上角
HTTRANSPARENT 在當前被其他視窗覆寫的視窗中
HTVSCROLL 在垂直滾動欄中
HTZOOM 在最大化按扭上
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
以上是在事先建好的視窗上一切正常的,我現在要求是要動態創建的視窗,有這兩個功能,經過試驗
動態視窗.FormMouseDown=Form1.FormMouseDown,就可以移動視窗了,那么問題來了:
WMNchist 這個事件是自定義事件,本身表單自帶的事件是不存的,那么上面代碼中的方法自然不可用,現在抓瞎了,不知道如何讓這個動態視窗去執行上面的這個訊息攔截事件
uj5u.com熱心網友回復:
基類表單(假如名稱為 TBaseWin)實作了訊息攔截器,你動態創建的表單,是 TBaseWin 型別的就可以。uj5u.com熱心網友回復:
不懂大哥,我現在就是想讓動態創建的無標題視窗能隨意改變大小
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/19222.html
標籤:VCL組件開發及應用
上一篇:求指教
下一篇:TCP/IP的理解
