Щелчок правой кнопкой мыши (всплывающее меню) не работает при изменении направления дерева в команде 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);
Удачи!