最后的效果如下:
效果如上图, 眼神好的已经看出来了, 边框其实就是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! )
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! )
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表里的数据