關於SetCapture API問題 |
尚未結案
|
liouville
一般會員 發表:4 回覆:4 積分:1 註冊:2003-10-19 發送簡訊給我 |
在練習一個範例程式時,看到一個函式,setcapture API函式
看了說明文件,只知道他是補捉滑鼠訊息的,但搞不懂差別在哪?
那個範例程式是在一個form上用canvas畫一個矩形
利用滑鼠MouseDown 然後MouseMove 最後MouseUP以Down and UP
兩點的位置當對角線畫出一個矩形
書上是說如果沒有使用SetCapture函式的話,則程式不太可靠.他說當滑鼠移動
到其它的視窗放開滑鼠鍵時,則別的視窗會收到這個MouseUp訊息.
但是我把source codes裡的setcapture那行註解掉,發現結果都一樣
我一直以為沒使用setcapture則滑鼠拖曳到form的client區外會沒法畫
(因為MouseUp被其它視窗接收了),但現在看來並非如此...
所以我搞不太懂setcapture的用途到底是什麼?希望有高手可以幫我解答..
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
brucetsao
一般會員 發表:1 回覆:33 積分:11 註冊:2002-09-11 發送簡訊給我 |
function savescreen(savescreenfilename:string):integer;stdcall;//抓取屏幕圖象并
var
fullscreen:tbitmap;
fullcanvas:tcanvas;
dc:HDC;
ret:integer;
begin
savescreenfilename:=strpas(pchar(savescreenfilename));
if not (directoryexists(extractfilepath(savescreenfilename))) then
begin //路徑是否存在
ret:=2;
end
else
begin
DC:=getdc(0); //獲取屏幕handle,0為屏幕,1為活動窗體
fullcanvas:=tcanvas.Create;
fullcanvas.Handle:=dc;
fullscreen:=tbitmap.Create;
fullscreen.Width:=screen.Width; //設置抓取圖片寬度
fullscreen.Height:=screen.Height;
fullscreen.Canvas.CopyRect(rect(0,0,screen.Width,screen.Height),fullcanvas,rect(0,0,fullscreen.Width,fullscreen.Height)); //從畫布中copy抓圖片
try//保存文件
fullscreen.SaveToFile(savescreenfilename);
ret:=0; //保存成功返回0
except
ret:=1; //文件被lock傳回1
end;
if not(fileexists(savescreenfilename)) then ret:=99; //成功保存后文件不存在返回99
fullcanvas.Free;
fullscreen.Free;
releasedc(dc,0);
end;
result:=ret;
end;
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
當滑鼠移動到其它的視窗放開滑鼠鍵時,則別的視窗會收到這個MouseUp訊息.
這就是問題所在
我一直以為沒使用setcapture則滑鼠拖曳到form的client區外會沒法畫
(因為MouseUp被其它視窗接收了),但現在看來並非如此...
並非如此, 沒有SetCapture, 你的程式仍可正常執行,然而卻影響了其他元件, 你可以試試看, 如果你在form上放一些其他元件, 並為這些元件寫入MouseUp, mousemove等Event, 你會發現一旦執行過你的功能, 不論mouse在什麼位置, 這些Event都會被Trigger
所以說是不太可靠而不是不能執行
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |