Tabular型DW改变列标题宽度的设计思路,欢迎大家讨论

Hanson_bati_zhu Hanson_bati_zhu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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-)

...全文

相关推荐

C++预处理器实战:从宏定义到多设备调试工具开发

C++预处理器是编译过程中的关键阶段,它在编译器解析语法之前对源代码进行文本替换、条件编译和文件包含等操作。其核心原理在于根据预处理指令生成最终的翻译单元,为后续编译流程奠定基础。这一技术在现代C++工程中具有不可替代的价值,尤其在管理复杂项目配置、实现跨平台兼容性和构建编译期可配置系统方面。通过宏定义、条件编译和#pragma指令等特性,开发者可以高效地控制代码变体、实现轻量级日志系统,并管理多设备、多协议的复杂项目。例如,在开发多设备调试工具时,预处理器能优雅地支持串口、TCP等多种设备协议的编译时配置

weixin_33743880

libevent 1.4在vs下的编译调试

最近想看一下源码,大家都推荐了libevent。libevent1.4.13相对libevent2.0简洁很多,所以就拿他入手了。当然还是边调试边学习好些。以下就是vs2012调试libevnet的方法。 其他vs版本应该也是一样的。1.下载源码 libevent-1.4.13-stable.tar.gz 并解压2.新建vs工程3.\libevent-1.4.13-stable\libevent-...

小小小小小学生

24、探索C++预处理器指令的深度应用

本文深入探讨了C++预处理器指令的应用,包括宏定义、文件包含、条件编译等核心功能,并结合实际案例展示了其在跨平台开发、调试和代码优化中的作用。同时,文章还分析了预处理器指令的局限性及现代C++提供的替代方案,如constexpr和模板元编程,帮助开发者编写更高效、安全和可维护的代码。

garlic

15、探索C编程中的预处理器与命令行参数

本文详细介绍了C编程中的预处理器和命令行参数的使用方法。预处理器部分涵盖了宏定义、条件编译等功能,帮助编写灵活且易于维护的代码;命令行参数部分则通过实际示例展示了如何利用`argc`和`argv`实现动态输入,并提供了调试优化技巧以及高级应用如处理配置文件和环境变量等内容。

s4t5u6v7

C# 预处理器指令及其在Unity引擎开发中的应用总结

在 Unity 中,Shader 的开发中也可以使用预处理器指令,这与 C# 中的条件编译类似,但用于控制渲染代码的逻辑。通过以上总结,你可以更好地理解和运用 C# 预处理器指令,尤其是在 Unity 开发中,根据不同的需求灵活调整代码逻辑,提高开发效率和项目质量。通过灵活运用预处理器指令,结合 Unity 提供的多平台支持工具,可以高效管理项目中的条件编译逻辑,同时保持代码的可维护性和扩展性。在大型 Unity 项目中,预处理器指令的灵活运用不仅可以控制代码逻辑,还能优化项目的性能和可维护性。

小宝哥Code
评论 15
收藏 已收藏
分享
返回顶部
Hanson_bati_zhu
PowerBuilder 1,111 成员 66,454 内容