用控件聚合技术为FlexGrid增添PickList功能

2016-01-29 12:42 30 1 收藏

用控件聚合技术为FlexGrid增添PickList功能,用控件聚合技术为FlexGrid增添PickList功能

【 tulaoshi.com - C语言心得技巧 】

  前言

  在对数据库进行数据录入时,PickList功能能极大的方便用户,在dELPHI程序中的DBgrid控件就直接提供了PickList功能,但VB和VC下的DBgrid和MSFlexGrid却没有提供相应的功能,FlexGrid甚至连直接编辑网格的能力都没有提供。经过笔者的探索,在VC++下通过标准控件和ActiveX控件相聚合的技术成功地为FlexGrid控件增加了编辑和PickList的能力,使之成为真正功能强大的网格控件。

  方案设计

  由于FlexGrid控件不允许对网格单元进行编辑,因此如果要在其上实现PickList功能就首先要有一组合框来与其配合共同实现该功能:在鼠标或光标(即当前焦点)移到FlexGrid的某个网格时,通过事件响应来激发组合框的显示,并且要求组合框在位置、大小等方面与FlexGrid的当前网格完全重合。显示的组合框的当前值为其所在网格原先的取值,在用户通过鼠标完成对内容的选择后再将用户的选择结果输送回网格。而一旦该网格不再需要编辑(即失去焦点)时组合框应当隐藏。从整个设计过程来看,FlexGrid并不是直接同用户进行交互的,而是通过组合框的中介来完成的。FlexGrid只负责数据的显示和组织,PickList功能是由动态显示的组合框来完成。用户丝毫不会意识到两个控件的存在,唯一的感觉只会是FlexGrid控件增添了PickList功能。

  控件聚合的过程中有两个地方是比较关键的,也是程序实现的重点:一个是当鼠标点击网格单元时,能通过事件的触发在网格上覆盖一个与其等大的组合框,并完成网格数据向组合框的传送;另一点是当用户完成对组合框内容的选择后能将组合框从当前位置隐藏,并将用户选择的结果返回与其对应的网格单元。

  编码实现

  在进行程序编码之前首先要通过添加组件和控件的方式向程序中添加FlexGrid控件,Visual Studio 提供有此控件--Microsoft FlexGrid Control, version 6.0。由于在程序中需要准确地将组合框同网格控件的单元格相聚合,因此手工拖动FlexGrid到对话框是无法同组合框准确定位的,因此需要通过SetWindowPos()函数在像素级上动态设定网格控件在对话框中的具体位置:

//获取客户区矩形
CRect rcBounds;
GetClientRect(&rcBounds);
//设定FlexGrid控件在对话框中的位置和大小
m_ctlMSFlexGrid.SetWindowPos(&wndTop,rcBounds.left,rcBounds.top,rcBounds.Width(),
   rcBounds.Height(),NULL);
  用来接受用户输入的组合框控件在程序运行之初,如果用户进行输入操作,是不显示的,只有在用户发出鼠标单击的消息需要进行编辑时才将其显示,因此需要将组合框控件的初始属性设为不可见。通过前面的方案设计可以看出,整个操作的全过程无非是对鼠标和焦点的消息响应和处理。通过FlexGrid控件响应鼠标单击的事件可以得知用户是否进行编辑操作,并在捕获到该操作后,通过对消息的响应完成用户输入信息从组合框到网格单元的复制:

//对FlexGrid控件的单击响应
BEGIN_EVENTSINK_MAP(CFlexGridDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CFlexGridDlg)
ON_EVENT(CFlexGridDlg, IDC_MSFLEXGRID, -600 /* Click */, OnClickMsflexgrid, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
……
//鼠标单击消息的响应处理
//计算被选中的单元格的坐标,以便组合框能恰好与之吻合
long lRow = m_ctlMSFlexGrid.GetRowSel();
long lCol = m_ctlMSFlexGrid.GetColSel();
……
// MSFlexGrid 控件的函数的长度单位是"缇(twips)",
//需要将其转化为像素,1440 缇 = 1 英寸
int nTwipsPerDotX = 1440 / pDC->GetDeviceCaps(LOGPIXELSX) ;
int nTwipsPerDotY = 1440 / pDC->GetDeviceCaps(LOGPIXELSY) ;
……
//将缇转换为像素
long lCellWidth = m_ctlMSFlexGrid.GetCellWidth()/ nTwipsPerDotX;
long lCellHeight = m_ctlMSFlexGrid.GetCellHeight()/ nTwipsPerDotY;
long lCellLeft = m_ctlMSFlexGrid.GetCellLeft() / nTwipsPerDotX;
long lCellTop = m_ctlMSFlexGrid.GetCellTop() / nTwipsPerDotY;

  在完成对网格单元的坐标计算及转换后,需要动态调整组合框的坐标位置及大小,使其能与当前网格单元相配,同时把焦点由当前的网格单元转移到组合框上,从而实现两控件的聚合:

//设置组合框坐标
m_ctlPickList.SetWindowPos(&wndTop,lCellLeft,lCellTop,lCellWi

来源:http://www.tulaoshi.com/n/20160129/1487223.html

延伸阅读
标签: PS PS教程
本例中我们介绍一种简单方法,用Photoshop一尊普通的大理石雕像增添光照金属质感。 完成效果: 在Photoshop打开原图之后,在原图层上新建一个图层,然后进行渐变填充,效果如下: 改图层模式: 建立一个选区: 复制红通道: 按Ctrl+L调整色阶: 按Ctrl点击得到选区: 按Ctr...
标签: 花卉
金边瑞香是最好的瑞香花品种,花色美、花期长、花味香,是很名贵的花卉品种,金边瑞香的作用比较多,下面小编给大家一一介绍: 金边瑞香的作用: 金边瑞香的作用:1、观赏 金边瑞香有很高的观赏价值,树姿优美,枝条苍劲曲伸自然,叶片整齐光亮,青翠浓绿,花香浓郁,花期较长,是一种姿、色、香、韵...
标签: PHP
此文章原文转自:http://blog.csdn.net/guoguo1980/archive/2006/08/18/1095523.aspx 此文章作者: guoguo1980   【导读】想象使用一个简单HTML文件来把一个请求发送到一个服务器端脚本,收到一个基于该请求的定制XML文件,然后把它显示给用户而几乎不需要刷新浏览器!本文作者将同你一起探讨怎样在普通Web应用程序中...
dna聚合酶 dna聚合酶的功能与分类 dna聚合酶是可以复制细胞DNA的一种重要作用酶。那dna聚合酶有什么功能呢?dna聚合酶的分类又有哪些呢?相信有许多人都是不知道的,不过没关系,今天图老师小编就来为大家一一解答一下。想知道的朋友不妨就来看一下吧。 dna聚合酶功能 dna聚合酶有哪些功能呢?对于很多人来说,dn...
一、引入Dialog技术 下面介绍在制作ActiveX控件时引入有模式对话框技术,制作步骤如下: 创建一新的MFC ActiveX ControlWizard项目,取名为Hello,其他用缺省选项; 在ResourceView页中新增一对话框资源,命名为IDD_HELLODIALOG,可以在对话框上放自己的控件; 为对话框资源IDD_HELLODIALOG创建新...

经验教程

367

收藏

64
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部