SDL中文论坛

标题: 数组类控件在切换单元时的通知序列 [打印本页]

作者: ancientcc    时间: 2016-11-7 19:51
标题: 数组类控件在切换单元时的通知序列
本帖最后由 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


几个结论


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

作者: ancientcc    时间: 2017-2-27 15:28
本帖最后由 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。




欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3