?? windows高級窗口的客戶區域拖動技術及其應用(轉載)中.txt
字號:
作者:chache
email: cyzhx@263.net
日期:2000-10-23 17:32:42
二、WINDOWS高級窗口拖動方案中拖動框的客戶定制方法
以上介紹了窗口拖動前鼠標光標位置檢測及客戶命令區域內拖動功能的鼠標光標動態提
示方法,當用戶通過鼠標光標動態提示功能取得滿足拖動窗口條件時,通過點擊鼠標左鍵來
啟動拖動方案,這時最關鍵的技術問題是鼠標拖動窗口移動過程中的拖動框顯示與擦除功能
實現。窗口拖動虛框就是在WINDOWS 整個屏幕區域內顯示描述被拖動窗口大小的線框,它的
大小需要根據被拖動窗口的矩形區域大小和實際需要來具體確定,一般情況下為被拖動窗口
的矩形區域大小。
WINDOWS 系統中的繪圖方法是通過顯示設備描述表實現的,繪圖操作需要占用一定的GD
I 資源,系統為窗口、菜單、對話框、字體和各種繪圖函數分配足夠的GDI資源,WINDOWS 9
5中的GDI資源要比WINDOWS3.X中的GDI資源大得多。WINDOWS中有兩種使用顯示設備描述符表
的方法:更新窗口顯示客戶區域和直接操作窗口顯示客戶區域。更新窗口顯示客戶區域是直
接針對應用程序窗口矩形區域而言的,在窗口函數響應WM_PAINT消息時利用圖形操作命令進
行窗口更新處理:
InvalidateRect(hWnd,&WinRECT,TRUE);//WinRECT為要更新區域
UpdateWindow(hWnd);
窗口初始建立時默認更新窗口的全部區域,當要更新的矩形區域為NULL時表示更新窗口
所有矩形區域。函數UpdateWindow()通知系統向要更新矩形區域的窗口發送WM_PAINT消息,
窗口函數接收到WM_PAINT消息后首先利用BeginPaint()函數取得設備描述符表,然后利用圖
形命令直接對顯示設備進行更新操作,最后利用EndPaint()函數通知系統更新操作結束。其
描述性功能代碼如下:
case WM_PAINT:
PAINTSTRUCT ps;
hdc=BeginPaint(hWnd,&ps);//取得設備描述符表
SetBkMode(hdc,OPAQUE); //設備更新方式
SetBkColor(hdc,0x00c0c0c0);
//更新矩形區域內圖形操作
EndPaint(hWnd,&ps); //結束更新操作
break;
更新窗口矩形區域直接使用窗口類中定義的屏幕畫刷,即使利用SelectObject()函數選
擇相應屏幕畫刷也無效,而且更新矩形區域范圍是通過InvalidateRect()函數累加的,由Up
dateWindow()函數通知系統開始進行窗口更新操作,整個過程是由系統來調度的,因此使用
這種方法無法實現窗口的拖動虛框繪制和實時操作。
直接操作窗口客戶區域的方法是利用GetDC( )函數直接取得顯示設備句柄,利用各種圖
形操作命令直接對顯示設備進行繪圖,它使用屏幕當前設置的畫筆和畫刷來實現各種圖形繪
制操作,無須系統任何消息應用程序就可以實時地對屏幕窗口進行更新和繪圖操作。其操作
過程是首先取得顯示設備描述符句柄:
HDC hDC;
hDC=GetDC(hWnd);//取得hWnd窗口設備描述符表句柄
當hWnd參數為NULL時取得的是整個屏幕的設備描述符表句柄,然后利用SelectObject()
函數設置當前屏幕的畫筆和畫刷,就可以利用各種畫圖函數完成屏幕的繪圖操作,最后利用
ReleaseDC( )函數釋放獲取的顯示設備描述表。由于這種方法可以直接控制當前屏幕的畫筆
和畫刷,并且無需系統調度就可以直接對屏幕設備進行操作,因此利用這種方法完全可以實
現窗口的拖動虛框。窗口的拖動虛框是用來描述要移動窗口大小的虛線框和實線框,當矩形
拖動框為虛線時,需要利用畫點或畫線函數經過一定算法來實現,這就需要設置當前的屏幕
畫筆;當窗口的拖動框為實線框時,如果利用畫線函數只需設置屏幕畫筆即可,如果利用畫
矩形函數Rectangle( )在設置當前屏幕畫筆的同時必須使用SelectObject(hDC,GetStockObj
ect(NULL_BRUSH))屏蔽掉任何屏幕畫刷,否則WINDOWS程序會很快吞筮掉所有GDI資源,相當
于在屏幕設備資源中增加了無數矩形區域。
對于窗口拖動框的擦除操作,只需在拖動框繪制函數中將屏幕的圖形畫筆操
作方式設置為R2_XORPEN異或方式,即SetROP2(hDC2,R2_XORPEN),在拖動框繪制結束時注意
恢復,然后在窗口拖動框移動到下一個位置前,在原屏幕位置重新調用繪制函數一次將原來
拖動框擦除。下面給出筆者利用畫矩形、畫線和畫點函數實現的拖動框函數,用戶在使用時
可選擇自己喜歡的實線或虛線拖動框函數。
函數1為利用畫矩形函數實現的拖動實框,其特點是函數的效果高,拖動框作圖速度快
;函數2為利用畫線函數實現的拖動框,其特點是通過設置不同的畫線類型可以畫虛框也可
以畫實框;函數3為利用畫線函數實現的拖動虛框函數,特點是拖動虛框圖案變化靈活,不
足是函數效率低作圖速度慢。函數通過參數可選擇不同的拖動虛框圖案或密度。函數3參數
XY為1時與WINDOWS 3.X窗口拖動缺省虛框相同為單虛線框,如果XY參數為2 則拖動虛框為矩
齒形邊框。也可以根據需要選擇不同的拖動虛框圖案和相應畫筆和畫刷以達到不同的效果。
//函數1:利用畫矩形函數實現拖動實框
void DrawMoveRect(int xx1,int yy1,int xx2,int yy2,int xy)
{
HDC hDC;
int oldrop2,m,k;
hDC = GetDC(NULL); //取得全屏幕設備描述句柄
oldrop2= GetROP2(hDC); //取得原來屏幕畫圖方式
SetROP2(hDC,R2_XORPEN); //設置異或屏幕畫圖方式
SelectObject(hDC,GetStockObject(NULL_BRUSH));//屏蔽畫刷
SelectObject(hDC2,GetStockObject(WHITE_PEN));//選擇畫筆
for (k=0;k
xx1-=1;
xx2+=1;
yy1-=1;
yy2+=1;
Rectangle(hDC2,xx1,yy1,xx2,yy2);
}
SetROP2(hDC2,oldrop2); //恢復原來作圖方式
ReleaseDC(NULL,hDC2); //釋放設備描述符表
}
//函數2:利用畫線函數實現拖動實框或虛框
void DrawMoveRect(int xx1,int yy1,int xx2,int yy2,int xy)
{ HDC hDC2;
int oldrop2,m,k;
hDC = GetDC(NULL); //取得全屏幕設備描述句柄
oldrop2= GetROP2(hDC); //取得原來屏幕畫圖方式
SetROP2(hDC,R2_XORPEN); //設置異或屏幕畫圖方式
SelectObject(hDC,GetStockObject(NULL_BRUSH));//屏蔽畫刷
SelectObject(hDC2,GetStockObject(WHITE_PEN));//選擇畫筆
for (k=0;k
xx1-=1;
xx2+=1;
yy1-=1;
yy2+=1;
MoveTo(hDC2,xx1,yy1);
LineTo(hDC2,xx2,yy1);
MoveTo(hDC2,xx1,yy1);
LineTo(hDC2,xx2,yy1);
}
SetROP2(hDC2,oldrop2); //恢復原來作圖方式
ReleaseDC(NULL,hDC2); //釋放設備描述符表
}
//函數3:利用畫點函數實現不同圖案的拖動虛框
void DrawMoveRect(int xx1,int yy1,int xx2,int yy2,int xy)
{ HDC hDC2;
int oldrop2,i,j,x1,x2,y1,y2;
hDC = GetDC(NULL); //取得全屏幕設備描述句柄
oldrop2= GetROP2(hDC); //取得原來屏幕畫圖方式
SetROP2(hDC,R2_XORPEN); //設置異或屏幕畫圖方式
SelectObject(hDC,GetStockObject(NULL_BRUSH));//屏蔽畫刷
SelectObject(hDC2,GetStockObject(WHITE_PEN));//選擇畫筆
for (j=0;j
x1=xx1-j; //帶注釋部分為另一圖案
x2=xx2+j;
y1=yy1-j;
y2=yy2+j;
for (i=x1;i
SetPixel(hdc,i,y1,RGB(255,0,0));
//if (i
for (i=y1;i
SetPixel(hdc,x2,i,RGB(255,0,0));
//if (i
for (i=x2;i>x1;i-=2)
SetPixel(hdc,i,y2,RGB(255,0,0));
//if (i>x1+2) SetPixel(hdc,i-1,y2-1,RGB(255,0,0));}
for (i=y2;i>y1;i-=2)
SetPixel(hdc,x1,i,RGB(255,0,0));
//if (i>y1+2) SetPixel(hdc,x1+1,i-1,RGB(255,0,0));}
}
SetROP2(hDC2,oldrop2); //恢復原來作圖方式
ReleaseDC(NULL,hDC2); //釋放設備描述符表
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -