Delphi 中LPtpDP,DPtoLP的用法
我有一个Form1,在Form1上有一个TreeView1,我想在用户右击我的TreeView1的某一个结点时时能弹出一个菜单,对这个结点进行相关的操作。
1。开始时我把TTreeView的RightClickSelect设为True,可是在我右击了一个结点之后TTreeView的Selected属性并指向这个结点。
2.后来我想用TTreeView的OnMouseDown实现,在OnMouseDown中我用如下代码
var
par:array[0..1] of TPoint;
begin
...
pa[0].x:=x;pa[0].y:=y;
if LPtoDP(TreeView1.Canvas.Handle,pa,1) then
popupmenu1.Pop(pa[0].x,pa[0].y);
end;
怪就怪在调用了LPtoDP(TreeView1.Canvas.Handle,pa,1)之后,pa[0]这个point
的值没有任何变化。这是为何。
问题点数:50、回复次数:5Top
1 楼E()回复于 2000-03-26 13:19:00 得分 25
最好的方法是不用 ?pto?p! ^-^
试试ClientToScreen/ScreenToClient
或干脆:
popupmenu1.Pop(mouse.x,mouse.y);
Top
2 楼Lin(林)回复于 2000-03-26 19:00:00 得分 5
LPtoDP?你知道它用来干嘛的?犯不着用它啊?完全同意SoftCrazy。Top
3 楼yangfan()回复于 2000-03-26 23:08:00 得分 20
在可变比例MM_ISOTROPIC 或 MM_ANISOTROPIC映射模式下LPtoDP或DPToLP才有意义
用法是在用Canvas画图之前进行映射模式和各项参数的设置,如:
SetMapMode(Canvas.handle,MM_ANISOTROPIC);
SetWindowExtEx(Canvas.handle,WinExtx,WinExty,nil);
SetViewPortExtEx(Canvas.handle,VieExtx,VieExty,nil);
所以你的pa[0]的值没有变化!
如果你想在用户右击你的TreeView1的某一个结点时时能弹出一个菜单,对这个结点进行相关的操作,你应该去研究一下Delphi的原代码,看他是如何处理让结点展开的,也许在那里你能找到问题的答案!
Top
4 楼hardnut()回复于 2000-03-28 10:22:00 得分 0
SoftCrazy 直截了当解决问题,大洋25
Lin 墨水费
yangfan 指出了why,但还未验证,在我的记忆中vc下没有MM_ISOTROPIC 或 MM_ANISOTROPIC映射模式的限制。Top
5 楼mhuang(蚂蟥)回复于 2000-03-29 01:18:00 得分 0
你可以参照以下的源码
procedure TFUserdes.UserAndDepartmentMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
DownXY:TPoint;
begin
if Button=mbRight then
begin
DownXY.x:=x;
DownXY.y:=y;
GetCursorpos(DownXY);
UserPopupMenu.Popup(DownXY.x ,DownXY.y);
end;
end;
Top




