?? windows高級窗口的客戶區域拖動技術及其應用(轉載)下.txt
字號:
作者:chache
email: cyzhx@263.net
日期:2000-10-23 17:33:49
三、WINDOWS高級窗口客戶區域拖動技術實現的“三步曲”
WINDOWS 高級窗口的客戶區域拖動命令判斷、拖動功能的鼠標光標動態提示和定制窗口
拖動框函數之后,就需要實現整個拖動方案中的拖動過程啟動、窗口拖動框移動和拖動結束
處理的三步曲過程。于是必須在窗口函數中直接處理WM_LBUTTONDOWN、WM_MOUSEMOVE和WM_L
BUTTONUP消息,來具體處理上述三個步驟中的細節問題。
第一步,在窗口函數中對鼠標點擊消息WM_LBUTTONDOWN進行判斷處理,以處理用戶通過
鼠標光標動態提示功能獲取滿足窗口拖動條件時,按下鼠標左鍵產生的啟動拖動過程消息,
其功能性代碼如下:
POINT pt;
BOOL MoveFlag=FALSE;
case WM_LBUTTONDOWN:
pt = MAKEPOINT(lParam); //獲取鼠標光標指針
if(PtInRect(&DragRT,pt)){//DragRT為拖動命令區域
DragBegin((LPRECT)&WinRT,lParam,hWnd,2);
//啟動窗口拖動過程
} else {進行其它處理}
break;
上述DragBegin( )函數為筆者開發的窗口拖動啟動函數,由于一個高級窗口應用程序中
往往存在很多窗口,所以將其作為一個單獨函數處理。其中WinRT 為高級窗口矩形區域,這
里作為拖動框矩形區域參數來傳遞,lParam為鼠標光標指針長整數,hWnd為當前被拖動窗口
的句柄,2 為拖動框寬度。同時需要將鼠標控制權交給當前被拖動窗口、設置拖動窗口標志
單元、保存當前鼠標在屏幕上的位置并顯示被拖動窗口的拖動框。拖動功能啟動函數的原形
代碼如下:
void DragBegin(
LPRECT WinRect, //拖動框的矩形區域
LPARAM lParam, //鼠標光標當前指針
HWND hwnd, //當前窗口句柄
unsigned int kk) //拖動框顯示的寬度
{
SetCapture(hwnd); //拖動時窗口必須具有鼠標輸入權
MoveFlag=TRUE; //設置拖動標志
oldmx=LOWORD(lParam);//記錄當前鼠標屏幕坐標X
oldmy=HIWORD(lParam);//記錄當前鼠標屏幕坐標Y
DrawMoveRect(WinRect->left,WinRect->top,//顯示拖動框
WinRect->right,WinRect->bottom,kk);
}
第二步,需要處理鼠標拖動窗口時的拖動框移動過程,這需要在窗口函數中進行WM_MOU
SEMOVE消息處理。拖動框的移動包括上次顯示拖動框的清除和本次拖動框的顯示兩步,由于
拖動框繪制函數中對當前的繪制方式進行重新設置,異或方式使得只要重新在原屏幕坐標位
置處調用一次該函數即可清除拖動框,因此,在鼠標拖動窗口移動過程中顯示和清除拖動框
只需要調用兩次拖動框繪制函數即可。另外,拖動框在屏幕上位置的計算方法也非常簡單,
就是將當前取得的屏幕位置坐標值減去保存的前次屏幕位置坐標值所得鼠標移動偏移量,再
用原來窗口屏幕左上角坐標值加上這個偏移量,就可以確定被拖動窗口和拖動框新的屏幕位
置坐標值。其處理過程的描述性代碼如下:
case WM_MOUSEMOVE:
DragMove((LPRECT)&WinRT,WinWT,WinHi,lParam,2);
//WinRT為窗口矩形區域,WinWT為窗口寬度,WinHI為窗口高度
} else {進行其它處理}
break;
鑒于高級窗口應用程序一般為多個子窗口,所以將拖動框移動處理過程單獨編制成函數
,并且對鼠標拖動窗口過程中,窗口不能完全位于屏幕可見區域之內進行了特殊處理,開發
者可根據需要自行調整其位置,以便被拖動的窗口能夠完全被顯示于屏幕可視區域內,其拖
動過程函數原形代碼部分如下:
void DragMove(
LPRECT rcwin, //拖動框矩形區域
unsigned int wi, //被拖動窗口寬度
unsigned int hi, //被拖動窗口高度
LPARAM lParam, //鼠標位置指針
unsigned int kk) //拖動框邊框寬度
{
DrawMoveRect(rcwin->left,rcwin->top,
rcwin->right,rcwin->bottom,kk);//清除上次畫拖動框
rcwin->left+=LOWORD(lParam)-sImeG.oldmx;//計算窗口
rcwin->top+=HIWORD(lParam)-sImeG.oldmy; //新位置
sImeG.oldmx=LOWORD(lParam); //保存當前坐標值
sImeG.oldmy=HIWORD(lParam);
if (rcwin->left<0) rcwin->left=0;//對窗口超越屏幕
if (rcwin->left>sImeG.xScrWi-wi) //可視區域處理
rcwin->left=sImeG.xScrWi-wi;
ii=sImeG.yScrHi-hi-(sImeG.WinVer<0x35f ? 0:BOTOFF);
if (rcwin->top<0) rcwin->top=0; //對WIN95進行底部
if (rcwin->top>ii) rcwin->top=ii;//特殊保留處理
rcwin->right =rcwin->left+wi-1;
rcwin->bottom=rcwin->top+hi-1;
DrawMoveRect(rcwin->left,rcwin->top,
rcwin->right,rcwin->bottom,kk);//畫新位置拖動框
}
第三步,在鼠標拖動窗口結束時需要進行窗口的實際移動處理,這就需要在處理WM_LBU
TTONUP消息時利用MOVEWINDOW()命令進行實際移動處理。同樣鑒于多窗口原因仍然需要將這
個處理過程單獨形成一個函數,而且在移動窗口前還需要利用繪制函數清除屏幕上所畫的拖
動框,如果窗口未完全位于屏幕的可見位置,還必須進行適當調整使被拖動的窗口能夠完全
位于屏幕可視區內,同時釋放鼠標控制權并清除拖動窗口標志單元。結束過程的描述性代碼
部分如下:
case WM_LBUTTONUP:
if (sImeG.MoveFlag==TRUE){//拖動標志有效
DragEnd((LPRECT)&WinRT,WinWT,WinHI,hWnd);
}
拖動結束處理函數的原形代碼部分如下:
void DragEnd(
LPRECT rcwin, //拖動框矩形區域
unsigned int wi, //被拖動窗口寬度
unsigned int hi, //被拖動窗口高度
unsigned int kk) //拖動框邊框寬度
{
DrawMoveRect(rcwin->left,rcwin->top,
rcwin->right,rcwin->bottom,1); //清除拖動框
if (rcwin->left<0) rcwin->left=0;//對窗口超越屏幕
if (rcwin->left>sImeG.xScrWi-wi) //可視區域處理
rcwin->left=sImeG.xScrWi-wi;
ii=sImeG.yScrHi-hi-(sImeG.WinVer<0x35f ? 0:BOTOFF);
if (rcwin->top<0) rcwin->top=0; //對WIN95進行底部
if (rcwin->top>ii) rcwin->top=ii;//特殊保留處理
rcwin->right =rcwin->left+wi-1;
rcwin->bottom=rcwin->top+hi-1;
MoveWindow(hwnd,rcwin->left,rcwin->top,
wi,hi,TRUE); //將窗口實際移到新位置
sImeG.MoveFlag=FALSE; //清除拖動標志單元
ReleaseCapture(); //釋放鼠標控制權
}
四、WINDOWS高級窗口的客戶區域拖動技術的實際應用
上述介紹的WINDOWS 高級窗口客戶區域拖動技術的有關技術和拖動方案“三步曲”的實
現過程,這些技術原理在WINDOWS95和WINDOWS3.X下同樣適應,但由于消息是WINDOWS系統中
的最后一道防線,如果處理得不好就會使應用程序“誤入歧途”,影響開發效率和程序效果
,若處理得恰到好處就會使你的應用程序具有很高的專業水準,如虎添翼。因此,實現適合
自己應用程序的有效拖動方案,對開發不同應用的影響和程序的運行效率具有深遠的影響。
雖然實現WINDOWS 高級窗口應用程序拖動方案的方法不止一種,但筆者仍未見過更加簡捷高
效的拖動方案,本文介紹的實現方案較具有很好的適應性和優秀的運行效果,具體表現在:
開發者可根據自己的實際需要控制窗口拖動框的大小、拖動框顏色和拖動框的具體圖案
,具有拖動命令區域的鼠標光標動態提示功能,窗口拖動功能的啟動、拖動過程和拖動結束
處理均是獨立的子程序可提供給多窗口應用程序直接調用,啟動過程選擇靈活,在拖動結束
時可隨時控制被拖動窗口全部顯示在屏幕可見區域內,其它功能擴充簡便靈活,程序的運行
效果理想等等。
本文給出的WINDOWS 高級窗口拖動方案描述性功能代碼和通用子程序,均在筆者開發的
“輕松使用漢字輸入法”程序中實際應用,是這個程序中實現窗口拖動功能的關鍵代碼,均
在WINDOWS95和WINDOWS3.X下試用效果很好,因此推薦讀者開發應用時將其作為首選方案。
在本文介紹的基礎上,相信讀者對WINDOWS 高級窗口的客戶區域拖動技術有了全面了解
,同時為開發具有客戶區域拖動窗口的應用程序提供了可行的實現方案,希望讀者在此基礎
上進行深入研究,以開發出更加理想的WINDOWS 高級窗口客戶區域拖動方案,編制出更加具
有專業特色的WINDOWS高級應用程序。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -