数据窗口实现鼠标拖选框

时间:2022-05-17 20:03:00

最后的效果如下:

数据窗口实现鼠标拖选框

 

效果如上图, 眼神好的已经看出来了, 边框其实就是4个长方形, 其实中间的条纹也是个长方形.

 

首先在数据窗口里放5个长方形对象.

数据窗口实现鼠标拖选框

 

 

功能的实现由三个事件组成, rbuttondown事件, 自定义的ue_mousemove, 自定义的ue_rb_up

 

在界面上数据窗口对象的rbuttondown事件下写代码   (下为部分代码)

//*****************框********************

if dwo.type="column" then
 b_lb_up=false
 b_rec_up=true
 dw_1.modify("r_5.visible=false")
 l_frop=long(dw_1.Object.Datawindow.FirstRowOnPage)

 if keydown(KeyShift!) then
//  if b_shift=true then
   l_last_row=row
   l_last_dwoid=long(dwo.id)
//   b_shift=false
   //---------------- draw -----
   long l_width,l_thisid
   int i

 l_width=long(dw_1.describe("#"+string(l_start_dwoid)+".width"))
 l_thisid=l_start_dwoid
 
 if long(dw_1.describe("#"+string(l_last_dwoid)+".x")) > &
  long(dw_1.describe("#"+string(l_start_dwoid)+".x")) then
  
  for i=1 to 40
   l_thisid=uf_findnextcol(l_thisid)
   l_width=l_width+9+ &
   long(dw_1.describe("#"+string(l_thisid)+".width"))
  if l_thisid=l_last_dwoid then
   exit
  end if
  next
  dw_1.modify("r_1.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
  dw_1.modify("r_2.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
  dw_1.modify("r_3.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x")) - 20))
  dw_1.modify("r_4.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x"))+l_width))
 else
  if long(dw_1.describe("#"+string(l_last_dwoid)+".x")) < &
  long(dw_1.describe("#"+string(l_start_dwoid)+".x")) then
  
  for i =1 to 40
    l_thisid=uf_findprecol(l_thisid)
    l_width=l_width+9+ &
    long(dw_1.describe("#"+string(l_thisid)+".width"))
  if l_thisid=l_last_dwoid then
   exit
  end if
  next
   dw_1.modify("r_1.x="+dw_1.describe("#"+string(l_last_dwoid)+".x"))
   dw_1.modify("r_2.x="+dw_1.describe("#"+string(l_last_dwoid)+".x"))
   dw_1.modify("r_3.x="+string(long(dw_1.describe("#"+string(l_last_dwoid)+".x")) - 20))
   dw_1.modify("r_4.x="+string(long(dw_1.describe("#"+string(l_last_dwoid)+".x"))+l_width)) 
  else
   l_width=long(dw_1.describe("#"+string(l_start_dwoid)+".width"))
   dw_1.modify("r_1.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
   dw_1.modify("r_2.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
   dw_1.modify("r_3.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x")) - 20))
   dw_1.modify("r_4.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x"))+l_width))
  end if
 end if
 
 if l_last_row>=l_start_row then
  dw_1.modify("r_1.y="+string(l_header_h - 10+(l_start_row - l_frop)*l_detail_h))
  dw_1.modify("r_2.y="+string(l_header_h+8+(l_last_row - l_frop + 1)*l_detail_h))
  dw_1.modify("r_3.y="+string(l_header_h+8+(l_start_row - l_frop )*l_detail_h))
  dw_1.modify("r_4.y="+string(l_header_h+8+(l_start_row - l_frop)*l_detail_h))
 else
  dw_1.modify("r_1.y="+string(l_header_h+8+(l_start_row - l_frop + 1)*l_detail_h))
  dw_1.modify("r_2.y="+string(l_header_h - 10+(l_last_row - l_frop)*l_detail_h))
  dw_1.modify("r_3.y="+string(l_header_h+8+(l_last_row - l_frop)*l_detail_h))
  dw_1.modify("r_4.y="+string(l_header_h+8+(l_last_row - l_frop)*l_detail_h))
 end if
 
 dw_1.modify("r_1.width="+string(l_width))
 dw_1.modify("r_2.width="+string(l_width))
 
 dw_1.modify("r_3.height="+string((abs(l_last_row - l_start_row) + 1)*l_detail_h))
 dw_1.modify("r_4.height="+string((abs(l_last_row - l_start_row) + 1)*l_detail_h))
 //-------------draw r5-----------
 dw_1.modify("r_5.x="+dw_1.describe("r_1.x"))

if long(dw_1.describe("r_1.y"))<=long(dw_1.describe("r_2.y")) then
 dw_1.modify("r_5.y="+string(long(dw_1.describe("r_1.y"))+16))
else
 dw_1.modify("r_5.y="+string(long(dw_1.describe("r_2.y"))+16))
end if
dw_1.modify("r_5.width="+dw_1.describe("r_1.width"))
dw_1.modify("r_5.height="+dw_1.describe("r_3.height"))
dw_1.modify("r_5.visible=true")
 //--------------draw end---------
 
//  else
//   b_shift=true
//   l_start_row=row
//   l_start_dwoid=long(dwo.id)
//  end if

 else
  l_start_row=row
  l_last_row=row
  l_start_dwoid=long(dwo.id)
  l_last_dwoid=long(dwo.id)
 
    
  dw_1.modify("r_1.x="+string(long(dwo.x)))
  dw_1.modify("r_1.y="+string(l_header_h - 10 +(row - l_frop)*l_detail_h))
  dw_1.modify("r_1.height=10")
  dw_1.modify("r_1.width="+string(long(dwo.width)))
  
  dw_1.modify("r_2.x="+string(long(dwo.x)))
  dw_1.modify("r_2.y="+string(10+l_header_h+(row - l_frop + 1)*l_detail_h))
  dw_1.modify("r_2.height=10")
  dw_1.modify("r_2.width="+string(long(dwo.width)))
  
  dw_1.modify("r_3.x="+string(long(dwo.x) - 20))
  dw_1.modify("r_3.y="+string(l_header_h+8+(row - l_frop)*l_detail_h))
   dw_1.modify("r_3.height="+string(10+long(dwo.height)))
   dw_1.modify("r_3.width=12")
  
  dw_1.modify("r_4.x="+string(10+long(dwo.x)+long(dwo.width)))
  dw_1.modify("r_4.y="+string(l_header_h+8+(row - l_frop)*l_detail_h))
   dw_1.modify("r_4.height="+string(16+long(dwo.height)))
  dw_1.modify("r_4.width=12")
  
  dw_1.modify("r_1.visible=true")
  dw_1.modify("r_2.visible=true")
  dw_1.modify("r_3.visible=true")
  dw_1.modify("r_4.visible=true")

end if
end if

 

解释一下, 里面有2个自定义的函数uf_findprecol() 和uf_findprecol() 顾名思义,就是找到鼠标点到的这一列的前一列和后一列的列id,

因为我这个窗口里的列是要允许用户随意拖动次序的(并且可以保存位置,下次打开还在这个位置).

显示方框的原理就是根据鼠标点的位置判断点在哪一列哪一行,然后可以确定方框的起点的具体位置xpos和ypos

 

自定义的ue_mousemove事件代码

if b_lb_up=false then
//************* mouse move*************
long xxx
if pixelstounits(xpos,XPixelsToUnits! )<long(dw_1.x) + 200 then
 xxx=long(dw_1.Object.DataWindow.HorizontalScrollPosition)
 xxx=xxx - 500
 dw_1.Object.DataWindow.HorizontalScrollPosition=xxx
end if
if pixelstounits(xpos,XPixelsToUnits! )>long(dw_1.width) - 200 then
 xxx=long(dw_1.Object.DataWindow.HorizontalScrollPosition)
 xxx=xxx+500
 dw_1.Object.DataWindow.HorizontalScrollPosition=xxx
end if
if pixelstounits(ypos,YPixelsToUnits! )<long(dw_1.y) + 200 then
 dw_1.setrow(row)
 dw_1.scrollpriorrow()
 //dw_1.scrollpriorpage()
end if
if pixelstounits(ypos,YPixelsToUnits! )>long(dw_1.height) - 300 then
 dw_1.setrow(row)
 dw_1.ScrollNextRow()
 //dw_1.ScrollNextpage()
end if

 

//*************************************

if dwo.type="column" then
long l_width,l_thisid
int i


 l_last_row=row
 l_last_dwoid=long(dwo.id)
 
 
 l_width=long(dw_1.describe("#"+string(l_start_dwoid)+".width"))
 l_thisid=l_start_dwoid
 
 if long(dw_1.describe("#"+string(l_last_dwoid)+".x")) > &
  long(dw_1.describe("#"+string(l_start_dwoid)+".x")) then
  
  for i=1 to 40
   l_thisid=uf_findnextcol(l_thisid)
   l_width=l_width+9+ &
   long(dw_1.describe("#"+string(l_thisid)+".width"))
  if l_thisid=l_last_dwoid then
   exit
  end if
  next
  dw_1.modify("r_1.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
  dw_1.modify("r_2.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
  dw_1.modify("r_3.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x")) - 20))
  dw_1.modify("r_4.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x"))+l_width))
 else
  if long(dw_1.describe("#"+string(l_last_dwoid)+".x")) < &
  long(dw_1.describe("#"+string(l_start_dwoid)+".x")) then
  
  for i =1 to 40
    l_thisid=uf_findprecol(l_thisid)
    l_width=l_width+9+ &
    long(dw_1.describe("#"+string(l_thisid)+".width"))
  if l_thisid=l_last_dwoid then
   exit
  end if
  next
   dw_1.modify("r_1.x="+dw_1.describe("#"+string(l_last_dwoid)+".x"))
   dw_1.modify("r_2.x="+dw_1.describe("#"+string(l_last_dwoid)+".x"))
   dw_1.modify("r_3.x="+string(long(dw_1.describe("#"+string(l_last_dwoid)+".x")) - 20))
   dw_1.modify("r_4.x="+string(long(dw_1.describe("#"+string(l_last_dwoid)+".x"))+l_width)) 
  else
   l_width=long(dw_1.describe("#"+string(l_start_dwoid)+".width"))
   dw_1.modify("r_1.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
   dw_1.modify("r_2.x="+dw_1.describe("#"+string(l_start_dwoid)+".x"))
   dw_1.modify("r_3.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x")) - 20))
   dw_1.modify("r_4.x="+string(long(dw_1.describe("#"+string(l_start_dwoid)+".x"))+l_width))
  end if
 end if
 
 if l_last_row>=l_start_row then
  dw_1.modify("r_1.y="+string(l_header_h - 10+(l_start_row - l_frop)*l_detail_h))
  dw_1.modify("r_2.y="+string(l_header_h+8+(l_last_row - l_frop + 1)*l_detail_h))
  dw_1.modify("r_3.y="+string(l_header_h+8+(l_start_row - l_frop )*l_detail_h))
  dw_1.modify("r_4.y="+string(l_header_h+8+(l_start_row - l_frop)*l_detail_h))
 else
  dw_1.modify("r_1.y="+string(l_header_h+8+(l_start_row - l_frop + 1)*l_detail_h))
  dw_1.modify("r_2.y="+string(l_header_h - 10+(l_last_row - l_frop)*l_detail_h))
  dw_1.modify("r_3.y="+string(l_header_h+8+(l_last_row - l_frop)*l_detail_h))
  dw_1.modify("r_4.y="+string(l_header_h+8+(l_last_row - l_frop)*l_detail_h))
 end if
 
 dw_1.modify("r_1.width="+string(l_width))
 dw_1.modify("r_2.width="+string(l_width))
 
 dw_1.modify("r_3.height="+string((abs(l_last_row - l_start_row) + 1)*l_detail_h))
 dw_1.modify("r_4.height="+string((abs(l_last_row - l_start_row) + 1)*l_detail_h))
 
end if
end if

 

判断鼠标移动到的行和列, 把方块的大小调整过去. 关键是鼠标上下拖动的比较大,出现翻页的处理. 还有左右拖动出现窗口水平滚动的问题.

不要以为数据窗口里的对象不会画到控件外面去哦, 呵呵, 这也算是个bug吧

 

自定义的ue_rb_up事件代码

b_lb_up=true
if b_rec_up=true then
dw_1.modify("r_5.x="+dw_1.describe("r_1.x"))

if long(dw_1.describe("r_1.y"))<=long(dw_1.describe("r_2.y")) then
 dw_1.modify("r_5.y="+string(long(dw_1.describe("r_1.y"))+16))
else
 dw_1.modify("r_5.y="+string(long(dw_1.describe("r_2.y"))+16))
end if
dw_1.modify("r_5.width="+dw_1.describe("r_1.width"))
dw_1.modify("r_5.height="+dw_1.describe("r_3.height"))
dw_1.modify("r_5.visible=true")
end if
//messagebox("!",string(l_start_dwoid)+">>"+string(l_start_row)+">>"+string(l_last_dwoid)+">>"+string(l_last_row))

 

这个就很简单了,处理一下鼠标弹起的标志和方块对象的状态.

 

下次讲复制和粘贴excel表里的数据