Щелчок правой кнопкой мыши (всплывающее меню) не работает при изменении направления просмотра дерева с помощью команды SetWindowLong - PullRequest
3 голосов
/ 24 июня 2011

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

3 голосов
/ 24 июня 2011

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

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

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

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

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


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

0 голосов
/ 16 февраля 2018

Это альтернативное решение для отображения TPopupMenu. В этом случае

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

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

 var
  pt : TPoint;

  begin
  pt := Mouse.CursorPos;

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

Удачи!

...