SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4358|回复: 1
打印 上一主题 下一主题

[gui2] 数组类控件在切换单元时的通知序列

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2016-11-7 19:51:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2016-11-7 21:46 编辑

数组类控件是指包含多个相似单元的控件,具体是列表(listbox)、报表(report)和树形视图(treeview)。用户在用这类控件常发生一种动作:在各单元中切换,这里描述在切换单元时,它们会发出何样的通知序列。

Windows下的通知序列
在整体逻辑上,rose借签Windows。下面小结列表视图在各操作下发出的通知。
  1. #define LVN_FIRST               (0U-100U)
  2. #define LVN_LAST                (0U-199U)
复制代码


左键单击某一单元(列表控件没焦点)
通知码名称
-16NM_RELEASEDCAPTURENotifies a control's parent window that the control is releasing mouse capture
-100LVN_ITEMCHANGING返回true会阻止切换,即不再会有以下通知,false允许切换
-101LVN_ITEMCHANGED
-12NM_CUSTOMDRAW
-7NM_SETFOCUS
-2NM_CLICK单击
-12NM_CUSTOMDRAW
-8NM_KILLFOCUS失去焦点


单击某一单元,之前已选定该单元
通知码名称
-16NM_RELEASEDCAPTURE
-100LVN_ITEMCHANGING
-2NM_CLICK单击


双击某一单元(列表控件没焦点)
通知码名称
-16NM_RELEASEDCAPTURE
-100LVN_ITEMCHANGING
-101 LVN_ITEMCHANGED
-12NM_CUSTOMDRAW
-7NM_SETFOCUS
-2NM_CLICK单击(还是发)
-16NM_RELEASEDCAPTURE
-3NM_DBLCLK双击
-12NM_CUSTOMDRAW
-8NM_KILLFOCUS


双击某一单元,之前已选择该单元
通知码名称
-16NM_RELEASEDCAPTURE
-100LVN_ITEMCHANGING
-2NM_CLICK单击
-16NM_RELEASEDCAPTURE
-3NM_DBLCLK双击
-12NM_CUSTOMDRAW
-8NM_KILLFOCUS


右键某一单元(列表控件没焦点)
通知码名称
-16NM_RELEASEDCAPTURE
-100LVN_ITEMCHANGING
-101LVN_ITEMCHANGED
-12NM_CUSTOMDRAW
-7NM_SETFOCUS
-5NM_RCLICK右击


右键某一单元,之前已选择该单元
通知码名称
-16NM_RELEASEDCAPTURE
-100LVN_ITEMCHANGING
-5NM_RCLICK右击


是代码导致的改变单元时,像用以下语句。
  1. ListView_SetItemState(GetDlgItem(hdlgP, lpNMHdr->idFrom), 4, 0, LVIS_SELECTED);
复制代码

通知码名称
-100LVN_ITEMCHANGING接下没发LVN_ITEMCHANGED


几个结论
  • 一旦要发生切换,首先会发LVN_ITEMCHANGING,如果app判断当前不可切换,需要返回true以阻止切换,接下就不会再收到通知了。返回false则允许切换,接下就会收到LVN_ITEMCHANGED。
  • 不必发生切换时(击中的单元是正选中单元),Windows依旧会发LVN_ITEMCHANGING。我不明白此时为什么要发,Rose去掉它了,即不必发生切换时不再发LVN_ITEMCHANGING。
  • 双击操作在发双击前会发单击通知。
  • 代码导致的切换时,发会LVN_ITEMCHANGING,但不会发LVN_ITEMCHANGED。即不管什么导致的切换都会发LVN_ITEMCHANGING,它返回true都将阻止切换。
  • 分三类通知,1)切换相关,2)单击相关,3)焦点相关。
    切换相关。LVN_ITEMCHANGING、LVN_ITEMCHANGED。
    焦点相关。NM_SETFOCUS、NM_KILLFOCUS。
    单击相关。NM_CLICK、NM_DBLCLK、NM_RCLICK。
    在顺序上,首先发送切换,然后是焦点,接下是单击。


如何处理通知
Windows是用一个回调函数,然后“所有”通知都导入这函数。Rose处理方法也是回调,不同于Windows,它由特定函数处理特定通知。
回复

使用道具 举报

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
沙发
 楼主| 发表于 2017-2-27 15:28:16 | 只看该作者
本帖最后由 ancientcc 于 2017-2-28 20:33 编辑

所有函数原型、回调都使用bind、function机制。

toggle_panel
函数原型设置函数描述
void (ttoggle_panel&, const bool enter)set_did_mouse_enter_leave鼠标进入或离开控件,第二个参数是true时表示进入,false时表示离开。只会用界面行为触发。


listbox
函数原型设置函数描述代码是否能触发
void (tlistbox&, ttoggle_panel&, const bool enter)set_did_row_focus_changed行获得焦点、行失去焦点不能
bool (tlistbox& list, ttoggle_panel& widget)set_did_row_pre_change是否允许该行切换为选中(如果该行已在选中,不会发此消息)。返回true,允许改变;false阻止改变
void (tlistbox& list, ttoggle_panel& widget)set_did_row_changed该行已进入选中状态(如果该行已在选中,不会发此消息。系统没有失去选中的消息)select_row(, true)第二个参数from_ui=true时,能
void (tlistbox& list, ttoggle_panel& widget, const int type)set_did_row_click在该行上发生单击(该行已选中也会发)不能
void (tlistbox& list, ttoggle_panel& widget)set_did_row_double_click在该行上发生双击(该行已选中也会发)不能


tree_view
函数原型设置函数描述代码是否能触发
void (ttree_view& view, ttree_view_node& node)set_did_item_changed该单元已进入选中状态(如果该单元已在选中,不会发此消息。系统没有失去选中的消息)不能


listbox、tree_view、report共同点。did_row_changed/did_item_changed:该单元已进入选中状态(如果该单元已在选中,不会发此消息。系统没有失去选中的消息)。did_row_click/did_item_click:在该行上发生单击(已在选中也会发)。did_row_changed没有单击类型参数,要知道类型只能通过did_row_click。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 00:48 , Processed in 0.053369 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表