关于图形反转的问题。请来看看(100分)

K

kofxdm

Unregistered / Unconfirmed
GUEST, unregistred user!
一个从TGraphicControl继承下来的图形控件。
当它的Width或是Height变为负值,图形被反转,这个时候图形控件接受不到鼠标消息,(MouseDown,MouseUP等)。
请问如何让它接受鼠标消息。
 
还有这样的事情!!
难道是系统认为你的鼠标放到了屏幕后面,就不反应了??

GZ!
 
反正是没有响应。消息直接发到它的下面的控件去了。
 
Win2K下无此问题,
这个问题应该和WinAPI有关,
大约是98系统不完善的地方吧?
 
呵呵呵还有这等事情
 
to DarwinZhang
我就是在w2k下出现这个问题的。win98我还没有试过呢。
(注意,我说的不是直接用Sendmessge发过去,而是实际的用鼠标点)。
 
TGraphicControl和它的子类是没有窗口句柄的,
它是通过它的有窗口句柄的Parent来接受鼠标消息。
实际上当Width和Height为负的时候,就应该没有图形出现了。
至少TImage控件是这样,至于您的控件,
我也不清楚你如何实现Paint事件的,不好讨论。
 
从TGraphicControl的确没有handle,但是可以创建用AllocateHWnd来创建。
至于图形,的确是画在paint里。
图形反转的时候,图形依然可以看见。
 
用AllocateHWnd得到得句柄不是用来直接接受鼠标消息的。
它的Parent得到鼠标消息后根据情况决定应该给谁发送相应的消息。
我系统是Win2K+Delphi6,没有你讲得情况。
 
消息的确是由parent传过来的。
我的想法是:
由于width或height为负,所以Canvas的面积 < 0 ?所以MouseDown无法发生?Parent
无法找到发送对象?。。。。
或是其他原因。
但是关键的是如何解决
讨论。
 
我这里无论如何也无法重现你的情况!
请将你的情况讲得仔细一些,谢谢您了![:)]
 
一个从TGraphicControl继承下来的图形控件,subShape。
用AllocateHWnd分配了handle,
重载了Wndproc
paint事件里画上图形,例如画一条直线。
当subShape的对象的width或height为负的时候,图形依然可以看见。但是得不到鼠标的
mousedown等的消息。(应该parent没有发给这个对象,其原因可能是我上贴所说的。)
 
发生这个问题的关键是两个API的差异。
PtInRect会判断TRect的Left是否比Right大,Top是否比Bottom大,
而InsertClipRect却不进行判断。为了实现楼主的愿望,即响应鼠标动作,
需要修改 PtInRect,因为有一些技巧性,所以将方法讲得详细一些:
1.找到 Controls.pas ,并打开它,在Implementation部分的 Uses Consts,Froms,......
下面写入如下代码:
function PtInRect(R:TRect; P:TPoint):Boolean;
var
MyR:TRect;
begin
if R.Left<R.Right then begin
MyR.Left:=R.Left;
MyR.Right:=R.Right;
end else begin
MyR.Left:=R.Right;
MyR.Right:=R.Left;
end;
if R.Top<R.Bottom then begin
MyR.Top:=R.Top;
MyR.Bottom:=R.Bottom;
end else begin
MyR.Top:=R.Bottom;
MyR.Bottom:=R.Top;
end;
Result:=Windows.PtInRect(MyR,P);
end;
2.将Controls.pas,你的那个定义类的单元文件一起保存到你的那个工程文件所在的目录下面,
将这些文件重新编译(一定要真的从新编译!),
这样你就可以看到你的控件响应鼠标事件了,鼠标位置为负数。

btw:你的所谓“反转”是不准确的,因为用 MoveTo(0,0); LineTo(100,100);
这样的图形是显示不出来的,而只有MoveTo(0,0); LineTo(Width,Height);才好像反转了,
而实际上,是因为width,Height变成负数的原因,并非是真的反转了。
 
你的意思是在Mousedown前是由PtInRect判断是否在某个区域.
看Controls单元发现PtInRect是在WMLButtonUp里做判断的。真是奇怪。
判断成功就成click....
............
............
oh I see ,let me try.....
 
果然 KO,呵呵。。。(虽然这个问题我早已用其他方法来解决了,但是心里还是有疙瘩。。)

非常感谢DarwinZhang。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
473
DelphiTeacher的专栏
D
I
回复
0
查看
580
import
I
D
回复
0
查看
954
DelphiTeacher的专栏
D
顶部