1、所有对DDDW的操作都通过触发pbm_command事件完成
1)、在PB的用户事件中,大多数事件对应的Windows 事件都有两个参数:lparam 和 wparam,而在PB中,pbm_command没有参数,但可以通过message对象的两个属性取得Windows事件对应的Event ID,这两个属性就是: LongParm 和 WordParm。
LongParm 包含DDDW的Handle,用intLow()可取得其Handle
WordParm 包含对DDDW的操作,用intHigh()可取得其Event ID
2)、在PB中,pbm_command带3个参数,其中hwndchild(long)与notificationcode(unsignedinteger)即DDDW的Handle和Event ID。
2、DDDW 的Event ID 列表:
Event | Event ID | 备注 |
Clicked | 1281 | |
RowFocusChanged | 2048 | |
RightMouseButtonDown | 2314 | |
Left Button Up | 2313 | |
Retreive End | 769 | |
MouseMove | 2311 | |
RowFocusChanged | 2048 | 至于问题中的上下滚动,倘为键盘,将导致行焦点改变(此外,还导致一个ID=2049的事件) |
PageUp/PageDown | 2339 | 鼠标点击滚动条上下按钮 |
3、根据上述列表,就可以在 pbm_command 事件中判断对DDDW做了何种操作:
DataWindowChild ldwc_Child
GetChild( "Column", ldwc_Child )
IF IntLow( Message.Longparm ) = Handle( ldwc_Child ) THEN
CHOOSE CASE IntHigh( Message.Wordparm )
CASE 2048 // RowFocusChanged on DDDW
CASE 1281 // Clicked
CASE 2314 // Right Mouse Button Clicked
CASE 2311 // MouseMove
END CHOOSE
END IF
PB可以直接使用其参数hwndchild、notificationcode代替其中的intLow(Message.LongParm)和intHigh(Message.WordParm)。
一个简单例子 -- 自动选择DDDW
DataWindowChild ldwc_Child
String ls_Pointer
Long ll_Row, ll_Lparam, ll_Lparam
ll_Lparam = Message.LongParm
ll_Lparam = Message.WordParm
GetChild( "status", ldwc_Child ) // Replace the column name "status" as you needed
IF IntLow( ll_Lparam) = Handle( ldwc_Child ) THEN
CHOOSE CASE IntHigh( ll_Lparam )
CASE 2311 // MouseMove
// Get the object at pointer and parse out the Row #
ls_Pointer = ldwc_Child.GetObjectAtPointer()
ll_Row=Long( Mid( ls_Pointer, Pos( ls_Pointer, "~t" ) + 1 ))
// If the Row is different then highlight it
IF ldwc_Child.GetRow() <> ll_Row AND ll_Row > 0 THEN
ldwc_Child.ScrollToRow( ll_Row )
END IF
END CHOOSE
END IF