2

我已将 a 设置JvTreeView.CheckBoxesTrue,复选框显示并按预期工作,但在 Windows XP SP3 及更低版本上,OnNodeCheckedChange不会触发该事件。我用谷歌搜索了一下,在 JVCL 问题跟踪器上发现了这个问题,但我无法将它应用到最新的 JVCL 版本(版本 3.47)。有没有人修复复选框事件?


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

4

1 回答 1

3

discussion我们了解到的情况下,我知道您已经使用 RTL 阅读,JvTreeView并且我补充说您还应该将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源的修复,您可以将第ScreenToClient3094 行的点映射替换为以下内容:

MapWindowPoints(0, Handle, Point, 1);

在方法的JvComCtrls.pas单元中,CNNotify它看起来像:

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
....  ...
于 2012-10-22T19:54:09.487 回答