如何在Grid中响应鼠标移动事件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Grid中响应鼠标移动事件相关的知识,希望对你有一定的参考价值。
最近写一个小软件,GUI是用wxPython做的,有一个功能需要捕获鼠标在Grid控件上的移动事件。我先在Boa Constructor中拖出一个Grid原型来做测试,发现很容易,只要grid.Bind(wx.EVT_MOTION, self.OnGridMotion) 就可以了,但是
移植到软件中去之后,死活无法响应,百思不得其解。
不断的尝试之下,总算发现了当Grid还没有创建网格的时候(也就是还没有CreateGrid或者SetTable的时候),是可以直接响应wx.EVT_MOTION的,但是一旦创建了网格之后就不行了。我猜测(没有Python的源码,只有C++的,懒得看了)应该是由于wxPython那不同寻常的设计方法,网格的窗口也能单独管理,由于网格挡住了Grid,所以抢先于Grid接受到wx.EVT_MOTION,而wx.EVT_MOTION不属于CommandEvent,因此不能传递给Grid。
问题找到了,我相信一定可以解决,只是苦于wxPython的资料太少。在网上寻觅2个小时后突然发现了一篇文章之中用到GetGridColLabelWindow 这个函数。眼前一亮,能得到Window不就可以操作了嘛。赶紧查wxPython API,果然有以下4个函数:
GetGridColLabelWindow(self)
GetGridCornerLabelWindow(self)
GetGridRowLabelWindow(self)
GetGridWindow(self)
其中我只要用最后一个,于是我重新绑定一下:
gridWin = self.grid1.GetGridWindow()
gridWin.Bind(wx.EVT_MOTION, self.OnGrid1Motion)
测试,OK!
wxPython + python的开发真是很爽,但没有文档也真的很头痛。希望这篇文章能为遇到相同情况的人一点帮助。 参考技术A <html>
<head>
<title>Debug Console</title>
<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="debug.css" />
<!-- GC -->
<!-- LIBS -->
<script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
<!-- ENDLIBS -->
<script type="text/javascript" src="../../ext-all.js"></script>
<script type="text/javascript">
Ext.onReady(function()
var cm = new Ext.grid.ColumnModel([
header:'编号',dataIndex:'id',width:35,
header:'名称',dataIndex:'name',width:80,
header:'描述',dataIndex:'descn',width:120
]);
var data = [
['1','name1','descn1'],
['2','name2','descn2'],
['3','name3','descn3'],
['4','name4','descn4'],
['5','name5','descn5']
];
var store = new Ext.data.Store(
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader(, [
name: 'id',
name: 'name',
name: 'descn'
])
);
store.load();
var grid = new Ext.grid.GridPanel(
autoHeight: true,
renderTo: 'grid',
store: store,
cm: cm,
viewConfig:
forceFit: true
);
grid.on('mouseover',function(e)//添加mouseover事件
var index = grid.getView().findRowIndex(e.getTarget());//根据mouse所在的target可以取到列的位置
if(index!==false)//当取到了正确的列时,(因为如果传入的target列没有取到的时候会返回false)
var record = store.getAt(index);//把这列的record取出来
var str = Ext.encode(record.data);//组装一个字符串,这个需要你自己来完成,这儿我把他序列化
var rowEl = Ext.get(e.getTarget());//把target转换成Ext.Element对象
rowEl.set(
'ext:qtip':str //设置它的tip属性
,false);
);
var win = new Ext.Window(
id:'window',
el:'window-win',
layout:'fit',
width:500,
height:270,
closeAction:'hide',
items: [grid]
);
win.show();
Ext.QuickTips.init();//注意,提示初始化必须要有
);
</script>
</head>
<body>
<div id="window-win">
<div id="grid"></div>
</body>
</html>
--------------------------------------------------------------本回答被提问者采纳
MFC中如何让静态控件响应鼠标移动的消息?
我想在静态文本控件中显示3D图形(用OGRE渲染),于是我自定义了继承CWnd的CMyModule类,并且在CMyModule中已经写了响应WM_MOUSEMOVE消息的处理函数。我在对话框模板中拖入了静态文本控件。然后把这个控件关联我的自定义类,现在已经能在对话框的静态控件中显示3D图像了,现在的问题是当鼠标移动到静态控件时还是不能响应我的消息函数,不能移动图形。本人菜鸟,请高手指点。
我曾经在SDI工程下的View中能显示3D图形并且也能够响应鼠标的移动消息。
还有,在鼠标的响应函数中,放一些TRACE宏,输出点内容,看看是否的确没有进入鼠标消息响应。 参考技术A 你在你的OnLButtonDown方法里设置个断点,调试下看看鼠标消息是否能得到响应 参考技术B WM_MOUSEMOVE
一般情况下,鼠标移动是不能拖动图形的,一定要和leftbuttondown或 rightbuttondown联合使用。
某个键按下时,同时移动鼠标,同时捕捉这两个消息,然后处理图形移动。追问
在CMyModule中我也已经写了
void CMyModule::OnLButtonDown(UINT nFlags, CPoint point)
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_mouseLast = point;
CWnd::OnLButtonDown(nFlags, point);
在自己的类里面,得到消息后要自己处理,就是重新画图。不能用缺省的处理。
本回答被提问者采纳以上是关于如何在Grid中响应鼠标移动事件的主要内容,如果未能解决你的问题,请参考以下文章