这里主要是稍微修改下MiniGUI的一些控件源代码,以达到我们的一些要求。我总觉MiniGUI的ListView控件没有网格线,不怎么好看,于是这里就教大家如何给MiniGUI的ListView控件加上网格线的功能。 这里是给ListView新加功能,要尽量不影响其原有的功能,也不要影响应用软件的使用。所以这里我把这个新增的功能做成一个开关,想要网格线的就打开,同时做一些相关的设置;不想要的就保持原有的样子,这样也不用修改应用软件的代码。这里要改的文件是libminigui路径下的/ext/include/ext/listview.h、/ext/control/listview.c(给个小技巧,建议在自己修改过的代码前面加上一些便于编辑器查找的注释;例如我在修改过的地方都加上了”// alai”的注释,这样以后我只要搜索”alai”,就能找到我改过哪些地方了)。
1:新增网格线开关
开关我使用风格来提供:
- listview.h:
-
- // ********************************************************
- // alai by mingming 2013.06.19
- // \def LVS_GRID
- // \listview will show the gird line.
- //
- // Causes the listview show the gird line.
- //
- #define LVS_GRID 0x0004L
-
- // ********************************************************
建议把代码加在源代码风格定义的地方,这样代码比较有条理性。为什么是0x0004L,那是因为原来的控件风格变量的低16bit正好留下0x0004L这个位置,我们这个网格开关正好补上(有关MiniGUI控件的一些开发技巧,我之前的教程有介绍,如果对这方面不怎么了解的建议先去看看)。
2:新增网格设置接口
- listview.h:
-
- // ********************************************************
- // alai by mingming 2013.06.19
- // \def LVM_SETGRIDSTYLE
- // \brief Sets the grid style: pen line color, pen line style.
- // I want to use the listview's own draw func though the listview control have LVM_SETCUSTOMDRAW message.
- // So I add this function to the listview control.
- //
- // \code
- // LVM_SETGRIDSTYLE
- // gal_pixel unColor;
- // int nPenStyle;
- //
- // wParam = (WPARAM)unColor;
- // lParam = (LPARAM)nPenStyle;
- // \endcode
- //
- // \return Always returns 0.
- //
- #define LVM_SETGRIDSTYLE 0xF144
-
- // ********************************************************
-
- #define LVGS_DASH 0x0001
- #define LVGS_GRID 0x0002
也是建议放在源代码消息接口定义的地方。listview原有的最后一个消息定在0xF133,所以这里就顺势加下去。这里我主要考虑,网格首先可以设置网格线的颜色,然后可以设置网格线的样式。颜色就不多说了,传入pixel值。样式这里我设计了2种样式,一种是虚线形式,一种是实线形式;当然大家可以根据自己的喜好,多弄几种。
实现方式,我把设置设计成类变量,就是当前所有的listview实例的网格线设置都是一致的。当然也可以弄成实例变量,不过这要多改一个文件里的内容,呵呵这个留给大家自己去研究了。类变量,就是定义成文件范围的变量:
- listview.c:
-
- // ********************************************************
- // alai by mingming 2013.06.19
-
- static gal_pixel unGridColor;
- static int nGridStyle;
-
- // ********************************************************
实现代码:
- listview.c:
-
- static int ListViewCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
-
- // ********************************************************
- // alai by mingming 2013.06.19
- case LVM_SETGRIDSTYLE:
- {
- unGridColor = (gal_pixel)wParam;
- nGridStyle = (int)lParam;
-
- InvalidateRect (hWnd, NULL, TRUE);
- return 0;
- }
- // ********************************************************
这段代码要放在listview的过程处理函数的swtich(message)里。主要设置类变量的值。
3:新增绘制网格代码
- listview.c:
-
- static void lvDrawSubItem (HWND hWnd, PLVDATA plvdata, HDC hdc, PITEMDATA pItem, RECT *rcItem, int nCols)
-
- ... ...
- LV_GET_SUBITEM_RECT(rcItem, nCols, rect);
- ... ...
-
- // ********************************************************
- // alai by mingming 2013.06.19
-
- RECT rcCell;
-
- rcCell.left = rect.left;
- rcCell.right = rect.right;
- rcCell.top = rect.top;
- rcCell.bottom = rect.bottom;
-
- // ********************************************************
-
-
- // ********************************************************
- // alai by mingming 2013.06.19
- // grid style
-
- if ( GetWindowStyle(hWnd) & LVS_GRID )
- {
- SetPenColor (hdc, unGridColor);
- if ( nGridStyle & LVGS_DASH )
- {
- DrawHDotLine (hdc, rcCell.left, rcCell.bottom, rcCell.right-rcCell.left);
-
- if ( nGridStyle & LVGS_GRID )
- {
- DrawVDotLine (hdc, rcCell.right, rcCell.top, rcCell.bottom-rcCell.top);
- }
- }
- else
- {
- LineEx (hdc, rcCell.left, rcCell.bottom, rcCell.right, rcCell.bottom);
-
- if ( nGridStyle & LVGS_GRID )
- {
- LineEx (hdc, rcCell.right, rcCell.top, rcCell.right, rcCell.bottom);
- }
- }
-
- } // end if()
-
- // ********************************************************
代码放在源代码绘制子项目的函数里:lvDrawSubItem()。注意,获取子项目单元格的区域大小的代码,要放在LV_GET_SUBITEM_RECT(rcItem, nCols, rect);之后。这个先是判断当前listview实例是否开启了网格线功能,然后根据当前的设置,绘制不同的网格线。
最后改好后,重新编译、安装libminigui。这里又给出一个小技巧,这里只改了listview这一个控件而已,MiniGUI的源代码是分模块的,listview控件属于ext(扩展控件库)模块。所以只要进入到ext下make、make install就行了,这样只会重新编译、安装ext库的内容。速度比完全编译MiniGUI快很多。重新编译、安装好libminigui后,把应用软件加上相应的风格和接口,然后编译、运行可以得到如下效果,左边是修改过的,右边是原来的:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。