Tabular型DW改变列标题宽度的设计思路,欢迎大家讨论
Tabular型DW改变列标题宽度的设计思路,欢迎大家讨论
兄弟现在做的程序中设计到了Tabular型DW改变列标题宽度的问题
目前的解决方案如下(目前只适用于我自己的程序,不是很通用,但照着改改应该能搞定):
由于我程序中使用的用户录入DW均是由程序动态生成的
(暂时先说只有一层列标题即最简单的类似于GRID的DW,多层、有组合的DW的处理方法正在研究中)
所以可以预知所有列的初始化位置、宽度
我做了一个结构对象,结构为:X、WIDTH,用来保存每列的位置、宽度信息
在创建DW时,为每一列创建一个垂直LINE对象,放置在HEADER BAND中
位置为对应列的右侧,设置PEN.STYLE=5,HEIGHT=HEADER BAND HEIGHT,Y=0,POINTER=SizeWS!
设置PEN.STYLE=5的目的是为了使这条新增的线不可见单鼠标移动到其上时能够改变关闭形状
主要是考虑到不能影响界面效果
在DW对象的实例变量中定义:
Boolean ib_ClickedOnLine = FALSE //是否点击到线上
Long il_ClickedLineNo = 0 //当前点击线对应列号
Long il_OldX = 0 //上一次鼠标移动位置
Long il_ColumnCount = 0 //当前DW中可以移动列总数
Gstr_GridInfo istr_GridInfo[] //列位置、宽度信息保存用结构
在程序创建DW过程中,填写:il_ColumnCount和istr_GridInfo中信息
在DW对象中添加用户事件:pbm_lbuttondown(使用pbm_dwnlbuttondown亦可以)用户处理鼠标点击事件
在其中判断当前鼠标点击对象是否是列分割线
如果是则获取当前分隔线对应列号,保存到il_ClickedLineNo
修改ib_ClickedOnLine = TRUE
设置il_OldX = 0
设置当前DW的Pointer=SizeWS!(可以使用:THIS.Object.DataWindow.Pointer = 'SizeWE!'实现)
在DW对象中添加用户事件:pbm_dwnmousemove用以处理鼠标移动事件
判断如果当前鼠标已经点击分隔线(ib_ClickedOnLine = TRUE)则
如果当前鼠标位置小于当前分隔线对应列X值+20(这个值可以根据需要自行设定,不过太小了程序容易判断出错)则返回 //列宽度不能小于0
获取当前DW高度并换算为象素点
获取当前DW的上下文(ll_dc = GetDC(Handle(THIS)) //GetDC是用来获取指定句柄对象的上下文用的API函数)
设置当前绘图模式为R2_NOTXORPEN//10
使用:SetROP2(ll_dc,10) //SetROP2是设置指定设备的绘图模式用的API函数
判断当前il_OldX是否不等于0(目的是为了区别于第一次绘制分隔线)
如果不等于则
绘图原点移动到il_OldX位置,使用MoveToEx(ll_dc,il_OldX,0,0) //MoveToEx是用来移动绘图原点用的API函数
绘制分隔线,使用LineTo(il_dc,il_OldX,当前DW高度换算为象素点后高度) //LineTo是用来从绘图原点到指定位置间绘制一条直线用的API函数
绘图原点移动到鼠标当前位置位置,使用MoveToEx(ll_dc,xpos,0,0)
绘制分隔线,使用LineTo(il_dc,xpos,当前DW高度换算为象素点后高度)
保存当前鼠标位置在il_OldX变量中
释放所获取得上下文 使用 ReleaseDC(Handle(THIS),ll_dc) //ReleaseDC是用来释放由函数GetDC所获取的指定句柄对象的上下文用的API函数)
在DW对象中添加用户事件:pbm_lbuttonup(使用pbm_dwnlbuttonup亦可以)用户处理鼠标点击事件
判断如果当前鼠标已经点击分隔线(ib_ClickedOnLine = TRUE)则
设置当前DW禁止重绘(THIS.SetRedraw(FALSE))
根据当前il_OldX变量中保存的位置计算当前列的新的宽度
istr_GridInfo[il_ClickedLineNo].Width = il_OldX - istr_GridInfo[il_ClickedLineNo].X
修改当前列及列标题的宽度为istr_GridInfo[il_ClickedLineNo].Width
修改当前列分隔线对象位置为:istr_GridInfo[il_ClickedLineNo].Width + istr_GridInfo[il_ClickedLineNo].X
使用变量ll_Index从il_ClickedLineNo+1到il_ColumnCount循环
修改istr_GridInfo[ll_Index].X = istr_GridInfo[ll_Index - 1].X + istr_GridInfo[ll_Index].Width - 1
修改第ll_Index个列及列标题的x位置为istr_GridInfo[ll_Index].X
修改第ll_Index个列及列标题的宽度为istr_GridInfo[ll_Index].Width
修改第ll_Index个当前列分隔线对象位置为:istr_GridInfo[ll_Index].Width + istr_GridInfo[ll_Index].X
恢复当前DW的光标形状
使用:THIS.Object.DataWindow.Pointer = 'Arrow!'
恢复当前DW重绘:THIS.SetRedraw(TRUE)
设置ib_ClickedOnLine=FALSE
清空当前选中列号il_ClickedLineNo = 0
清空当前鼠标位置il_OldX = 0
到此,程序基本上算是解决这个问题了
运行的效果不错,决不属于PB自己的GRID中的效果(除了速度稍逊外,呵呵,没办法)
这个思路只是兄弟个人的想法
应该有更成熟的办法
希望有经验的同道能不吝赐教
另:多层DW(中国式报表格式)的处理兄弟正在研究中
等有了眉目再补充
烟抽光了,还是不困,怎么办呢。。。。。
找出我的莫赫烟,大炮卷起来。。。。。
继续研究
8-)