在TreeView的Onclick和OnDblClick事件中只有sender参数,这时候怎样获取鼠标位置和按键信息?就像mousedown一样

解决方案 »

  1.   

    获取鼠标位置:
    首先,用GetCursorPos获取鼠标位置
    然后,用Windows.ScreenToClient将鼠标位置转换成TreeView的客户区位置就OK了
    var APoint: TPoint;
    ...
    GetCursorPos(APoint);
    Windows.ScreenToClient(TreeView.Handle, APoint);
      

  2.   

    你也可以在mousedown里获得啊,因为Click,是由Mousedowen和MouseUp来得到的
      

  3.   

    这个例程可能对你有用。如果觉得好,给分吧!procedure TForm2.BitBtn1Click(Sender: TObject);
    var
      newid,oldid,jg_mc:string;
      idno:real;
      MyTreeNode1, MyTreeNode2: TTreeNode;
    begin //添加[到站油库名称]到树型目录框
      TreeView1.Items.Clear;
      
      with datamodule22.adoquery3 do
             begin
              close;
              sql.clear;
              sql.add('select * from inoilstation order by jgno');
              open;
              first;
              idno:=0;
              if recordcount >0 then
                begin   
                   newid:=FieldValues['jgno'];
                   oldid:='';
                  // MyTreeNode1 := TreeView1.Items.Add(nil, newid);
                   while not eof do
                     begin
                       with datamodule22.adoquery2 do   //根据NEWID查出表machinery中的机构名称给jg_mc变量
                          begin
                            close;
                            sql.clear;
                            sql.add('select * from machinery where jgno=:j');
                            Parameters.ParamByName('j').Value:=newid;
                            open;
                            if recordcount >0 then  jg_mc:=FieldValues['jgmc']
                            else
                              begin
                               showmessage('机构名称读不到!');
                               exit;
                              end;
                          end;
                       if newid=oldid then
                         begin
                           TreeView1.Items.AddChild(MyTreeNode1,FieldValues['dzmc']);
                           idno:=idno;
                         end
                       else
                         begin
                           idno:=idno+1;
                           MyTreeNode1 := TreeView1.Items.Add(nil, jg_mc);
                          // MyTreeNode1 := TreeView1.Items.Add(nil, newid);
                           TreeView1.Items.AddChild(MyTreeNode1,FieldValues['dzmc']);
                         end;
                       datamodule22.adoquery3.Next;
                       oldid:=newid;
                       newid:=FieldValues['jgno'];
                     end;
                end;
             end;
    end;
      

  4.   

    鼠标位置,除了可以用API函数GetCursorPos获得外,还可以用Mouse.CursorPos得到,然后
    用TreeView1.ScreenToClient转换为TreeView1的坐标。
    按键信息,可以通过API函数GetKeyState来得到。比如:GetKeyState(VK_LBUTTON) < 0 表
    示鼠标左键按下了,GetKeyState(VK_RBUTTON) < 0 表示鼠标右键按下了,GetKeyState(
    VK_MENU) < 0表示Alt键按下了,GetKeyState(VK_CONTROL) < 0表示Ctrl键按下了,......
      

  5.   

    谢谢诸位帮忙!
    不过 solonet老大,您的例程好像是把一个表中的数据导入到treeview中,不是获取鼠标信息的。另外请教一下,我现在是要处理对treeview的节点的左键、右键、左键双击和非节点区域的右键事件,而且各种情况的处理不同,现在我处理的就是mousedown事件,可是这种方法不能处理双击,所以我希望在双击事件中也进行处理,可是双击事件的参数只有sender,所以就产生了上面的问题,这种情况是不是处理treeview的onclick和ondblclick事件比较好呢?