Delphi 中LPtpDP,DPtoLP的用法

hardnut 2000-03-26 12:08:00
我有一个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
的值没有任何变化。这是为何。
...全文
205 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhuang 2000-03-29
  • 打赏
  • 举报
回复
你可以参照以下的源码
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;

hardnut 2000-03-28
  • 打赏
  • 举报
回复

SoftCrazy 直截了当解决问题,大洋25
Lin 墨水费
yangfan 指出了why,但还未验证,在我的记忆中vc下没有MM_ISOTROPIC 或 MM_ANISOTROPIC映射模式的限制。
yangfan 2000-03-26
  • 打赏
  • 举报
回复
在可变比例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的原代码,看他是如何处理让结点展开的,也许在那里你能找到问题的答案!
Lin 2000-03-26
  • 打赏
  • 举报
回复
LPtoDP?你知道它用来干嘛的?犯不着用它啊?完全同意SoftCrazy。
E 2000-03-26
  • 打赏
  • 举报
回复
最好的方法是不用 ?pto?p! ^-^
试试ClientToScreen/ScreenToClient
或干脆:
popupmenu1.Pop(mouse.x,mouse.y);

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧