打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
minigui listview控件修改 | 阿来博客

这里主要是稍微修改下MiniGUI的一些控件源代码,以达到我们的一些要求。我总觉MiniGUI的ListView控件没有网格线,不怎么好看,于是这里就教大家如何给MiniGUI的ListView控件加上网格线的功能。 这里是给ListView新加功能,要尽量不影响其原有的功能,也不要影响应用软件的使用。所以这里我把这个新增的功能做成一个开关,想要网格线的就打开,同时做一些相关的设置;不想要的就保持原有的样子,这样也不用修改应用软件的代码。这里要改的文件是libminigui路径下的/ext/include/ext/listview.h、/ext/control/listview.c(给个小技巧,建议在自己修改过的代码前面加上一些便于编辑器查找的注释;例如我在修改过的地方都加上了”// alai”的注释,这样以后我只要搜索”alai”,就能找到我改过哪些地方了)。

1:新增网格线开关

开关我使用风格来提供:

  1. listview.h:    
  2.   
  3. // ********************************************************   
  4. // alai by mingming 2013.06.19
  5. // \def LVS_GRID   
  6. // \listview will show the gird line.   
  7. //   
  8. // Causes the listview show the gird line.   
  9. //   
  10. #define LVS_GRID                0x0004L   
  11.   
  12. // ********************************************************  

建议把代码加在源代码风格定义的地方,这样代码比较有条理性。为什么是0x0004L,那是因为原来的控件风格变量的低16bit正好留下0x0004L这个位置,我们这个网格开关正好补上(有关MiniGUI控件的一些开发技巧,我之前的教程有介绍,如果对这方面不怎么了解的建议先去看看)。

2:新增网格设置接口

  1. listview.h:    
  2.   
  3. // ********************************************************   
  4. // alai by mingming 2013.06.19  
  5. // \def LVM_SETGRIDSTYLE   
  6. // \brief Sets the grid style: pen line color, pen line style.   
  7. //  I want to use the listview's own draw func though the listview control have LVM_SETCUSTOMDRAW message.   
  8. //  So I add this function to the listview control.   
  9. //   
  10. // \code   
  11. // LVM_SETGRIDSTYLE   
  12. // gal_pixel unColor;   
  13. // int nPenStyle;   
  14. //   
  15. // wParam = (WPARAM)unColor;   
  16. // lParam = (LPARAM)nPenStyle;   
  17. // \endcode   
  18. //   
  19. // \return Always returns 0.   
  20. //   
  21. #define LVM_SETGRIDSTYLE       0xF144   
  22.   
  23. // ********************************************************   
  24.   
  25. #define LVGS_DASH   0x0001   
  26. #define LVGS_GRID   0x0002  

也是建议放在源代码消息接口定义的地方。listview原有的最后一个消息定在0xF133,所以这里就顺势加下去。这里我主要考虑,网格首先可以设置网格线的颜色,然后可以设置网格线的样式。颜色就不多说了,传入pixel值。样式这里我设计了2种样式,一种是虚线形式,一种是实线形式;当然大家可以根据自己的喜好,多弄几种。

实现方式,我把设置设计成类变量,就是当前所有的listview实例的网格线设置都是一致的。当然也可以弄成实例变量,不过这要多改一个文件里的内容,呵呵这个留给大家自己去研究了。类变量,就是定义成文件范围的变量:

  1. listview.c:   
  2.   
  3. // ********************************************************   
  4. // alai by mingming 2013.06.19  
  5.   
  6. static gal_pixel unGridColor;   
  7. static int nGridStyle;   
  8.   
  9. // ********************************************************  

实现代码:

  1. listview.c:    
  2.   
  3. static int ListViewCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)   
  4.   
  5. // ********************************************************   
  6. // alai by mingming 2013.06.19  
  7. case LVM_SETGRIDSTYLE:   
  8. {   
  9.         unGridColor = (gal_pixel)wParam;   
  10.         nGridStyle = (int)lParam;   
  11.            
  12.         InvalidateRect (hWnd, NULL, TRUE);   
  13.         return 0;   
  14. }   
  15. // ********************************************************  

这段代码要放在listview的过程处理函数的swtich(message)里。主要设置类变量的值。

3:新增绘制网格代码

  1. listview.c:    
  2.   
  3. static void lvDrawSubItem (HWND hWnd, PLVDATA plvdata, HDC hdc, PITEMDATA pItem, RECT *rcItem, int nCols)   
  4.   
  5. ... ...   
  6. LV_GET_SUBITEM_RECT(rcItem, nCols, rect);   
  7. ... ...   
  8.   
  9. // ********************************************************   
  10. // alai by mingming 2013.06.19 
  11.   
  12. RECT rcCell;   
  13.   
  14. rcCell.left = rect.left;   
  15. rcCell.right = rect.right;   
  16. rcCell.top = rect.top;   
  17. rcCell.bottom = rect.bottom;   
  18.   
  19. // ********************************************************   
  20.   
  21.   
  22. // ********************************************************   
  23. // alai by mingming 2013.06.19 
  24. // grid style   
  25.   
  26. if ( GetWindowStyle(hWnd) & LVS_GRID )   
  27. {   
  28.         SetPenColor (hdc, unGridColor);   
  29.         if ( nGridStyle & LVGS_DASH )   
  30.         {   
  31.                 DrawHDotLine (hdc, rcCell.left, rcCell.bottom, rcCell.right-rcCell.left);   
  32.                    
  33.                 if ( nGridStyle & LVGS_GRID )   
  34.                 {   
  35.                         DrawVDotLine (hdc, rcCell.right, rcCell.top, rcCell.bottom-rcCell.top);   
  36.                 }   
  37.         }   
  38.         else  
  39.         {   
  40.                 LineEx (hdc, rcCell.left, rcCell.bottom, rcCell.right, rcCell.bottom);   
  41.                    
  42.                 if ( nGridStyle & LVGS_GRID )   
  43.                 {   
  44.                         LineEx (hdc, rcCell.right, rcCell.top, rcCell.right, rcCell.bottom);   
  45.                 }   
  46.         }   
  47.            
  48. }  // end if()   
  49.   
  50. // ********************************************************  

代码放在源代码绘制子项目的函数里:lvDrawSubItem()。注意,获取子项目单元格的区域大小的代码,要放在LV_GET_SUBITEM_RECT(rcItem, nCols, rect);之后。这个先是判断当前listview实例是否开启了网格线功能,然后根据当前的设置,绘制不同的网格线。

最后改好后,重新编译、安装libminigui。这里又给出一个小技巧,这里只改了listview这一个控件而已,MiniGUI的源代码是分模块的,listview控件属于ext(扩展控件库)模块。所以只要进入到ext下make、make install就行了,这样只会重新编译、安装ext库的内容。速度比完全编译MiniGUI快很多。重新编译、安装好libminigui后,把应用软件加上相应的风格和接口,然后编译、运行可以得到如下效果,左边是修改过的,右边是原来的:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
VC编程技术点滴(六)使用ListControl控件显示数据表
Win 8中WPF listview与listBox的Drag、Drop操作
ggplot2笔记8:主题设置、存储导出
ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
VB ListView的使用 - 笔记 - 梅梅 - CSDN学生大本营 - Powere...
duilib进阶教程 -- 改进List控件 (转)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服