我已将JvTreeView.CheckBoxes
设置为True
,并显示复选框并按预期工作,但在Windows XP SP3及更低版本中,OnNodeCheckedChange
事件未被触发。我用Google搜索了一下,发现this issue on JVCL issue tracker,但我无法将其应用到最新的JVCL版本(版本3.47)。有没有人修复复选框事件?
更新:当我使用空格键更改复选框时会触发该事件,但是当我在复选框上单击时不会触发该事件。
答案 0 :(得分:3)
从discussion
开始,我知道您已经为JvTreeView
使用了RTL阅读,我补充说您还应该将TVS_RTLREADING
样式包含在控件样式中。所以,这里是如何在后期控件样式(你已经使用过)中做到这一点:
procedure TForm1.FormShow(Sender: TObject);
begin
SetWindowLong(JvTreeView1.Handle, GWL_STYLE, GetWindowLong(
JvTreeView1.Handle, GWL_STYLE) or TVS_RTLREADING);
SetWindowLong(JvTreeView1.Handle, GWL_EXSTYLE, GetWindowLong(
JvTreeView1.Handle, GWL_EXSTYLE) or WS_EX_LAYOUTRTL or WS_EX_RIGHT);
end;
控制通知的问题在坐标映射中(参见this answer
为什么会发生)。作为JvComCtrls.pas
来源的修补程序,您可以使用以下内容替换第3094行上的ScreenToClient
点映射:
MapWindowPoints(0, Handle, Point, 1);
在CNNotify
方法的JvComCtrls.pas
单元中,它将如下所示:
3071 procedure TJvTreeView.CNNotify(var Msg: TWMNotify);
.... ...
3091 inherited;
3092 if Windows.GetCursorPos(Point) then
3093 begin
3094 MapWindowPoints(0, Handle, Point, 1);
3095 case Msg.NMHdr.code of
.... ...