JvTreeView和JvCheckTreeView复选框通知

时间:2012-10-21 09:04:05

标签: delphi delphi-xe2 jvcl

我已将JvTreeView.CheckBoxes设置为True,并显示复选框并按预期工作,但在Windows XP SP3及更低版本中,OnNodeCheckedChange事件未被触发。我用Google搜索了一下,发现this issue on JVCL issue tracker,但我无法将其应用到最新的JVCL版本(版本3.47)。有没有人修复复选框事件?


更新:当我使用空格键更改复选框时会触发该事件,但是当我在复选框上单击时不会触发该事件。

1 个答案:

答案 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
....  ...