假設:
A視窗有一個按鈕,滑鼠移動到該按鈕上,那個按鈕會發亮。
請問用sendmessage來發送wm_mousemove怎么實作這種效果,有個前提是,真實的滑鼠仍在做它自己的事情。
我的想法是用一個定時執行緒每30ms往A視窗句柄內的按鈕發送wm_mousemove。
但是真實的滑鼠仍在做其它的事情,這種30ms sendmessage一個wm_mousemove與真實的滑鼠真的移動在按鈕上不動,有什么區別嗎?比如在事件上?
uj5u.com熱心網友回復:
什么樣叫做發亮
uj5u.com熱心網友回復:
delphi 2006及以上版本,控制元件有onmousehover(游標懸停在控制元件區域)、Onmouseenter(進入控制元件區域)、onmouseleave(離開控制元件區域),如果用delphi7是沒有這些事件的,需要自己給控制元件擴展加入這幾個事件。
加入這幾個事件也很簡單,不過如果滑鼠快速劃過控制元件區域,這幾個事件就不太靈光了,這時需要通過trackmouseevent來精確控制。
var
tme:ttrackmouseevent; // 定義個全域變數或form的成員
。。。。
// 在form1的oncreate中初始化tme:ttrackmouseevent結構體
procedure tform1.formcreate(sender: tobject);
begin
tme.cbSize := sizeof(ttrackmouseevent);
tme.dwFlags := tme_leave + tme_hover;//表示要過問leave及hover這兩個訊息
tme.hwndTrack := form1.handle;// 關聯的表單句柄
tme.dwHoverTime := 100; // 關鍵在此,關聯滑鼠移動速度,單位毫秒
// 即滑鼠懸停在控制元件上超過100毫秒發送wm_mousehover訊息,表示滑鼠懸停了
end;
// 接下來自己重寫視窗程序WndProc,在里面處理滑鼠懸停和離開訊息
procedure tform1.wndproc(var m: tmessage);
begin
with m do
begin
case msg of
// 滑鼠移動訊息
wm_mousemove:
begin
trackmouseevent(tme);
end;
// 滑鼠懸浮于表單
wm_mousehover:
begin
// 這里做你所謂的“發光”的處理
end;
// 滑鼠離開表單
wm_mouseleave:
begin
// 這里恢復到未“發光”時的狀態
end;
end;
inherited wndproc(m);
end;
uj5u.com熱心網友回復:
忘了,是處理按鈕的,那么相應的,給tme.hwndTrack 指定按鈕的視窗句柄
wndproc改用form1.windowproc
把form1.windowproc指向按鈕的windowproc,在里面做同樣的處理就可以了
滅啥時間了,就不寫了,LZ自己擼定它吧
uj5u.com熱心網友回復:
非常感謝sololie。不好意思,我沒有表達好我的問題。
我們打開網頁,滑鼠移動到 超鏈接 時,該超鏈接的文字下方會出現一條線。
如果我不用滑鼠,而是用軟體不停的發送wm_mousemove到網頁句柄該超鏈接位置時,下方也會出現一條線。
我的問題是:即使不用真實的滑鼠移動到該超鏈接,除了不停的發送wm_mousemove有沒有其它的辦法。
uj5u.com熱心網友回復:
改字體,把字體改成帶下劃線的,或者自個畫個線uj5u.com熱心網友回復:
我是想實作用Sendmessage發送wm_mousemove來達到與真實滑鼠移動到某東西上的效果一樣。uj5u.com熱心網友回復:
你在Delphi下,繼承TButton寫一個自己的控制元件。然后在其中捕抓所有送進自己控制元件的訊息。1.收集總共有多少訊息;
2.分辨什么訊息,在什么情況下,產生什么結果。
用這個在Delphi下反復測驗,
最后在你要的環境下看看達到你要的結果沒有。
uj5u.com熱心網友回復:
計算該按鈕的位置,組裝成WM_MOUSEMOVE訊息,發送轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/124529.html
