请教office助手是如何实现的?(100分)

  • 主题发起人 主题发起人 hhzh426
  • 开始时间 开始时间
H

hhzh426

Unregistered / Unconfirmed
GUEST, unregistred user!
用设置窗口区域的方法在拖拉时会出现一个虚线框(指用拦截wmnchittest消息并进行更改)
我想知道如何去除窗口移动时出现的虚线框?
不能使用诸如用onmousedown时记录鼠标的位置,在onmousemove事件中检测鼠标的偏移量,
并移动窗口之类的方法,那样当窗口比较大或者控件比较多时会有一种迟滞的感觉。
 
那里是这样实现的。
office助手是通过MSAGENT技术实现的。
不是你想的那样。
 
http://www.helperhome.com/agent/index.html
你去这里看看。
这个问题已经有人回答过了。
 
http://www.helperhome.com/agent/intro.htm
 
搞错没有,看清楚题目,人家不是问Agent的问题,是问如何是一个不规则的窗体拖动的时候
不出现那个虚框!!

关注。
 
我再回答这个问题吧!
 
Answer:

procedure TForm1.PanelTopMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Button=mbLeft) then
begin
ReleaseCapture;
(Self as TControl).Perform(WM_SYSCOMMAND,SC_DRAGMOVE,0);
end;
end;
 
如果是关于精灵的,有个Agent控件
 
to xk:
SC_DRAGMOVE在哪儿定义?
换成SC_MOVE仍然会出现虚框!
to 林沐:
谢谢您的回答,但我确实是想知道如何在拖拉不规则窗口时不出现虚框,是不是不能实现!
 
or try these code:

1: simple
procedure TForm1.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
If button = mbleft then
begin
releasecapture;
TWincontrol (Parent).perform (WM_syscommand, $F012, 0);
end;


2:
implementation

var
MPos:TPoint; {Position of the Form before drag}
.
.
.
procedure TForm1.FormMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
MPos.X := X;
MPos.Y := Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
begin
Form1.Left := Form1.Left - (MPos.X-X);
Form1.Top := Form1.Top - (MPos.Y-Y);
end;
end;
 
xk的方法可以实现,但是如果用鼠标移动标题栏的话,还是有一个讨厌的虚框。不知道有什么
解决方法没有?
 
>>不能使用诸如用onmousedown时记录鼠标的位置,在onmousemove事件中检测鼠标的偏移量,
>>并移动窗口之类的方法,那样当窗口比较大或者控件比较多时会有一种迟滞的感觉。

为什么?你见过 windows 移动窗口会闪动吗?一般来说,移动窗口不会引发 wm_paint。
如果你不要虚框,在 mouse_move 中什么都不干就行了。mouseup 中再移动窗口。
 
在windows显示属性的效果中有个设置:拖动窗口时显示窗口内容,但是这个设置是对所有
窗口同时发生效果,能不能在我的程序中设置为只对我的窗口发生这种效果(或者说有没有
一个api函数能够实现这种效果。)
 
时间太长了,尽管不满意,还是结束话题吧。
分给大家均分了!
 
后退
顶部