3

当我使用 SetWindowLong 命令更改树视图的方向时,其节点上的弹出菜单不显示。完整代码在这里:

Procedure SetWinControlBiDi(Control: TTreeView);
 var
  ExStyle: Longint;
 begin

  ExStyle := GetWindowLong(Control.Handle, GWL_EXSTYLE);

  SetWindowLong(Control.Handle, GWL_EXSTYLE, ExStyle or WS_EX_RTLREADING or WS_EX_RIGHT or WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT );

 end;


procedure TMainForm.FormShow(Sender: TObject);
 begin

  SetWinControlBiDi(TreeView1);

 end;
4

2 回答 2

3

执行此操作的标准方法是使用 DelphiBiDiMode属性。最好这样做,以便 VCL 知道您想要从右到左。您还需要更改BiDiMode弹出菜单上的属性。

现在,正确的做法是不要更改单个组件的属性。这样做很费力,而且很容易出错。在应用程序的初始化中设置Application.BiDiMode某处,更改将传播到您的所有组件。

例如,您可以在应用程序的 .dpr 文件中进行更改:

Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.BiDiMode := bdRightToLeft;
Application.CreateForm(TMainForm, MainForm);
Application.Run;

您需要确保您没有修改任何组件BiDiModeParentBiDiMode任何 .dfm 文件。如果您只是从 .dfm 文件中删除了这些行,那么这将允许单个应用程序范围的Application.BiDiMode设置来控制所有内容。


你的设置GWL_EXSTYLE方法有问题。VCL 控制着该设置,如果您确实需要更改它,这样做TForm.OnShow会导致奇怪的错误。有时需要重新创建窗口,当这种情况发生时,您设置的代码GWL_EXSTYLE将无法运行,您的树视图将恢复为从左到右。如果确实需要修改窗口样式,则需要覆盖TWinControl.CreateParams组件。但是,在这种情况下,VCL 直接支持 BiDi,这是最好的解决方案。

于 2011-06-24T09:38:26.877 回答
0

这是显示 TPopupMenu 在这种情况下的替代解决方案

1- 使用OnMouseDown事件

2-编写此代码以在单击鼠标右键时显示​​ TPopupMenu

 var
  pt : TPoint;

  begin
  pt := Mouse.CursorPos;

   if Button = mbRight then
        APopupMenu.Popup(pt.X, pt.Y);

祝你好运 !

于 2018-02-16T20:07:04.957 回答