东方快车式的Form(50分)

  • 主题发起人 主题发起人 D4
  • 开始时间 开始时间
D

D4

Unregistered / Unconfirmed
GUEST, unregistred user!
; 不用Hook能做像东方快车一样的Form吗?
就是那个mouse移上就出来,移走就消失的Form.
 
那个叫任务栏程序,是和TNotifyIcon在一起的Windows接口,
李维的那本《Delphi3从入门到精通》里头有详细的论述。
 
不是我指那个上面的,可以动的!
是个Form!
不是下面那个!
 
通过MOUSEMOVE+RESIZE+HITTEST即可实现
 
它消失隐藏的时候仍然监视着HOOK着你的鼠标位置,
到了它的区域,就弹出窗体
 
; 老兄们,写清楚一点,要分我再加150,决不失言。
 
;为何没人答!!
 
;我一定再加150分!
要分快抢!
来啊!
 
LMD似乎可以不用HOOK(无DLL)监视鼠标,这是怎么实现的?
 
嘻嘻,谁知!
反正我不知!
 
"东方快车"我没用过,但从你描述的现象来看,动态Form估计能够实现。
1、先设一主Form;
2、if 确定Form的OnMouseMove 在指定的区域 Then 产生一已创建好的Form
Else if 动态Form已存在 Then 关闭;
3、至于监控则要Delphi来为你做。
 
很简单,做一小条Form响应OnMouseEnter事件,
如果觉得不好,把Form透明了,就可以
不过这样浪费资源,CJ讨厌那种东西
 
修改wndproc, 截取并修改WM_NCHITTEST的返回值, 如果mouse进入窗口坐标并且当前是
invisible的就显示窗口.
 
TO Another_eYes:
帮忙写一下,送我个原码,
我这两天作毕业设计快疯了!我给200!
用你说的方法!
(切记能不用钩子就不用.)谢谢!
TO All:
我今天写了一个,用了'瘟钩子',好繁!
原理倒也简单。判断一下老鼠离窗口上边框有多远,
小于4就显示!
好苯!还是Another_eYes的方法好。
我很懒,不喜欢钩子!
 
监视Z 坐标,如果不是Top -> 使自己始终处于 Z Top(防止多 Z Top程序争夺)
接下来当然是监视 老鼠,当老鼠位于 Form边框(18)或Client(2),弹出窗口
否则嘛...你也知道啦
简单点就是响应OnMouseEnter事件
 
东方快车在上面的FORM一直是一个可见的FORM,也可以被拖着周走,故不是一个
TASKBARAPP。作一个FORM,BORDERSTYLE=bsNONE。用WM_NTHITTEST将上面的高度
为2或3个象素的矩形当作HITCAPTION区域, 可以用来拖动FORM。下面的区域为
HITCLIENT。当鼠标移出CLIENT区域的时候,改变FORM的高度为4。当鼠标移动到
CLIENT区域的时候,如果FORM.HEIGHT=4,则增加FORM的高度。That's it!
 
TO huizhang:
WM_NTHITTEST是咋用的。这个消息我没找到。
麻烦麻烦写一下!
 
我给诸位大吓加的分在<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=113749">这里</a></font></pre>
顺便问一下用那个函数来获取当前屏幕(50分)
 
1、正规的方法,是注册创建APP BAR,即任务条。能设置诸如显示位置、大小、是否
自动隐藏等属性,总之与windows的任务栏一模一样。具体可查看shell编程的资料。
东方快车似乎并没有采用这种方法。
2、非正规的方法,建一个没有边框的窗口,显示位置定在顶部。并设为top most
,判断鼠标移进移出,从而改变窗体的高度。但不能为0。
另外还有一点就是窗体的拖动,这很容易
在form_mousedown 中加入
releasecapture;
sendmessage (form1.handle,wm_syscommand,sc_move or htcaption,0 );
3、抓 图 实 际 上 是 位 图 的 复 制
首 先 建 立 一 个 Form, 在 uses部 分 加 上 Clipbrd单 元 。
然 后 在 Click事 件 中 输 入 以 下 代 码 :
procedure TForm1.FormClick(Sender: TObject);
var winHWND, hCur:integer;
winDC:integer;
rect:TRect;
AFormat : Word;
AData,APalette : THandle;
pt:TPoint;
fBitmap:TBitmap;
begin
winHWND := GetDesktopWindow();
winDC := GetDC(winHWND);
GetWindowRect(winHWND, rect);
fBitmap := TBitmap.create;
fBitmap.width := rect.right-rect.left;
fBitmap.height := rect.bottom-rect.top;
BitBlt(fBitmap.canvas.handle, 0, 0, fBitmap.width, fBitmap.height, winDC, 0, 0, SRCCOPY);
ReleaseDC(winHWND, winDC);
fBitmap.SaveToClipBoardFormat(AFormat,AData,APalette);
Clipboard.SetAsHandle(AFormat,AData);
end
 
我也刚写了个抓屏的程序,还挺简单的!如下
var
DeskTop : TCanvas
begin
DeskTop := TCanvas.Create
try
with DeskTop do
Handle := GetWindowDC (GetDesktopWindow)
with PaintBox1.Canvas do
CopyRect (Rect (0, 0, 200, 200),DeskTop,Rect (0, 0, 200, 200))
finally
DeskTop.Free
end
end;

这里只捉了一小部分!只要用screen判断一下height和width就能抓全屏了,
在win98下用了双显示器一样处理!
看样子要给我加50分了!
茶叶蛋同意吗!
 
后退
顶部