Щелчок правой кнопкой мыши (всплывающее меню) не работает при изменении направления дерева в команде SetWindowLong

Когда я использую команду 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;

2 ответа

Стандартный способ сделать это - использовать Delphi. BiDiMode имущество. Лучше всего сделать это так, чтобы VCL знал, что вы хотите справа налево. Вам нужно изменить BiDiMode свойство во всплывающем меню тоже.

Теперь правильный способ сделать это - не изменять свойства отдельных компонентов. Делать это таким образом трудоемко и очень подвержено ошибкам. Задавать Application.BiDiMode где-то в инициализации вашего приложения, и изменения будут распространяться на все ваши компоненты.

Например, вы можете внести изменения в файл.dpr вашего приложения:

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

Вы должны убедиться, что вы не изменили ни одного компонента BiDiMode или же ParentBiDiMode в любом файле.dfm. Если вы просто удалите эти строки из вашего файла.dfm, и это позволит широкое приложение Application.BiDiMode настройка, чтобы контролировать все.


Ваш подход к настройке GWL_EXSTYLE проблематично. VCL контролирует эту настройку, и если вам нужно ее изменить, сделайте это в TForm.OnShow приведет к странным ошибкам. Иногда нужно заново создавать окна, и когда это происходит, ваш код для установки GWL_EXSTYLE не будет работать, и ваш вид дерева вернется слева направо. Если вам нужно изменить стили окна, то вам нужно переопределить TWinControl.CreateParams для компонента. Однако в этом случае VCL имеет прямую поддержку BiDi, и это лучшее решение.

Это альтернативное решение для показа TPopupMenu в этом случае

1- Использование OnMouseDown Событие

2- Напишите этот код, чтобы отобразить TPopupMenu при нажатии правой кнопки мыши.

 var
  pt : TPoint;

  begin
  pt := Mouse.CursorPos;

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

Удачи!

Другие вопросы по тегам